From 50c7a31d621c70359e648e6aaf77c70135dc2cae Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 23 Dec 2011 17:16:06 +0000 Subject: [PATCH] From Brad Christiansen, "I have added an implementation for set/getVolume in the direct show plug-in." --- src/osgPlugins/directshow/DirectShowTexture | 5 +++- .../directshow/DirectShowTexture.cpp | 28 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/osgPlugins/directshow/DirectShowTexture b/src/osgPlugins/directshow/DirectShowTexture index 3fc5be65d..b4c7b4d76 100644 --- a/src/osgPlugins/directshow/DirectShowTexture +++ b/src/osgPlugins/directshow/DirectShowTexture @@ -65,6 +65,8 @@ public: double getTimeMultiplier() const; void quit(bool /*waitForThreadToExit*/ = true); void stop(); + void setVolume(float); + float getVolume() const; }; @@ -76,8 +78,9 @@ class CTextureRenderer : public CBaseVideoRenderer, public osg::Referenced public: IGraphBuilder* _graphBuilder; // GraphBuilder IMediaControl* _mediaControl; // Media Control - IMediaSeeking* _mediaSeeking; // Media seeking + IMediaSeeking* _mediaSeeking; // Media seeking IMediaEvent* _mediaEvent; // Media Event + IBasicAudio* _basicAudio; IBaseFilter* _videoCaptureDevice; IBaseFilter* _fileSource; IBaseFilter* _soundOutputDevice; diff --git a/src/osgPlugins/directshow/DirectShowTexture.cpp b/src/osgPlugins/directshow/DirectShowTexture.cpp index 50b888b94..b2cfd3d14 100644 --- a/src/osgPlugins/directshow/DirectShowTexture.cpp +++ b/src/osgPlugins/directshow/DirectShowTexture.cpp @@ -806,6 +806,11 @@ bool CTextureRenderer::initBuildGraph() hr = _graphBuilder->AddFilter((IBaseFilter*)this, L"Sampler"); if (!checkError(prefixForMessage, hr)) return false; + + + hr = _graphBuilder->QueryInterface( IID_IBasicAudio, (void **)&_basicAudio); + checkError(prefixForMessage, hr); //May be no sound so dont effect return result + return true; } @@ -1104,6 +1109,7 @@ bool CTextureRenderer::setupOutputSoundDevice(ICreateDevEnum* devs) if (_soundOutputDevice) _soundOutputDevice->Release(); _soundOutputDevice = 0; return false; } + return true; } @@ -1545,6 +1551,7 @@ void CTextureRenderer::releaseRessources() if (_mediaControl) _mediaControl->Release(); _mediaControl = 0; if (_mediaEvent) _mediaEvent->Release(); _mediaEvent = 0; if (_mediaSeeking) _mediaSeeking->Release(); _mediaSeeking = 0; + if (_basicAudio) _basicAudio->Release(); _basicAudio = 0; // remove filter outside because this is a filter too. } @@ -1578,6 +1585,7 @@ CTextureRenderer::CTextureRenderer( DirectShowImageStream* is, HRESULT* valid) _videoCaptureDevice = 0; _soundOutputDevice = 0; _soundCaptureDevice = 0; + _basicAudio = 0; } @@ -1882,6 +1890,26 @@ double DirectShowImageStream::getTimeMultiplier() const return rate; } +void DirectShowImageStream::setVolume(float vol) { + OpenThreads::ScopedLock lock(_mutex); + if (_renderer.valid() && _renderer->_basicAudio) + { + _renderer->_basicAudio->put_Volume(vol); + } +} + +float DirectShowImageStream::getVolume() const { + OpenThreads::ScopedLock lock(_mutex); + double vol = 0; + if (_renderer.valid() && _renderer->_basicAudio) + { + long d = 0; + _renderer->_basicAudio->get_Volume(&d); + vol = static_cast(d); + } + return vol; +} + void DirectShowImageStream::stop() { OpenThreads::ScopedLock lock(_mutex);