質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

1286閲覧

IDirectSoundNotify8 エラー : E_NOINTERFACE

Dxcaster

総合スコア3

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2021/06/16 11:07

DirectSoundで音楽の再生をしているものです。
以下のサイトを参考にIDirectSoundNotify8の実装を試みています。
Microsoft Docs
Kana-Soft.com
CharatSoft.com
さて本題です。
以下のコードを実行するとHRESULT retの値がE_NOINTERFACEになりretはFAILEDだそうです。

C++

1BOOL CreateSoundBuffer( LPDIRECTSOUNDBUFFER *dsb,const char *file ) 2{ 3 HRESULT ret; 4 MMCKINFO mSrcWaveFile; 5 MMCKINFO mSrcWaveFmt; 6 MMCKINFO mSrcWaveData; 7 LPWAVEFORMATEX wf; 8 9 // WAVファイルをロード 10 HMMIO hSrc; 11 hSrc = mmioOpenA( (LPSTR)file,NULL,MMIO_ALLOCBUF|MMIO_READ|MMIO_COMPAT ); 12 if( !hSrc ) { 13 return FALSE; 14 } 15 16 // 'WAVE'チャンクチェック 17 ZeroMemory( &mSrcWaveFile,sizeof(mSrcWaveFile) ); 18 ret = mmioDescend( hSrc,&mSrcWaveFile,NULL,MMIO_FINDRIFF ); 19 if( mSrcWaveFile.fccType!=mmioFOURCC('W','A','V','E') ) { 20 mmioClose( hSrc,0 ); 21 return FALSE; 22 } 23 24 // 'fmt 'チャンクチェック 25 ZeroMemory( &mSrcWaveFmt,sizeof(mSrcWaveFmt) ); 26 ret = mmioDescend( hSrc,&mSrcWaveFmt,&mSrcWaveFile,MMIO_FINDCHUNK ); 27 if( mSrcWaveFmt.ckid!=mmioFOURCC('f','m','t',' ') ) { 28 mmioClose( hSrc,0 ); 29 return FALSE; 30 } 31 32 // ヘッダサイズの計算 33 int iSrcHeaderSize = mSrcWaveFmt.cksize; 34 if( iSrcHeaderSize<sizeof(WAVEFORMATEX) ) 35 iSrcHeaderSize=sizeof(WAVEFORMATEX); 36 37 // ヘッダメモリ確保 38 wf = (LPWAVEFORMATEX)malloc( iSrcHeaderSize ); 39 if( !wf ) { 40 mmioClose( hSrc,0 ); 41 return FALSE; 42 } 43 ZeroMemory( wf,iSrcHeaderSize ); 44 45 // WAVEフォーマットのロード 46 ret = mmioRead( hSrc,(char*)wf,mSrcWaveFmt.cksize ); 47 if( FAILED(ret) ) { 48 free( wf ); 49 mmioClose( hSrc,0 ); 50 return FALSE; 51 } 52 53 54 // fmtチャンクに戻る 55 mmioAscend( hSrc,&mSrcWaveFmt,0 ); 56 57 // dataチャンクを探す 58 while(1) { 59 // 検索 60 ret = mmioDescend( hSrc,&mSrcWaveData,&mSrcWaveFile,0 ); 61 if( FAILED(ret) ) { 62 free( wf ); 63 mmioClose( hSrc,0 ); 64 return FALSE; 65 } 66 if( mSrcWaveData.ckid==mmioStringToFOURCCA("data",0) ) 67 break; 68 // 次のチャンクへ 69 ret = mmioAscend( hSrc,&mSrcWaveData,0 ); 70 } 71 72 // サウンドバッファの作成 73 DSBUFFERDESC dsdesc; 74 ZeroMemory( &dsdesc,sizeof(DSBUFFERDESC) ); 75 dsdesc.dwSize = sizeof( DSBUFFERDESC ); 76 dsdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STATIC | DSBCAPS_LOCDEFER; 77 dsdesc.dwBufferBytes = mSrcWaveData.cksize; 78 dsdesc.lpwfxFormat = wf; 79 dsdesc.guid3DAlgorithm = DS3DALG_DEFAULT; 80 ret = lpDS->CreateSoundBuffer( &dsdesc,dsb,NULL ); 81 if( FAILED(ret) ) { 82 free( wf ); 83 mmioClose( hSrc,0 ); 84 return FALSE; 85 } 86 87 // ロック開始 88 LPVOID pMem1,pMem2; 89 DWORD dwSize1,dwSize2; 90 ret = (*dsb)->Lock( 0,mSrcWaveData.cksize,&pMem1,&dwSize1,&pMem2,&dwSize2,0 ); 91 if( FAILED(ret) ) { 92 free( wf ); 93 mmioClose( hSrc,0 ); 94 return FALSE; 95 } 96 97 // データ書き込み 98 mmioRead( hSrc,(char*)pMem1,dwSize1 ); 99 mmioRead( hSrc,(char*)pMem2,dwSize2 ); 100 101 // ロック解除 102 (*dsb)->Unlock( pMem1,dwSize1,pMem2,dwSize2 ); 103 104 // ヘッダ用メモリを開放 105 free( wf ); 106 107 // WAVを閉じる 108 mmioClose( hSrc,0 ); 109 110 DSBPOSITIONNOTIFY pos[2]; 111 HANDLE OutEvent[2]; 112 LPDIRECTSOUNDNOTIFY8 Notify; 113 114 115 for( int i = 0; i < 2; i++ ){ 116 OutEvent[i] = CreateEvent( NULL, FALSE, FALSE, NULL ); 117 } 118 119 ret = (*dsb)->QueryInterface( IID_IDirectSoundNotify, (LPVOID*)&Notify ); 120 121 if( hn != DS_OK ){ 122 MessageBox(NULL,"IDirectSoundNotify8 is FAILED","ERROR",MB_OK); 123 return FALSE; 124 } 125 126 pos[0].dwOffset = (mSrcWaveData.cksize / 2) - 1; 127 pos[0].hEventNotify = OutEvent[0]; 128 pos[1].dwOffset = DSBPN_OFFSETSTOP; 129 pos[1].hEventNotify = OutEvent[1]; 130 Notify->SetNotificationPositions( 2, pos ); 131 Notify->Release(); 132 133 DWORD tid; 134 CreateThread( NULL, 0, OutputEventTask, (void*)hwnd, 0, &tid ); 135 136 return TRUE; 137}

エラーの値E_NOINTERFACEについて調べたところ、
デバイスが対応していないとの情報を得ました。
しかしKana-Soft.com様のサンプルを実行しますとうまく動作しているようです。

わかる方いらっしゃいましたら情報提供よろしくおねがいします。

環境
VisualStudio2005
Windows7
DirectX SDK 8.1b Final Release

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Microsoftのドキュメントを見漁ってたら、たまたまこのようなドキュメントを見つけました。
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee416818(v=vs.85)
この中にDSBCAPS_CTRLPOSITIONNOTIFYという定数があり翻訳すると、
「バッファは位置を通知する機能を持ちます」つまりこの定数をDSBUFFERDESCのdwFlagsに指定すれば見事にQueryInterfaceでエラーが出ませんでした。

投稿2021/06/16 14:55

Dxcaster

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問