複数のサウンドキャプチャの列挙

解決


紅輝  2007-03-09 00:51:45  No: 64609

初めて書き込みします。C++2005ネーティブコードを使っています。Direct X
を使って、サウンドキャプチャの列挙をさせたいのですが、
DirectSoundEnumerate((LPDESENUMCALLBACK)DSEnumProc,NULL);
を処理の途中で書き込み、
BOOL CALLBACK DSEnumProc(LPGUID lpGUID,LPCTSTR szName,LPCTSTR szDriverName, VOID* pContext){この中で処理をさせる
}
上のDirectSoundEnumerate()の行で
error C2440: '型キャスト' : 'overloaded-function'
から 'LPDSENUMCALLBACKW' に変換できません。  スコープ内でこの名前を指定された関数でターゲット型に一致するものはありません。  とエラー表示が出てしまいます。dsound.hもリンクしています。エラーの原因が良く分かりません。宜しくお願いいたします。


Blue  2007-03-09 00:57:55  No: 64610

キャストの型間違ってはいないでしょうか?

>DirectSoundEnumerate((LPDESENUMCALLBACK)DSEnumProc,NULL);
>DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,NULL);


Blue  2007-03-09 00:58:52  No: 64611

引用の>をまちがえて着けてしまいました。

訂正
>DirectSoundEnumerate((LPDESENUMCALLBACK)DSEnumProc,NULL);
DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,NULL);


紅輝  2007-03-09 04:34:24  No: 64612

あわてまして、書き込みが間違えていました。
DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)DSEnumProc,NULL)
でした。でも、Captureを付けたのみですので、これがエラーとなるので前に進みません。宜しく。


wclrp ( 'o')  2007-03-09 09:08:29  No: 64613

そもそもキャストしなくても渡せるのが正しいことなんだけどね。
MSDNでもキャストしている。悪いことだと思う。

念のためだけど
メンバ関数にしちゃ駄目だよ。


wclrp ( 'o')  2007-03-09 09:11:13  No: 64614

でもstaticなメンバ関数なら可能だ。
メンバ変数つまりthisが使えるようにしてあるメンバ関数は
そうでない関数と互換性ない。
VC2005でかなりコンパイラが昔よりよくなったが
この件のエラーメッセージはよくなってないね。


紅輝  2007-03-09 22:05:51  No: 64615

MSDNにある
if (FAILED(DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)DSEnumProc, NULL){
}
のように換えたりHRESULT hr =  等も色々試しましたが、エラー表示は同じです。
ちなみに、C++ Sampleソース:(SDK ルート)\Samples\C++\DirectSound\EnumDevicesから2005の
slnを呼び出してデバッグしてみたらエラーばかり。手がつけられません。  但し、DirectSoundCapture****の行にはエラー表示が出ていない。!
どこかチョット換えるだけでOKでしょうがお手上げですわ。宜しくお願いいたします。


紅輝  2007-03-17 19:15:35  No: 64616

最初に書くべきでしたが、私は、Visual Studio 2005のC++を使っています。
Visual C++2003とか2005では、DirectSoundCaptureCreate8等と8を付けますが、Visual Studio 2005ではエラーが出ますので8を付けていません。
微妙に違いが有りますので戸惑っています。サウンドデバイスの列挙でも、この僅かな違いで動かないのでしょうかね?


wclrp ( 'o')  URL  2007-03-18 21:49:28  No: 64617

Microsoft Platform SDK for Windows Server 2003 R2
をダウンロードしたけど
Dsound.h
Dsound.lib
がなかった。
ということで俺にはDirectSoundCaptureCreateを使える状態にもって行く方法が判らない。

unicode対応で型が違うとか。
DirectSoundCaptureCreate8じゃなくて
DirectSoundCaptureCreateWとか。
DirectSoundCaptureCreateAにするか、
BOOL CALLBACK DSEnumCallback(
  LPGUID lpGuid,            
  LPCTSTR lpcstrDescription,  
  LPCTSTR lpcstrModule,       
  LPVOID lpContext)

/*
実際はキャストできないからいいんだけどさ
もしキャストによってLPCTSTRとLPCSTRが違っていても
コンパイル成功したら問題だよな。
*/


wclrp ( 'o')  2007-03-18 21:50:40  No: 64618

DirectSoundか、最近DirectShowをみてたので間違えた。


紅輝  2007-03-30 06:40:13  No: 64619

CALLBACK DSEnumProc()関数をヘッダーファイルにもPublicで書いていたのを消したら、列挙できました。  趣味の世界ですから別に急ぎませんが「たった」これだけで1ヶ月も悩みました。  ヘッダーファイルに書かないなんて常識外と思い込んでいました。  
今度は、列挙できた中からサウンドカードを指定するのですが、はたして旨く行きますかどうか。終了時に何か注意点があればお願いしますね。SoundStopと別Threadの終了に加えて、COMの終了としてCoUninitialize(); だけで大丈夫ですか?
皆さんアドバイス有難うございました。


そにっく  2007-04-02 23:48:46  No: 64620

解決されてしまったようですが
クラスのメンバ関数を以下のように定義し
class CRecorderDlg {


static BOOL CALLBACK DSoundEnumCallback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext);


};

BOOL CALLBACK CRecorderDlg::DSoundEnumCallback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext)
{
ほげほげ;
}

としてやればうまくいきませんか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加