diff options
author | Jonas Rabbe <jonas.rabbe@nokia.com> | 2012-03-08 11:05:30 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-12 08:21:07 +0100 |
commit | 942ff7a3c6d25dc3a79d28a79676b0995d95874b (patch) | |
tree | b738fe9761a829e216aeeebdabb3a8febcd3e415 /src/multimedia/radio | |
parent | a15b9d3ce88037c973f868fdf6959eea4e157f68 (diff) |
Made QRadioData bind to QRadioTuner to avoid using multiple services
QRadioData has been updated to be a QMediaBindableInterface, and it
will bind to a QRadioTuner instance, i.e. a QMediaObject that provides
a service which implements the QRadioDataControl.
This change is reflected in the declarative implementations of radio
tuner and data. There is a new `radioData` property in the Radio element
which will give access to the declarative RadioData element for the
tuner.
If a RadioData element is created in QML, it will have an anonymous
tuner which communicates with the underlying media service (which is
pretty much the same how the QRadioTuner and QRadioData classes work
previously).
Updated radio tuner and data test cases to use availability control
and extended the mock media service to allow providing a number of
controls rather than just one (needed for testing availability of
all classes extending from or using QMediaObject).
Change-Id: Id41dde66eee529decd828fd2dcdfe4a54c0e81f4
Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
Diffstat (limited to 'src/multimedia/radio')
-rw-r--r-- | src/multimedia/radio/qradiodata.cpp | 152 | ||||
-rw-r--r-- | src/multimedia/radio/qradiodata.h | 18 | ||||
-rw-r--r-- | src/multimedia/radio/qradiotuner.cpp | 21 | ||||
-rw-r--r-- | src/multimedia/radio/qradiotuner.h | 5 |
4 files changed, 161 insertions, 35 deletions
diff --git a/src/multimedia/radio/qradiodata.cpp b/src/multimedia/radio/qradiodata.cpp index 30a495a1a..7a1fe1b49 100644 --- a/src/multimedia/radio/qradiodata.cpp +++ b/src/multimedia/radio/qradiodata.cpp @@ -75,47 +75,64 @@ namespace The radio data object will emit signals for any changes in radio data. You can enable or disable alternative frequency with setAlternativeFrequenciesEnabled(). + You can get a QRadioData instance fromt the \l{QRadioTuner::radioData()}{radioData} + property from a QRadioTuner instance. + + \snippet doc/src/snippets/multimedia-snippets/media.cpp Radio data setup + + Alternatively, you can pass an instance of QRadioTuner to the constructor to QRadioData. + \sa {Radio Overview} */ -class QRadioDataPrivate : public QMediaObjectPrivate +class QRadioDataPrivate { + Q_DECLARE_NON_CONST_PUBLIC(QRadioData) public: - QRadioDataPrivate():provider(0), control(0) {} - QMediaServiceProvider *provider; + QRadioDataPrivate(); + + QMediaObject *mediaObject; QRadioDataControl* control; + + void _q_serviceDestroyed(); + + QRadioData *q_ptr; }; +QRadioDataPrivate::QRadioDataPrivate() + : mediaObject(0) + , control(0) +{} + +void QRadioDataPrivate::_q_serviceDestroyed() +{ + mediaObject = 0; + control = 0; +} + /*! - Constructs a radio data based on a media service allocated by a media service \a provider. + Constructs a radio data based on a media object. + + The \a mediaObject should be an instance of \l QRadioTuner. It is preferable to use the + \l{QRadioTuner::radioData()}{radioData} property on a QRadioTuner instance to get an instance + of QRadioData. - The \a parent is passed to QMediaObject. + During construction, this class is bound to the \a mediaObject using the + \l{QMediaObject::bind()}{bind()} method. */ -QRadioData::QRadioData(QObject *parent): - QMediaObject(*new QRadioDataPrivate, - parent, - QMediaServiceProvider::defaultServiceProvider()->requestService(Q_MEDIASERVICE_RADIO)) +QRadioData::QRadioData(QMediaObject *mediaObject, QObject *parent) + : QObject(parent) + , d_ptr(new QRadioDataPrivate) { Q_D(QRadioData); - d->provider = QMediaServiceProvider::defaultServiceProvider(); - - if (d->service != 0) { - d->control = qobject_cast<QRadioDataControl*>(d->service->requestControl(QRadioDataControl_iid)); - if (d->control != 0) { - connect(d->control, SIGNAL(stationIdChanged(QString)), SIGNAL(stationIdChanged(QString))); - connect(d->control, SIGNAL(programTypeChanged(QRadioData::ProgramType)), - SIGNAL(programTypeChanged(QRadioData::ProgramType))); - connect(d->control, SIGNAL(programTypeNameChanged(QString)), SIGNAL(programTypeNameChanged(QString))); - connect(d->control, SIGNAL(stationNameChanged(QString)), SIGNAL(stationNameChanged(QString))); - connect(d->control, SIGNAL(radioTextChanged(QString)), SIGNAL(radioTextChanged(QString))); - connect(d->control, SIGNAL(alternativeFrequenciesEnabledChanged(bool)), SIGNAL(alternativeFrequenciesEnabledChanged(bool))); - connect(d->control, SIGNAL(error(QRadioData::Error)), SIGNAL(error(QRadioData::Error))); - } - } + d->q_ptr = this; + + if (mediaObject) + mediaObject->bind(this); } /*! @@ -126,14 +143,93 @@ QRadioData::~QRadioData() { Q_D(QRadioData); - if (d->service && d->control) - d->service->releaseControl(d->control); + if (d->mediaObject) + d->mediaObject->unbind(this); - d->provider->releaseService(d->service); + delete d_ptr; +} + +/*! + \reimp +*/ +QMediaObject *QRadioData::mediaObject() const +{ + return d_func()->mediaObject; +} + +/*! + \reimp +*/ +bool QRadioData::setMediaObject(QMediaObject *mediaObject) +{ + Q_D(QRadioData); + + if (d->mediaObject) { + if (d->control) { + disconnect(d->control, SIGNAL(stationIdChanged(QString)), + this, SIGNAL(stationIdChanged(QString))); + disconnect(d->control, SIGNAL(programTypeChanged(QRadioData::ProgramType)), + this, SIGNAL(programTypeChanged(QRadioData::ProgramType))); + disconnect(d->control, SIGNAL(programTypeNameChanged(QString)), + this, SIGNAL(programTypeNameChanged(QString))); + disconnect(d->control, SIGNAL(stationNameChanged(QString)), + this, SIGNAL(stationNameChanged(QString))); + disconnect(d->control, SIGNAL(radioTextChanged(QString)), + this, SIGNAL(radioTextChanged(QString))); + disconnect(d->control, SIGNAL(alternativeFrequenciesEnabledChanged(bool)), + this, SIGNAL(alternativeFrequenciesEnabledChanged(bool))); + disconnect(d->control, SIGNAL(error(QRadioData::Error)), + this, SIGNAL(error(QRadioData::Error))); + + QMediaService *service = d->mediaObject->service(); + service->releaseControl(d->control); + disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); + } + } + + d->mediaObject = mediaObject; + + if (d->mediaObject) { + QMediaService *service = mediaObject->service(); + if (service) { + d->control = qobject_cast<QRadioDataControl*>(service->requestControl(QRadioDataControl_iid)); + + if (d->control) { + connect(d->control, SIGNAL(stationIdChanged(QString)), + this, SIGNAL(stationIdChanged(QString))); + connect(d->control, SIGNAL(programTypeChanged(QRadioData::ProgramType)), + this, SIGNAL(programTypeChanged(QRadioData::ProgramType))); + connect(d->control, SIGNAL(programTypeNameChanged(QString)), + this, SIGNAL(programTypeNameChanged(QString))); + connect(d->control, SIGNAL(stationNameChanged(QString)), + this, SIGNAL(stationNameChanged(QString))); + connect(d->control, SIGNAL(radioTextChanged(QString)), + this, SIGNAL(radioTextChanged(QString))); + connect(d->control, SIGNAL(alternativeFrequenciesEnabledChanged(bool)), + this, SIGNAL(alternativeFrequenciesEnabledChanged(bool))); + connect(d->control, SIGNAL(error(QRadioData::Error)), + this, SIGNAL(error(QRadioData::Error))); + + connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); + + return true; + } + } + } + + // without QRadioDataControl discard the media object + d->mediaObject = 0; + d->control = 0; + + return false; } /*! Returns the availability of the radio data service. + + A long as there is a media service which provides control, then the + \l{QtMultimedia::AvailabilityError}{availability error} will be that + of the \l{QRadioTuner::availabilityError()}{radio tuner}. */ QtMultimedia::AvailabilityError QRadioData::availabilityError() const { @@ -142,7 +238,7 @@ QtMultimedia::AvailabilityError QRadioData::availabilityError() const if (d->control == 0) return QtMultimedia::ServiceMissingError; - return QMediaObject::availabilityError(); + return d->mediaObject->availabilityError(); } /*! diff --git a/src/multimedia/radio/qradiodata.h b/src/multimedia/radio/qradiodata.h index 03c503134..6e282f3ee 100644 --- a/src/multimedia/radio/qradiodata.h +++ b/src/multimedia/radio/qradiodata.h @@ -44,11 +44,10 @@ #include <QtCore/qobject.h> -#include "qmediaobject.h" +#include <qmediaobject.h> +#include <qmediabindableinterface.h> #include <qmediaenumdebug.h> -#include <QPair> - QT_BEGIN_HEADER QT_BEGIN_NAMESPACE @@ -57,7 +56,7 @@ QT_MODULE(Multimedia) class QRadioDataPrivate; -class Q_MULTIMEDIA_EXPORT QRadioData : public QMediaObject +class Q_MULTIMEDIA_EXPORT QRadioData : public QObject, public QMediaBindableInterface { Q_OBJECT Q_PROPERTY(QString stationId READ stationId NOTIFY stationIdChanged) @@ -70,6 +69,8 @@ class Q_MULTIMEDIA_EXPORT QRadioData : public QMediaObject Q_ENUMS(Error) Q_ENUMS(ProgramType) + Q_INTERFACES(QMediaBindableInterface) + public: enum Error { NoError, ResourceError, OpenError, OutOfRangeError }; @@ -87,11 +88,13 @@ public: College }; - QRadioData(QObject *parent = 0); + QRadioData(QMediaObject *mediaObject, QObject *parent = 0); ~QRadioData(); QtMultimedia::AvailabilityError availabilityError() const; + QMediaObject *mediaObject() const; + QString stationId() const; ProgramType programType() const; QString programTypeName() const; @@ -115,10 +118,15 @@ Q_SIGNALS: void error(QRadioData::Error error); +protected: + bool setMediaObject(QMediaObject *); + + QRadioDataPrivate *d_ptr; private: Q_DISABLE_COPY(QRadioData) Q_DECLARE_PRIVATE(QRadioData) + Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed()) }; QT_END_NAMESPACE diff --git a/src/multimedia/radio/qradiotuner.cpp b/src/multimedia/radio/qradiotuner.cpp index e847d05e0..32fd14426 100644 --- a/src/multimedia/radio/qradiotuner.cpp +++ b/src/multimedia/radio/qradiotuner.cpp @@ -43,6 +43,7 @@ #include "qmediaservice.h" #include "qmediaobject_p.h" #include "qradiotunercontrol.h" +#include "qradiodata.h" #include "qmediaserviceprovider_p.h" #include <QPair> @@ -94,9 +95,10 @@ namespace class QRadioTunerPrivate : public QMediaObjectPrivate { public: - QRadioTunerPrivate():provider(0), control(0) {} + QRadioTunerPrivate():provider(0), control(0), radioData(0) {} QMediaServiceProvider *provider; QRadioTunerControl* control; + QRadioData *radioData; }; @@ -131,6 +133,8 @@ QRadioTuner::QRadioTuner(QObject *parent): connect(d->control, SIGNAL(antennaConnectedChanged(bool)), SIGNAL(antennaConnectedChanged(bool))); connect(d->control, SIGNAL(error(QRadioTuner::Error)), SIGNAL(error(QRadioTuner::Error))); } + + d->radioData = new QRadioData(this, this); } } @@ -142,6 +146,9 @@ QRadioTuner::~QRadioTuner() { Q_D(QRadioTuner); + if (d->radioData) + delete d->radioData; + if (d->service && d->control) d->service->releaseControl(d->control); @@ -540,6 +547,18 @@ QString QRadioTuner::errorString() const } /*! + \property QRadioTuner::radioData + \brief holds an instance of \l QRadioData + + The instance of QRadioData is already bound to this instance of QRadioTuner. +*/ +QRadioData *QRadioTuner::radioData() const +{ + return d_func()->radioData; +} + + +/*! \fn void QRadioTuner::bandChanged(QRadioTuner::Band band) Signals a radio tuner's \a band has changed. diff --git a/src/multimedia/radio/qradiotuner.h b/src/multimedia/radio/qradiotuner.h index 059d54098..8f11321cf 100644 --- a/src/multimedia/radio/qradiotuner.h +++ b/src/multimedia/radio/qradiotuner.h @@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Multimedia) - +class QRadioData; class QRadioTunerPrivate; class Q_MULTIMEDIA_EXPORT QRadioTuner : public QMediaObject { @@ -70,6 +70,7 @@ class Q_MULTIMEDIA_EXPORT QRadioTuner : public QMediaObject Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(bool searching READ isSearching NOTIFY searchingChanged) Q_PROPERTY(bool antennaConnected READ isAntennaConnected NOTIFY antennaConnectedChanged) + Q_PROPERTY(QRadioData *radioData READ radioData CONSTANT) Q_ENUMS(State) Q_ENUMS(Band) Q_ENUMS(Error) @@ -114,6 +115,8 @@ public: Error error() const; QString errorString() const; + QRadioData *radioData() const; + public Q_SLOTS: void searchForward(); void searchBackward(); |