2010年9月30日木曜日

サンコーのUSBラジオUSBSWFAM

サンコーのUSBラジオUSBSWFAM
http://www.thanko.jp/product/pc/radio/radio-tanpa.html/

近所の店で¥1,980-で売ってたんだ。この値段なら。即買い。
ソフトはきっとダメそうだけど、たぶんAMFMラジオ録音さんでいけるんじゃね?
http://koukaijo.seesaa.net/
対応してるかどうかは購入時点ではわかんなかったけど、結果オーライ。

でも...FMなのに...なんだこのこもりというか高域の詰まり..。
うんこ決定。ヤフオクで売るか..でもめんどくせーよな...バラスか。

ICは3つ。刻印は
F321 ... Silicon Labs C8051F321
SC1308 ... アンプ
3420 ... 不明

googleすげーな。2つは簡単に判明。

さまよってるうちに次を発見。
http://narc.way-nifty.com/boyaki2005/2010/01/usb-9581.html

"3420"なんて検索してもわかんなかったんだけど、Silicon Labs Si4734でした。

USBオーディオは専用のICかと思ってたんだけど、そんなことないのかね? C8051F321でAD変換してるみたい。
そんな構成だけど、録音さんのページを見てみると、USBホストからは見分けがつかない、これと同じように見える製品が幾つかあるんだって。
http://koukaijo.seesaa.net/article/132094432.html
そういうもんすか。

Si4734までわかればあとは手を動かすだけね。いや、老眼でパタン追うのちょっと辛いな。
- Si4734の出力を外のアンプにつないだら、音は小さいけどうんこじゃない
- SC1308をパスしてC8051に接続してUSBで聞くとうんこ。アンプはさすがに要るようだ
- SC1308の周りに意味不明なフィルタみたいなのある

さらにさまよってたら次を発見。
http://naknet.jpn.ph/blog/log/eid323.html
NOVAC RadioMate NV-UR001の話。この製品はUSBホストからはUSBSWFAMと同じに見えるらしいから、たぶん回路もなんか似てるんだろう。と思ってみてみると、意味不明なフィルタみたいなのはNV-UR001に確かによく似てる。ちょっと違うみたい。

チップ抵抗セットとか買ってもいいけどなー。これ安いしちょっとした工作にはいいよね、
http://eleshop.jp/shop/g/g89G311/
品名 / 型番 : 表面実装用チップ抵抗(詰め合わせパック) / SMD0805 (-)
販売価格 : ¥945

むしろ欲しい。でもまあめんどくせーな。
と、とりあえずGNDとVccに行ってるC..
Lch: C38,C40,C10
Rch: C39,C41,C11
を外したら、まあいいかなあ、まだちょっと高域弱い、まだちょっと歪んだ感じがするけどなあ、程度になりました。

はじめ、勢いでC7,C12も外したんだ。そしたらAD変換でシャーってノイズが入ってダメでした。

あと、E3(100uF)のマイナス側はアンプ出力R、E4のはLね。

2010年8月12日木曜日

arecordでキャプチャし続ける

http://kmt449.blogspot.com/2010/08/linux.html
の続き。

arecordは出力した大きさが2GBになると止まるようです。
alsa-utils-1.0.23のaplay.cへのパッチを作りました。
--adhoc-duration hh:mm:ss
で指定した時間、キャプチャし続けるようにします。00:00:00で、止めるかエラーするまで動き続けます。
--adhoc-durationは、stdoutへ出力するときのみ有効です。


Index: aplay.c
===================================================================
--- aplay.c (リビジョン 76)
+++ aplay.c (作業コピー)
@@ -85,6 +85,7 @@
  unsigned int rate;
 } hwparams, rhwparams;
 static int timelimit = 0;
+static long adhoc_duration = -1;
 static int quiet_mode = 0;
 static int file_type = FORMAT_DEFAULT;
 static int open_mode = 0;
@@ -206,7 +207,8 @@
 "    --max-file-time=#   start another output file when the old file has recorded\n"
 "                        for this many seconds\n"
 "    --process-id-file   write the process ID here\n"
-"    --use-strftime      apply the strftime facility to the output file name\n")
+"    --use-strftime      apply the strftime facility to the output file name\n"
+"    --adhoc-duration=##:##:## ADHOC duration\n")
  , command);
  printf(_("Recognized sample formats are:"));
  for (k = 0; k < SND_PCM_FORMAT_LAST; ++k) {
@@ -333,7 +335,7 @@

 static void version(void)
 {
- printf("%s: version " SND_UTIL_VERSION_STR " by Jaroslav Kysela <perex@perex.cz>\n", command);
+ printf("%s: version " SND_UTIL_VERSION_STR "p00 by Jaroslav Kysela <perex@perex.cz>\n", command);
 }

 /*
@@ -350,9 +352,11 @@

 static void signal_handler(int sig)
 {
+ int falrm = (sig == SIGALRM);
+
  if (verbose==2)
  putchar('\n');
- if (!quiet_mode)
+ if (!quiet_mode && !falrm)
  fprintf(stderr, _("Aborted by signal %s...\n"), strsignal(sig));
  if (stream == SND_PCM_STREAM_CAPTURE) {
  if (fmt_rec_table[file_type].end) {
@@ -369,7 +373,7 @@
  snd_pcm_close(handle);
  handle = NULL;
  }
- prg_exit(EXIT_FAILURE);
+ prg_exit(falrm ? EXIT_SUCCESS : EXIT_FAILURE);
 }

 /* call on SIGUSR1 signal. */
@@ -392,7 +396,8 @@
  OPT_TEST_NOWAIT,
  OPT_MAX_FILE_TIME,
  OPT_PROCESS_ID_FILE,
- OPT_USE_STRFTIME
+ OPT_USE_STRFTIME,
+ OPT_ADHOC_DURATION
 };

 int main(int argc, char *argv[])
