diff --git a/linphone/mediastreamer2/src/winsndds.cpp b/linphone/mediastreamer2/src/winsndds.cpp index a65e2a03f9cf8a4c070fba3fbb0b96e356df858b..550c58fa667f9f2b26044448e7831f9bdd0dc60e 100644 --- a/linphone/mediastreamer2/src/winsndds.cpp +++ b/linphone/mediastreamer2/src/winsndds.cpp @@ -54,42 +54,116 @@ typedef struct WinSndDsCard{ static void winsnddscard_set_level(MSSndCard *card, MSSndCardMixerElem e, int percent){ - MMRESULT mr = MMSYSERR_NOERROR; - DWORD dwVolume = 0xFFFF; - dwVolume = ((0xFFFF) * percent) / 100; + MMRESULT mr = MMSYSERR_NOERROR; + WinSndDsCard *d=(WinSndDsCard*)card->data; + LONG dWvolume = 10000-percent*(-DSBVOLUME_MIN)/100; + DSBUFFERDESC primaryDesc; + WAVEFORMATEX wfx; + HRESULT hr; + LPDIRECTSOUND lpDirectSound; + LPDIRECTSOUNDBUFFER lpDirectSoundOutputBuffer; switch(e){ case MS_SND_CARD_PLAYBACK: + + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.cbSize = 0; + wfx.nAvgBytesPerSec = 16000; + wfx.nBlockAlign = 2; + wfx.nChannels = 1; + wfx.nSamplesPerSec = 8000; + wfx.wBitsPerSample = 16; + + ms_DirectSoundCreate( &d->out_guid, &lpDirectSound, NULL ); + + ZeroMemory(&primaryDesc, sizeof(DSBUFFERDESC)); + primaryDesc.dwSize = sizeof(DSBUFFERDESC); + primaryDesc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME; + primaryDesc.dwBufferBytes = 0; + primaryDesc.lpwfxFormat = NULL; + if ((hr = IDirectSound_CreateSoundBuffer( lpDirectSound, + &primaryDesc, &lpDirectSoundOutputBuffer, NULL)) != DS_OK) + { + IDirectSound_Release( lpDirectSound ); + lpDirectSound=NULL; + lpDirectSoundOutputBuffer=NULL; + return ; + } + + if ((hr = IDirectSoundBuffer_SetVolume(lpDirectSoundOutputBuffer, -dWvolume)) != DS_OK) + { + ms_warning("winsnddscard_set_level: No playback volume control."); + } + + IDirectSoundBuffer_Release( lpDirectSoundOutputBuffer ); + lpDirectSoundOutputBuffer=NULL; + IDirectSound_Release( lpDirectSound ); + lpDirectSound=NULL; + break; case MS_SND_CARD_MASTER: - /*mr = waveOutSetVolume(d->waveoutdev, dwVolume); */ - if (mr != MMSYSERR_NOERROR) - { - ms_warning("Failed to set master volume. (waveOutSetVolume:0x%i)", mr); - return; - } - break; - case MS_SND_CARD_CAPTURE: - break; - default: - ms_warning("winsndds_card_set_level: unsupported command."); + ms_warning("winsnddscard_set_level: No master volume control."); + break; + case MS_SND_CARD_CAPTURE: + ms_warning("winsnddscard_set_level: No mic volume control."); + break; + default: + ms_warning("winsnddscard_set_level: unsupported command."); } } static int winsnddscard_get_level(MSSndCard *card, MSSndCardMixerElem e){ - DWORD dWvolume = 10000; + WinSndDsCard *d=(WinSndDsCard*)card->data; + LONG dWvolume = 10000; + DSBUFFERDESC primaryDesc; + WAVEFORMATEX wfx; + HRESULT hr; + LPDIRECTSOUND lpDirectSound; + LPDIRECTSOUNDBUFFER lpDirectSoundOutputBuffer; + switch(e){ - case MS_SND_CARD_MASTER: - //IDirectSoundBuffer_GetVolume(hdsbuf, &volume); - return dWvolume *100/(-DSBVOLUME_MIN); - //vol->left = vol->right = (exp( ((float)(volume + 10000 + 0.1) / 9999) * 6.908) / 1000 - 0.001) * 100; - //printf("ao_dsound: volume: %f\n",vol->left); - break; - case MS_SND_CARD_CAPTURE: - break; case MS_SND_CARD_PLAYBACK: - break; + + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.cbSize = 0; + wfx.nAvgBytesPerSec = 16000; + wfx.nBlockAlign = 2; + wfx.nChannels = 1; + wfx.nSamplesPerSec = 8000; + wfx.wBitsPerSample = 16; + + ms_DirectSoundCreate( &d->out_guid, &lpDirectSound, NULL ); + + ZeroMemory(&primaryDesc, sizeof(DSBUFFERDESC)); + primaryDesc.dwSize = sizeof(DSBUFFERDESC); + primaryDesc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME; + primaryDesc.dwBufferBytes = 0; + primaryDesc.lpwfxFormat = NULL; + if ((hr = IDirectSound_CreateSoundBuffer( lpDirectSound, + &primaryDesc, &lpDirectSoundOutputBuffer, NULL)) != DS_OK) + { + IDirectSound_Release( lpDirectSound ); + return -1; + } + + if ((hr = IDirectSoundBuffer_GetVolume(lpDirectSoundOutputBuffer, &dWvolume)) != DS_OK) + { + ms_warning("winsnddscard_get_level: No playback volume control."); + } + + IDirectSoundBuffer_Release( lpDirectSoundOutputBuffer ); + lpDirectSoundOutputBuffer=NULL; + IDirectSound_Release( lpDirectSound ); + lpDirectSound=NULL; + + return 100-dWvolume *100/(-DSBVOLUME_MIN); + case MS_SND_CARD_MASTER: + ms_warning("winsnddscard_get_level: No master volume control."); + break; + case MS_SND_CARD_CAPTURE: + ms_warning("winsnddscard_get_level: No mic volume control."); + break; default: - ms_warning("winsndds_card_get_level: unsupported command."); + ms_warning("winsnddscard_get_level: unsupported command."); return -1; } return -1; @@ -99,9 +173,9 @@ static void winsnddscard_set_source(MSSndCard *card, MSSndCardCapture source){ switch(source){ case MS_SND_CARD_MIC: - break; + break; case MS_SND_CARD_LINE: - break; + break; } } @@ -262,7 +336,7 @@ static void winsnddscard_detect(MSSndCardManager *m){ if( ms_lib_instance == NULL ) { /* error */ - ms_debug("winsnddscard_init: no support for dsound (missing dsound.dll)\n"); + ms_debug("winsnddscard_detect: no support for dsound (missing dsound.dll)\n"); return; } @@ -288,7 +362,7 @@ static void winsnddscard_detect(MSSndCardManager *m){ ms_DirectSoundCaptureCreate == NULL ) { /* error */ - ms_debug("winsnddscard_init: no support for dsound\n"); + ms_debug("winsnddscard_detect: no support for dsound\n"); return; } } @@ -703,8 +777,8 @@ static void winsndds_write_process(MSFilter *f){ msize_max=current_playOffset-d->writeOffset; if( msize_max < 0 ) msize_max += d->framesPerDSBuffer; - ms_message("DS information: last_writeOffset=%i current_playOffset=%i current_writeOffset=%i max_writable=%i", - d->writeOffset, current_playOffset, currentWriteOffset, msize_max); + //ms_message("DS information: last_writeOffset=%i current_playOffset=%i current_writeOffset=%i max_writable=%i", + // d->writeOffset, current_playOffset, currentWriteOffset, msize_max); //d->writeOffset = outputBufferWriteOffsetBytes;