AVFoundation: fix initial volume.

The volume level set before loading a media was never actually set on
AVPlayer.
Regression introduced by 4e07ff99 on OSX.

Task-number: QTBUG-48154
Change-Id: I599e3d55b35d7196aebc4753a367a29049f99d33
Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
This commit is contained in:
Yoann Lopes
2015-09-03 17:02:26 +02:00
parent 95fa47f747
commit 6a6a69b7d8
2 changed files with 28 additions and 22 deletions

View File

@@ -80,6 +80,8 @@ public:
qreal playbackRate() const; qreal playbackRate() const;
inline bool isVolumeSupported() const { return m_volumeSupported; }
public Q_SLOTS: public Q_SLOTS:
void setPlaybackRate(qreal rate); void setPlaybackRate(qreal rate);
@@ -159,6 +161,7 @@ private:
QMediaContent m_resources; QMediaContent m_resources;
ResourceHandler m_resourceHandler; ResourceHandler m_resourceHandler;
const bool m_volumeSupported;
bool m_muted; bool m_muted;
bool m_tryingAsync; bool m_tryingAsync;
int m_volume; int m_volume;

View File

@@ -222,11 +222,11 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe
m_player = [AVPlayer playerWithPlayerItem:m_playerItem]; m_player = [AVPlayer playerWithPlayerItem:m_playerItem];
[m_player retain]; [m_player retain];
#if defined(Q_OS_OSX)
//Set the initial volume on new player object //Set the initial volume on new player object
if (self.session) if (self.session && self.session->isVolumeSupported()) {
m_player.volume = m_session->volume() / 100.0f; [m_player setVolume:m_session->volume() / 100.0f];
#endif [m_player setMuted:m_session->isMuted()];
}
//Create a new player layer if we don't have one already //Create a new player layer if we don't have one already
if (!m_playerLayer) if (!m_playerLayer)
@@ -382,6 +382,11 @@ AVFMediaPlayerSession::AVFMediaPlayerSession(AVFMediaPlayerService *service, QOb
, m_state(QMediaPlayer::StoppedState) , m_state(QMediaPlayer::StoppedState)
, m_mediaStatus(QMediaPlayer::NoMedia) , m_mediaStatus(QMediaPlayer::NoMedia)
, m_mediaStream(0) , m_mediaStream(0)
#ifdef Q_OS_IOS
, m_volumeSupported(QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0)
#else
, m_volumeSupported(true)
#endif
, m_muted(false) , m_muted(false)
, m_tryingAsync(false) , m_tryingAsync(false)
, m_volume(100) , m_volume(100)
@@ -718,21 +723,20 @@ void AVFMediaPlayerSession::setVolume(int volume)
qDebug() << Q_FUNC_INFO << volume; qDebug() << Q_FUNC_INFO << volume;
#endif #endif
if (m_volume == volume) if (!m_volumeSupported) {
return;
AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player];
if (!player)
return;
if (![player respondsToSelector:@selector(setVolume:)]) {
qWarning("%s not implemented, requires iOS 7 or later", Q_FUNC_INFO); qWarning("%s not implemented, requires iOS 7 or later", Q_FUNC_INFO);
return; return;
} }
[player setVolume:volume / 100.0f]; if (m_volume == volume)
return;
m_volume = volume; m_volume = volume;
AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player];
if (player)
[player setVolume:volume / 100.0f];
Q_EMIT volumeChanged(m_volume); Q_EMIT volumeChanged(m_volume);
} }
@@ -741,22 +745,21 @@ void AVFMediaPlayerSession::setMuted(bool muted)
#ifdef QT_DEBUG_AVF #ifdef QT_DEBUG_AVF
qDebug() << Q_FUNC_INFO << muted; qDebug() << Q_FUNC_INFO << muted;
#endif #endif
if (m_muted == muted)
return;
AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player]; if (!m_volumeSupported) {
if (!player)
return;
// iOS: setMuted exists since iOS 7.0, thus check if it exists
if (![player respondsToSelector:@selector(setMuted:)]) {
qWarning("%s not implemented, requires iOS 7 or later", Q_FUNC_INFO); qWarning("%s not implemented, requires iOS 7 or later", Q_FUNC_INFO);
return; return;
} }
[player setMuted:muted]; if (m_muted == muted)
return;
m_muted = muted; m_muted = muted;
AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player];
if (player)
[player setMuted:muted];
Q_EMIT mutedChanged(muted); Q_EMIT mutedChanged(muted);
} }