ソースファイル再生方法の疑問

このQ&Aのポイント
  • waveout関数を使用してソースファイルを再生する方法について教えてください。
  • 波形データの作成と再生はできますが、ソースファイルの再生方法がわかりません。
  • 参考HPにはソースファイルの再生についての情報がなく、どこで指定すればいいのかわかりません。教えてください。
回答を見る
  • ベストアンサー

waveout関数で、ソースファイルを再生する方法を教えてください。

いつもお世話になります。 波形データを作成して、 それをwaveout関数で再生することはできたのですが、 ソースファイルを再生することができません。 参考HPには、ソースファイルからの再生については、 書かれていませんでした。 static LPBYTE lpBuf; static HWAVEOUT hWOut; static WAVEHDR wh; static WAVEFORMATEX wf; の、いずれかからソースファイルを指定するとは思うのですが、いまいちよくわかりません。 どこで、ソースファイルを指定すればよいのか、 教えてください。よろしくお願いします。

noname#6117
noname#6117

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

delphiですがサンプルはありました。 API自体はdelphiもVC++も変わらないので 参考になるかと思います。 http://forum.nifty.com/fdelphi/samples/01075.html waveout APIはサンプルが少なく (単に再生するだけでよいならMCIでよいので。) 試行錯誤で作った覚えがあります。 ちょっとソースをみてきになったのですが CALLBACKの部分にwaveOutProcのアドレスが入ります。 (DWORD)&waveOutProc あとは調べてみてください。

参考URL:
http://forum.nifty.com/fdelphi/samples/01075.html
noname#6117
質問者

お礼

ご丁寧にありがとうございました。 頑張ります。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

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レートや周波数に とらわれることなく再生できます。

noname#6117
質問者

補足

回答ありがとうございます。 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; ---------------------------------------------- すみません、勝手にソースサンプルを使わせてもらいました。

