![]() 图 音频特技的示例 |
| LPDIRECTSOUNDBUFFER8 g_pDSBuffer8 = NULL; //缓冲区对象 LPDIRECTSOUND8 g_pDsd = NULL; ///Directsound对象 CWaveFile *g_pWaveFile= NULL; // 操作wave文件的 对象 //下面的8个指针接口对应着8个音频特技 LPDIRECTSOUNDFXCHORUS8 g_pChorus = NULL; LPDIRECTSOUNDFXCOMPRESSOR8 g_pCompressor = NULL; LPDIRECTSOUNDFXDISTORTION8 g_pDistortion = NULL; LPDIRECTSOUNDFXECHO8 g_pEcho = NULL; LPDIRECTSOUNDFXFLANGER8 g_pFlanger = NULL; LPDIRECTSOUNDFXGARGLE8 g_pGargle = NULL; LPDIRECTSOUNDFXPARAMEQ8 g_pParamEq = NULL; LPDIRECTSOUNDFXWAVESREVERB8 g_pReverb = NULL; //用于设置特技的参数,每种音频特技对应着一个参数。 DSFXChorus g_paramsChorus; DSFXCompressor g_paramsCompressor; DSFXDistortion g_paramsDistortion; DSFXEcho g_paramsEcho; DSFXFlanger g_paramsFlanger; DSFXGargle g_paramsGargle; DSFXParamEq g_paramsParamEq; DSFXWavesReverb g_paramsReverb; |
| CoInitialize( NULL ); HRESULT hr; if(FAILED(hr = DirectSoundCreate8(NULL,&g_pDsd,NULL))) return FALSE; if(FAILED(hr = g_pDsd->SetCooperativeLevel(m_hWnd,DSSCL_PRIORITY))) return FALSE; // for(int i =0; i< MAX_AUDIO_BUF; i++) g_event[i] = CreateEvent(NULL, FALSE, FALSE, NULL); //设置音频的格式 WAVEFORMATEX waveformat; waveformat.wFormatTag = WAVE_FORMAT_PCM; waveformat.nChannels = 2; waveformat.nSamplesPerSec = 48000; waveformat.wBitsPerSample = 16; waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample /8; waveformat.nAvgBytesPerSec = waveformat.nBlockAlign * waveformat.nSamplesPerSec; DSBUFFERDESC dsbd; ZeroMemory( &dsbd, sizeof(DSBUFFERDESC) ); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLFX| DSBCAPS_CTRLPOSITIONNOTIFY |DSBCAPS_GETCURRENTPOSITION2; // 创建缓冲区的时候,一定不要忘了设置DSBCAPS_CTRLFX标志 dsbd.dwBufferBytes = MAX_AUDIO_BUF * BUFFERNOTIFYSIZE ; dsbd.lpwfxFormat = &waveformat; LPDIRECTSOUNDBUFFER lpbuffer; if(FAILED(hr = g_pDsd->CreateSoundBuffer(&dsbd,&lpbuffer,NULL))) return FALSE; if( FAILED( hr = lpbuffer->QueryInterface( IID_IDirectSoundBuffer8, (LPVOID*) &g_pDSBuffer8) ) ) return FALSE; lpbuffer->Release(); |
| DSEFFECTDESC effectdesc; ZeroMemory( &effectdesc, sizeof( DSEFFECTDESC ) ); effectdesc.dwSize = sizeof(DSEFFECTDESC); effectdesc.dwFlags = 0; effectdesc.guidDSFXClass = GUID_DSFX_STANDARD_CHORUS; DWORD dwResult; if(g_pDSBuffer8) { hr = g_pDSBuffer8->SetFX(1,&effectdesc,&dwResult); if( FAILED( hr = g_pDSBuffer8->GetObjectInPath( GUID_DSFX_STANDARD_CHORUS, 0, IID_IDirectSoundFXChorus8,(LPVOID*) &g_pChorus ) ) ) return ; g_pChorus->GetAllParameters(&g_paramsChorus); } |
| void CDsoundEffectDemoDlg::OnEffectChanged() { switch( g_dwCurrentFXType ) { case eSFX_chorus: { //下面的代码主要是为了获取滑动条上参数的数值。 SaveSingleParameter( IDC_PARAM_NAME1, &g_paramsChorus.fWetDryMix, DSFXCHORUS_WETDRYMIX_MIN, DSFXCHORUS_WETDRYMIX_MAX ); SaveSingleParameter( IDC_PARAM_NAME2, &g_paramsChorus.fDepth, DSFXCHORUS_DEPTH_MIN, DSFXCHORUS_DEPTH_MAX ); SaveSingleParameter( IDC_PARAM_NAME3, &g_paramsChorus.fFeedback, DSFXCHORUS_FEEDBACK_MIN, DSFXCHORUS_FEEDBACK_MAX ); SaveSingleParameter( IDC_PARAM_NAME4, &g_paramsChorus.fFrequency, DSFXCHORUS_FREQUENCY_MIN, DSFXCHORUS_FREQUENCY_MAX ); SaveSingleParameter( IDC_PARAM_NAME5, &g_paramsChorus.fDelay, DSFXCHORUS_DELAY_MIN, DSFXCHORUS_DELAY_MAX ); if( ((CButton*)GetDlgItem(IDC_RADIO_TRIANGLE ))->GetCheck() == BST_CHECKED ) g_paramsChorus.lWaveform = DSFXCHORUS_WAVE_TRIANGLE; else g_paramsChorus.lWaveform = DSFXCHORUS_WAVE_SIN if( ((CButton*)GetDlgItem(IDC_RADIO_NEG_180 ))->GetCheck() == BST_CHECKED ) g_paramsChorus.lPhase = DSFXCHORUS_PHASE_NEG_180; else if( ((CButton*)GetDlgItem(IDC_RADIO_NEG_90 ))->GetCheck() == BST_CHECKED ) g_paramsChorus.lPhase = DSFXCHORUS_PHASE_NEG_90; else if( ((CButton*)GetDlgItem( IDC_RADIO_ZERO ))->GetCheck() == BST_CHECKED ) g_paramsChorus.lPhase = DSFXCHORUS_PHASE_ZERO; else if( ((CButton*)GetDlgItem(IDC_RADIO_90))->GetCheck() == BST_CHECKED ) g_paramsChorus.lPhase = DSFXCHORUS_PHASE_90; else g_paramsChorus.lPhase = DSFXCHORUS_PHASE_180; if( g_pChorus) //设置合生特技的参数 g_pChorus->SetAllParameters( &g_paramsChorus ); break; } ......//下面是其他特技的参数设置 ,略,具体可以见例子中的代码。 } |
| DWORD res; LPVOID lplockbuf; DWORD len; DWORD dwWrite; g_pDSBuffer8->Lock(0,0,&lplockbuf,&len,NULL,NULL,DSBLOCK_ENTIREBUFFER); g_pWaveFile->Read((BYTE*)lplockbuf,len,&dwWrite); g_pDSBuffer8->Unlock(lplockbuf,len,NULL,0); g_pDSBuffer8->SetCurrentPosition(0); g_pDSBuffer8->Play(0,0,DSBPLAY_LOOPING); |
关注此文的读者还看过: