summaryrefslogtreecommitdiffstats
path: root/src/multimedia/radio/qradiodata.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/radio/qradiodata.cpp')
-rw-r--r--src/multimedia/radio/qradiodata.cpp152
1 files changed, 124 insertions, 28 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();
}
/*!