@@ -436,6 +441,7 @@
  {"max-file-time", 1, 0, OPT_MAX_FILE_TIME},
  {"process-id-file", 1, 0, OPT_PROCESS_ID_FILE},
  {"use-strftime", 0, 0, OPT_USE_STRFTIME},
+ {"adhoc-duration", /*has_arg*/1, /*flag*/0, /*val*/OPT_ADHOC_DURATION},
  {0, 0, 0, 0}
  };
  char *pcm_name = "default";
@@ -634,7 +640,17 @@
  case OPT_USE_STRFTIME:
  use_strftime = 1;
  break;
+ case OPT_ADHOC_DURATION:
+ {
+ int hh, mm, ss;
+ if (sscanf(optarg, "%02d:%02d:%02d", &hh, &mm, &ss) != 3) {
+ goto L_ERROR;
+ }
+ adhoc_duration = ((hh * 60) + mm) * 60 + ss + /*margin*/1;
+ }
+ break;
  default:
+ L_ERROR:
  fprintf(stderr, _("Try `%s --help' for more information.\n"), command);
  return 1;
  }
@@ -706,6 +722,7 @@
  signal(SIGINT, signal_handler);
  signal(SIGTERM, signal_handler);
  signal(SIGABRT, signal_handler);
+ signal(SIGALRM, signal_handler);
  signal(SIGUSR1, signal_handler_recycle);
  if (interleaved) {
  if (optind > argc - 1) {
@@ -2617,6 +2634,17 @@
  count = fmt_rec_table[file_type].max_filesize;
  }

+ if (adhoc_duration > 0) {
+ if (verbose) {
+ int hh, mm, ss;
+ hh = adhoc_duration / 60 / 60;
+ mm = (adhoc_duration - hh * 60 * 60) / 60;
+ ss = adhoc_duration - hh * 60 * 60 - mm * 60;
+ fprintf(stderr, "adhoc_duration=%ld(%02d:%02d:%02d).\n", adhoc_duration, hh, mm, ss);
+ }
+ alarm(adhoc_duration);
+ }
+
  do {
  /* open a file to write */
  if(!tostdout) {
@@ -2660,8 +2688,10 @@
  perror(name);
  prg_exit(EXIT_FAILURE);
  }
- count -= c;
- rest -= c;
+ if (!tostdout || adhoc_duration < 0) {
+ count -= c;
+ rest -= c;
+ }
  fdcount += c;
  }


2010年8月10日火曜日

Linux版午後のこ~だで録音し続ける

Linux版午後のこ~だ(petit313)で、
% arecord -f cd -D plug:dsnoop | gogo stdin foo.mp3

として録音し続けようとすると、途中で止まっちゃう。
原因は2つ。
1. arecordは、出力ファイルが2GBで止まる
2. gogoは、入力データのwavのヘッダにあるサイズを見てそこで止まる

まず2の変更。
wavのヘッダにあるサイズを無視するパッチ。
あ、gccのバージョン違いのせいかなんか原因不明ですが、最適化オプションを弱くしないと落ちちゃってたのでそれも含む。


diff -cr petit313/configure petit313p00/configure
*** petit313/configure 2010-08-10 22:03:33.000000000 +0900
--- petit313p00/configure 2010-08-10 22:01:36.000000000 +0900
***************
*** 1346,1353 ****
   ;;
   *)
   # default
! OPTIMIZATION="-O3 -fomit-frame-pointer -ffast-math \
! -funroll-loops"
   ;;
   esac
   echo "$ac_t""${OPTIMIZATION}" 1>&6
--- 1346,1354 ----
   ;;
   *)
   # default
! ## OPTIMIZATION="-O3 -fomit-frame-pointer -ffast-math \
! ## -funroll-loops"
! OPTIMIZATION="-O2"
   ;;
   esac
   echo "$ac_t""${OPTIMIZATION}" 1>&6
diff -cr petit313/file_io/gogo_io.c petit313p00/file_io/gogo_io.c
*** petit313/file_io/gogo_io.c 2010-08-10 22:03:33.000000000 +0900
--- petit313p00/file_io/gogo_io.c 2010-08-10 22:01:36.000000000 +0900
***************
*** 430,435 ****
--- 430,438 ----
   return ME_WAVETYPE_ERR;
   }
  
+ /* wavヘッダにある長さを無視する */
+ pcm_format->nSize = -1;
   return ME_NOERR;
  }