diff options
-rw-r--r-- | src/plugins/wmf/player/mfplayersession.cpp | 50 | ||||
-rw-r--r-- | src/plugins/wmf/player/mfplayersession.h | 4 |
2 files changed, 26 insertions, 28 deletions
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 183f0231d..69958061b 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -1325,8 +1325,10 @@ void MFPlayerSession::setVolume(int volume) if (m_volume == volume) return; m_volume = volume; - if (m_volumeControl) - m_volumeControl->SetMasterVolume(m_volume * 0.01f); + + if (!m_muted) + setVolumeInternal(volume); + emit volumeChanged(m_volume); } @@ -1340,11 +1342,26 @@ void MFPlayerSession::setMuted(bool muted) if (m_muted == muted) return; m_muted = muted; - if (m_volumeControl) - m_volumeControl->SetMute(BOOL(m_muted)); + + setVolumeInternal(muted ? 0 : m_volume); + emit mutedChanged(m_muted); } +void MFPlayerSession::setVolumeInternal(int volume) +{ + if (m_volumeControl) { + quint32 channelCount = 0; + if (!SUCCEEDED(m_volumeControl->GetChannelCount(&channelCount)) + || channelCount == 0) + return; + + float scaled = volume * 0.01f; + for (quint32 i = 0; i < channelCount; ++i) + m_volumeControl->SetChannelVolume(i, scaled); + } +} + int MFPlayerSession::bufferStatus() { if (!m_netsourceStatistics) @@ -1570,10 +1587,8 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) } } - if (SUCCEEDED(MFGetService(m_session, MR_POLICY_VOLUME_SERVICE, IID_PPV_ARGS(&m_volumeControl)))) { - m_volumeControl->SetMasterVolume(m_volume * 0.01f); - m_volumeControl->SetMute(m_muted); - } + if (SUCCEEDED(MFGetService(m_session, MR_STREAM_VOLUME_SERVICE, IID_PPV_ARGS(&m_volumeControl)))) + setVolumeInternal(m_muted ? 0 : m_volume); DWORD dwCharacteristics = 0; m_sourceResolver->mediaSource()->GetCharacteristics(&dwCharacteristics); @@ -1619,25 +1634,6 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) break; case MEEndOfPresentationSegment: break; - case MEAudioSessionVolumeChanged: - if (m_volumeControl) { - float currentVolume = 1; - if (SUCCEEDED(m_volumeControl->GetMasterVolume(¤tVolume))) { - int scaledVolume = currentVolume * 100; - if (scaledVolume != m_volume) { - m_volume = scaledVolume; - emit volumeChanged(scaledVolume); - } - } - BOOL currentMuted = FALSE; - if (SUCCEEDED(m_volumeControl->GetMute(¤tMuted))) { - if (currentMuted != BOOL(m_muted)) { - m_muted = bool(currentMuted); - emit mutedChanged(m_muted); - } - } - } - break; case MESessionTopologyStatus: { UINT32 status; if (SUCCEEDED(sessionEvent->GetUINT32(MF_EVENT_TOPOLOGY_STATUS, &status))) { diff --git a/src/plugins/wmf/player/mfplayersession.h b/src/plugins/wmf/player/mfplayersession.h index e7f8dcffa..3ba43ce58 100644 --- a/src/plugins/wmf/player/mfplayersession.h +++ b/src/plugins/wmf/player/mfplayersession.h @@ -152,7 +152,7 @@ private: IMFPresentationClock *m_presentationClock; IMFRateControl *m_rateControl; IMFRateSupport *m_rateSupport; - IMFSimpleAudioVolume *m_volumeControl; + IMFAudioStreamVolume *m_volumeControl; IPropertyStore *m_netsourceStatistics; PROPVARIANT m_varStart; UINT64 m_duration; @@ -218,6 +218,8 @@ private: int m_volume; bool m_muted; + void setVolumeInternal(int volume); + void createSession(); void setupPlaybackTopology(IMFMediaSource *source, IMFPresentationDescriptor *sourcePD); IMFTopologyNode* addSourceNode(IMFTopology* topology, IMFMediaSource* source, |