関連するQ&A

  • staticな関数をテストする方法について

    C言語やC++言語でstaticなグローバル関数を作成することがあります。 これをテストコードから呼び出せるようにするにはどうしたらいいでしょうか。 元のソースには、できるだけ変更を加えたくありません 今はテスト対象のソースファイルを、 テストが書かれているソースファイルでincludeすることで呼び出せるようにしていますが 他にいい方法はないでしょうか

  • waveIn、waveOutでの音声録音・再生プログラミングを作成して

    waveIn、waveOutでの音声録音・再生プログラミングを作成しています。 内容は、マルチバッファリング機能で音声の取り込みを行い、同時にファイルへの書き込みと、スピーカーへの出力をするのですが、当然waveInで取り込み後にwaveOutするので、元の音声とずれて音がスピーカーへ出力されます。 WAVEFORMATEX構造体のメンバには秒単位での設定値であるため、最小1秒のずれが計算上でます。実際のズレは1秒も無いですが、かなり気になります。 同様の機能のフリーソフトでは、若干のズレはあってもこのプログラムほどではありません。どのようにすれば、このズレを少なく出来るのでしょうか。 どなたか、ご教示願いたくお願いします。

  • static関数がmapファイルに載らない理由

    お世話になります static関数がmapファイルに載らない理由を教えてください よろしくお願い致します

  • C#でアンマネージドの関数を呼ぶ時のLPBYTEの処理

    C#に首を突っ込み始めたばかりの初心者です。 VC++で使っていた関数をC#から使いたいのですが、四苦八苦しています。 引数としてLPBYTEをとるような関数ですが、C#からどのようにして呼べばいいのか困っています。呼ぶには呼ぶようですが、たぶんLPBYTEの処理がうまくいっていないので、例外処理されてしまいます。 ソースはこんな感じです。(途中、省略しています。) unsafe public class foo : ... { [DllImport("bar.dll")] private static extern int hoge(StringBuilder pBuf, int i); unsafe private void button(...) { StringBuilder pBuf = new StringBuilder(256*256); try { hoge(pBuf, 100); } catch{ ... } } } hogeの最初の引数が、LPBYTEだったところで、StringBuilderならいけるかなぁ、と思ってやってみたのですが、どうもダメっぽいです。おもいっきりcatchに入っていきます。 そもそも、C#でLPBYTEのような領域の扱いがわかっていないのがいけないのかもしれません... 素人の質問ですみません。

  • ソースをみるには?

    いまHPを作っています。初心者なのでいろんな方のHPを参考にしたいとソースコードを見ようと思うのですが(HP作成のために買った本の中に出版社のHPのソースを見るという項目もあるのですが見れませんでした)上の表示というボタンからソースのところをクリックしても表示されません。どうすれば見れますか?教えてください。

  • C# wavファイルの再生について

    C#に関しての質問なのでこちらでいいのかわからないのですが、タイトル通りwavファイルの再生についてです。 環境は .NET2003 です。 現在、学校の卒業制作としてC#でゲームの開発を行っているのですが、音楽ファイルの再生の仕方で困っています。 検索してみたところ、playsoundを使用したループ再生には非同期とループを指定すればいい、とありましたが うまく動きませんでした。 そこでThreadを使用しsleepを使うことで擬似的にループ再生をさせているのですが、それだと都合の悪いことが多く別の方法を探しています。 お力になっていただける方がいれば、宜しくお願いします。 ↓は現在のソースから抜き出したものです。 [DllImport("winmm.dll")] private static extern bool PlaySound(string pszSound, int hmod, uint fdwSound); static void Main(){    Thread t1 = new Thread(new ThreadStart(play)); t1.Start(); Thread.Sleep(1000000000); } public static void play(){ PlaySound("daichi.wav", 0, 0x00001 | 0x00008 ); }

  • static な c 関数の unit-test どこに書くかの?

    こんにちは unittest コードはソースと別ファイルで管理するつもりですが、staticなc関数の場合、同ファイル内しかアクセスできないため、うまくできない。皆さんどのようにしているのでしょうか? いくつかの方法が考えていますが完璧なものはない 1、#include xxx.c   乱暴だが、うまくいくはず。っと思いきやstaticでない関数がいたりして。。。 2、ソースと一緒にunittestを書く   まぁ、最後の手段だけどな 3、staticを取り除く   いやですね、同名関数いるかもしれないし 4、Interfaceをつくる   そこまで大げさとはな、短い関数だし ちなみに c++の場合 friend を活用すればよいが。

  • iniファイルをexeファイルと同じディレクトリに作成する方法を教えてください。

    http://www.ne.jp/asahi/hishidama/home/tech/vcpp/ini60.htmlを参考にMFCアプリで設定ファイルを作成したいのですが、参考ページの通りやっているつもりですがiniファイルが作成されません。 BOOL CTTest2App::InitInstance()の上に先ページの static void InitIniName(LPCTSTR &pszProfileName)をコピペし 上記のInitInstance()の中でAfxEnableControlContainer();の上にInitIniName(m_pszProfileName)関数を記述しました。 iniファイルが出来ません。他のページも参考にいろいろ試したつもりですが、解決しません。WriteProfile系の関数でレジストリへの読み書きは確認しています。 環境:WinXP Pro Visual Studio 2005 Academic Edition

  • HPのソースを消してしまいました。

    こんにちは。 BIGLOBEの個人HPをメモ帳で作成してアップロードしました。そこまでは上手く行ったのですが、ソースファイルをバックアップしないうちにPCのHDDが破損しましてメンテナンスができなくなりました。今のところ、公開されている(私の)HPのソースをハードコピーして再度入力するしか思いつきません。 このソースをファイルコピーする方法を教えてください。よろしくお願いします。

  • ファイルオープンの関数について教えてください。

    住所録保守のプログラムの宿題なんですが、ファイルオープンを関数にせずには動かせるのですが、関数にするとエラーが山のようにでます。参考書もよんでるのですがよくわかりません。明日提出なのでよろしくお願いします。                                     関数にする前の考えたプログラムは、                                            struct aaa{ char b                                                       char  c            };                                                         FILE *fp; struct aaa[100]; if((fp=fopen("c:/a.txt","rt"))==NULL) exit(0);です。                                         宿題は f_open(char *name,char *mode) を使って指定されたファイルを指定されたモードで開くという関数を作りなさい。                                                     引数 ポインタ nameはファイル名/mode はオープンモード 戻り値なし という問題です。 よろしくお願いいたします。