알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
QMediaPlayer(1) 본문
QMediaPlayer
QMediaPlayer의 기본 구조는 아래 그림 정도가 될것 같습니다.
이제 생성자 소스를 보겠습니다.
QMediaPlayer::QMediaPlayer(QObject *parent, QMediaPlayer::Flags flags): QMediaObject(*new QMediaPlayerPrivate, parent, playerService(flags)) { Q_D(QMediaPlayer); d->provider = QMediaServiceProvider::defaultServiceProvider(); if (d->service == 0) { d->error = ServiceMissingError; } else { d->control = qobject_cast<QMediaPlayerControl*>(d->service->requestControl(QMediaPlayerControl_iid)); d->networkAccessControl = qobject_cast<QMediaNetworkAccessControl*>(d->service->requestControl(QMediaNetworkAccessControl_iid)); if (d->control != 0) { connect(d->control, SIGNAL(mediaChanged(QMediaContent)), SLOT(_q_handleMediaChanged(QMediaContent))); connect(d->control, SIGNAL(stateChanged(QMediaPlayer::State)), SLOT(_q_stateChanged(QMediaPlayer::State))); connect(d->control, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), SLOT(_q_mediaStatusChanged(QMediaPlayer::MediaStatus))); connect(d->control, SIGNAL(error(int,QString)), SLOT(_q_error(int,QString))); connect(d->control, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64))); connect(d->control, SIGNAL(positionChanged(qint64)), SIGNAL(positionChanged(qint64))); connect(d->control, SIGNAL(audioAvailableChanged(bool)), SIGNAL(audioAvailableChanged(bool))); connect(d->control, SIGNAL(videoAvailableChanged(bool)), SIGNAL(videoAvailableChanged(bool))); connect(d->control, SIGNAL(volumeChanged(int)), SIGNAL(volumeChanged(int))); connect(d->control, SIGNAL(mutedChanged(bool)), SIGNAL(mutedChanged(bool))); connect(d->control, SIGNAL(seekableChanged(bool)), SIGNAL(seekableChanged(bool))); connect(d->control, SIGNAL(playbackRateChanged(qreal)), SIGNAL(playbackRateChanged(qreal))); connect(d->control, SIGNAL(bufferStatusChanged(int)), SIGNAL(bufferStatusChanged(int))); d->state = d->control->state(); d->status = d->control->mediaStatus(); if (d->state == PlayingState) addPropertyWatch("position"); if (d->status == StalledMedia || d->status == BufferingMedia) addPropertyWatch("bufferStatus"); d->hasStreamPlaybackFeature = d->provider->supportedFeatures(d->service).testFlag(QMediaServiceProviderHint::StreamPlayback); d->audioRoleControl = qobject_cast<QAudioRoleControl*>(d->service->requestControl(QAudioRoleControl_iid)); if (d->audioRoleControl) { connect(d->audioRoleControl, &QAudioRoleControl::audioRoleChanged, this, &QMediaPlayer::audioRoleChanged); } } if (d->networkAccessControl != 0) { connect(d->networkAccessControl, SIGNAL(configurationChanged(QNetworkConfiguration)), this, SIGNAL(networkConfigurationChanged(QNetworkConfiguration))); } } }
생성자의 첫부분 부터 보겠습니다.
QMediaPlayer::QMediaPlayer(QObject *parent, QMediaPlayer::Flags flags): QMediaObject(*new QMediaPlayerPrivate, parent, playerService(flags))
QMediaObject::QMediaObject(QMediaObjectPrivate &dd, QObject *parent, QMediaService *service): QObject(parent), d_ptr(&dd) { Q_D(QMediaObject); d->q_ptr = this; d->notifyTimer = new QTimer(this); d->notifyTimer->setInterval(1000); connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify())); d->service = service; setupControls(); }
소스에서 보면
QMediaPlayer::QMediaPlayer(QObject *parent, QMediaPlayer::Flags flags): QMediaObject(*new QMediaPlayerPrivate, parent, playerService(flags))
에서 부모 QMediaObject 를 초기화 해 줍니다.
첫번째 인자 부터 알아 보겠습니다.
*new QMediaPlayerPrivate 는
QMediaObject::QMediaObject(QMediaObjectPrivate &dd, QObject *parent, QMediaService *service): QObject(parent), d_ptr(&dd)
해당 생성자를 초기화 할때
d_ptr(&dd) 로 넘겨 줍니다.
class QMediaPlayerPrivate : public QMediaObjectPrivate { Q_DECLARE_NON_CONST_PUBLIC(QMediaPlayer) public: QMediaPlayerPrivate() : provider(0) , control(0) , audioRoleControl(0) , state(QMediaPlayer::StoppedState) , status(QMediaPlayer::UnknownMediaStatus) , error(QMediaPlayer::NoError) , ignoreNextStatusChange(-1) , playlist(0) , networkAccessControl(0) , hasStreamPlaybackFeature(false) , nestedPlaylists(0) {} QMediaServiceProvider *provider; QMediaPlayerControl* control; QAudioRoleControl *audioRoleControl; QMediaPlayer::State state; QMediaPlayer::MediaStatus status; QMediaPlayer::Error error; QString errorString; int ignoreNextStatusChange; QPointer<QObject> videoOutput; QMediaPlaylist *playlist; QMediaNetworkAccessControl *networkAccessControl; QVideoSurfaceOutput surfaceOutput; bool hasStreamPlaybackFeature; QMediaContent qrcMedia; QScopedPointer<QFile> qrcFile; QMediaContent rootMedia; QMediaContent pendingPlaylist; QMediaPlaylist *parentPlaylist(QMediaPlaylist *pls); bool isInChain(QUrl url); int nestedPlaylists; void setMedia(const QMediaContent &media, QIODevice *stream = 0); void setPlaylist(QMediaPlaylist *playlist); void setPlaylistMedia(); void loadPlaylist(); void disconnectPlaylist(); void connectPlaylist(); void _q_stateChanged(QMediaPlayer::State state); void _q_mediaStatusChanged(QMediaPlayer::MediaStatus status); void _q_error(int error, const QString &errorString); void _q_updateMedia(const QMediaContent&); void _q_playlistDestroyed(); void _q_handleMediaChanged(const QMediaContent&); void _q_handlePlaylistLoaded(); void _q_handlePlaylistLoadFailed(); };
QMediaServiceProvider 이것이 무엇인지 알보겠습니다.
그뒤에 다시 private 로 돌아 와야 할것 같습니다.
'QT > Qt Multimedia 공부하기' 카테고리의 다른 글
QMediaPlayer(3) - QMediaPlayerControl (0) | 2017.09.20 |
---|---|
QMediaPlayer(2) - QMediaServiceProvider (0) | 2017.09.20 |
QMediaObject (0) | 2017.09.18 |
비디오 위젯 예제 분석 데이터의 흐름을 파악(2) (0) | 2017.09.16 |
비디오 위젯 예제 분석 데이터의 흐름을 파악(1) (0) | 2017.09.16 |