- ベストアンサー
ソースファイル再生方法の疑問
- waveout関数を使用してソースファイルを再生する方法について教えてください。
- 波形データの作成と再生はできますが、ソースファイルの再生方法がわかりません。
- 参考HPにはソースファイルの再生についての情報がなく、どこで指定すればいいのかわかりません。教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
delphiですがサンプルはありました。 API自体はdelphiもVC++も変わらないので 参考になるかと思います。 http://forum.nifty.com/fdelphi/samples/01075.html waveout APIはサンプルが少なく (単に再生するだけでよいならMCIでよいので。) 試行錯誤で作った覚えがあります。 ちょっとソースをみてきになったのですが CALLBACKの部分にwaveOutProcのアドレスが入ります。 (DWORD)&waveOutProc あとは調べてみてください。
その他の回答 (1)
- sha-girl
- ベストアンサー率52% (430/816)
waveout関数というのはよくわからないのですが、 普通に考えるとLPBYTEの部分ですね。 ソースファイルというのは音データのバイナリファイルですよね? 他にwaveOutOpenというAPIを使えば再生できます。 コードのサンプルが http://product.esbooks.yahoo.co.jp/product/keyword/keyword?accd=19958096 にでていたのですが絶版のようでした。 MMRESULT waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPWAVEFORMATEX pwfx, DWORD dwCallback, DWORD dwCallbackInstance, DWORD fdwOpen ); Callback関数(waveOutProc) void CALLBACK waveOutProc( HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ); これを使えばbitレートや周波数に とらわれることなく再生できます。
補足
回答ありがとうございます。 waveファイルのヘッダを読み取ることはできたのですが、 データ部分に当たるところが、どう処理していいのかわからないのです。 WndProc内部での処理は以下のとおりです。 これを、ファイルから読み取る方法を教えてください。 ---------------------------------------------- static LPBYTE lpBuf; static HWAVEOUT hWOut; static WAVEHDR wh; static WAVEFORMATEX wf; int i; switch (iMsg) { case WM_CREATE: lpBuf=(LPBYTE)GlobalAlloc(GPTR,8000); for (i=0;i<8000;i++) { /* 波形データ作成 */ /*この部分にファイル読み込ませをしたいです。*/ if ((i % 10)<5)lpBuf[i]=192; else lpBuf[i]=64; } // wf { wf.wFormatTag=WAVE_FORMAT_PCM ; wf.nChannels=1; wf.nSamplesPerSec=8000; wf.nAvgBytesPerSec=8000; wf.nBlockAlign=1 ; wf.wBitsPerSample=8 ; wf.cbSize=0 ; } waveOutOpen(&hWOut,WAVE_MAPPER,&wf,(DWORD)hwnd,0,CALLBACK_WINDOW); // wh { wh.lpData=(LPSTR)lpBuf; wh.dwBufferLength=8000; wh.dwBytesRecorded=0; wh.dwUser=0; wh.dwFlags=0; wh.dwLoops=1; wh.lpNext=NULL ; wh.reserved=0 ; } waveOutPrepareHeader(hWOut,&wh,sizeof(WAVEHDR)); waveOutWrite(hWOut,&wh,sizeof(WAVEHDR)); return 0; case MM_WOM_DONE: /* 再生終了 */ waveOutClose(hWOut); return 0 ; case MM_WOM_CLOSE: /* デバイスクローズ */ waveOutUnprepareHeader(hWOut,&wh,sizeof(WAVEHDR)); GlobalFree(lpBuf); return 0; case WM_DESTROY : // 終了処理 PostQuitMessage(0); return 0; ---------------------------------------------- すみません、勝手にソースサンプルを使わせてもらいました。
お礼
ご丁寧にありがとうございました。 頑張ります。