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;
inline bool isVolumeSupported() const { return m_volumeSupported; }
public Q_SLOTS:
void setPlaybackRate(qreal rate);
@@ -159,6 +161,7 @@ private:
QMediaContent m_resources;
ResourceHandler m_resourceHandler;
const bool m_volumeSupported;
bool m_muted;
bool m_tryingAsync;
int m_volume;

View File

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