リアルタイムで、量子化ビット数を16ビットでの取り込み設定にして、
そnデータをやはり16ビットでのWAVファイルに
保存したいのですが、
wfx.nChannels
wfx.nSamplesPerSec
wfx.wFormatTag
wfx.wBitsPerSample
wfx.nBlockAlign
wfx.wBitsPerSample
wfx.nBlockAlign
wfx.nAvgBytesPerSec =
wfx.cbSize
PLAYBACK_BUFFER_SIZE
DATABLOCK_SIZE
等の設定は、どうすればいいのでしょうか?
WAVファイルの16ビット設定の仕方は知っているのですが、
wfxの設定で、どうやっても、うまくいきません。
(一部は、再生できる感じですが、部分的に無音になったり、
振幅=0のところが、持ち上がったり)
データでバイトで取り込んだ後、なんらかの変換を加えないといけないのか、
とか思ったり。
#define INP_BUFFER_SIZE 4410 //0.1 秒
#define Sample 22050
WAVEFORMATEX waveform ;
PWAVEHDR pWaveHdr1, pWaveHdr2 ;
pWaveHdr1 = malloc (sizeof (WAVEHDR)) ;
pWaveHdr2 = malloc (sizeof (WAVEHDR)) ;
waveform.wFormatTag = WAVE_FORMAT_PCM ;
waveform.nChannels = 1 ;
waveform.nSamplesPerSec = Sample;
waveform.nAvgBytesPerSec = 2*Sample ;
waveform.nBlockAlign = 2 ;
waveform.wBitsPerSample = 16 ;
waveform.cbSize = 0 ;
pWaveHdr1->lpData = (char *)pBuffer1 ;
pWaveHdr1->dwBufferLength = INP_BUFFER_SIZE ;
pWaveHdr1->dwBytesRecorded = 0 ;
pWaveHdr1->dwUser = 0 ;
pWaveHdr1->dwFlags = 0 ;
pWaveHdr1->dwLoops = 1 ;
pWaveHdr1->lpNext = NULL ;
pWaveHdr1->reserved = 0 ;
pWaveHdr2->lpData = (char *)pBuffer2 ;
pWaveHdr2->dwBufferLength = INP_BUFFER_SIZE ;
pWaveHdr2->dwBytesRecorded = 0 ;
pWaveHdr2->dwUser = 0 ;
pWaveHdr2->dwFlags = 0 ;
pWaveHdr2->dwLoops = 1 ;
pWaveHdr2->lpNext = NULL ;
pWaveHdr2->reserved = 0 ;
8bitでの録音再生からは一部の変更だけでできます
ありがとうございます。
確かに、おっしゃるとおりやってみたら、再生できました。
ところで、fputcでリアルタイム録音で拾った値を書いていくと
なぜか、for分でデータ数を規定しているにもかかわらず、
1000バイトほど多めに書きすぎる現象がおきるのですが、
なぜだかわかりますか?
>ところで、fputcでリアルタイム録音で拾った値を書いていくと
>なぜか、for分でデータ数を規定しているにもかかわらず、
>1000バイトほど多めに書きすぎる現象がおきるのですが、
>なぜだかわかりますか?
fopenでバイナリモードで開いてますか?
テキストモードだと改行コードの変換が入ると思いますが。
# ある程度まとめてfwriteで書き出した方が見通しいいかと。
# fputcでもバッファリングされてるとは思いますが。
録音している最中、バッファーにはデータがたまり続けているため
規定数カウントし終わった瞬間にもデータがバッファーに入ってしまうのではないでし
ょうか?
確認してみようと思います
一時メモリーに溜め込んでSleep()等で100mS位(時間は確認してください)待ってから
一度にファイルに書込むことは出来ないですか?
確認結果
case MM_WIM_DATA:
.
.
if(dwDataLength>=INP_BUFFER_SIZE*20)//録音バイト数がバッファーの20倍を越えたら
SendMessage(hwnd,WM_COMMAND,IDC_RECORD_BEG,0); //stop ボタンを押す
. //この2行追加
.
case IDC_RECORD_BEG: //stop
.
.
waveInReset (hWaveIn) ;
.
.
実行した結果 目的のバイト数
INP_BUFFER_SIZE*20 //saveされるのは第2バッファーの内容
がsaveされました
録音バッファーが一杯になってから、第2バッファーに転送して処理していますので
録音バッファーの内容は分かりませんでした