summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorSami Nurmenniemi <ext-sami.nurmenniemi@nokia.com>2011-10-11 09:06:12 +0300
committerQt by Nokia <qt-info@nokia.com>2011-10-21 03:40:14 +0200
commit6aea1a22eeebfe040a330d746de9e9d2cc99b130 (patch)
tree62cc58c369f866cfaaeb78f2284a94994b9b8180 /src/plugins
parentcbb21e30d5cd18d17d60a049087f98a82c2862b9 (diff)
Added RDS functionality to the QRadioTuner/QDeclarativeRadio
Change-Id: I865e3caba82977002cf1f01f1d64ee0a42de77c6 Reviewed-by: Jonas Rabbe <jonas.rabbe@nokia.com> Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/fakeradio/fakeradio.pro7
-rw-r--r--src/plugins/fakeradio/fakeradiodatacontrol.cpp226
-rw-r--r--src/plugins/fakeradio/fakeradiodatacontrol.h96
-rw-r--r--src/plugins/fakeradio/fakeradioservice.cpp29
-rw-r--r--src/plugins/fakeradio/fakeradioservice.h15
-rw-r--r--src/plugins/fakeradio/fakeradioserviceplugin.cpp6
-rw-r--r--src/plugins/fakeradio/fakeradiotunercontrol.cpp42
-rw-r--r--src/plugins/fakeradio/fakeradiotunercontrol.h7
8 files changed, 419 insertions, 9 deletions
diff --git a/src/plugins/fakeradio/fakeradio.pro b/src/plugins/fakeradio/fakeradio.pro
index a91ebb927..137a82ddb 100644
--- a/src/plugins/fakeradio/fakeradio.pro
+++ b/src/plugins/fakeradio/fakeradio.pro
@@ -10,13 +10,14 @@ DESTDIR = $$QT.multimedia.plugins/$${PLUGIN_TYPE}
HEADERS += \
fakeradioserviceplugin.h \
fakeradioservice.h \
- fakeradiotunercontrol.h
+ fakeradiotunercontrol.h \
+ fakeradiodatacontrol.h
SOURCES += \
fakeradioserviceplugin.cpp \
fakeradioservice.cpp \
- fakeradiotunercontrol.cpp
-
+ fakeradiotunercontrol.cpp \
+ fakeradiodatacontrol.cpp
target.path += $$[QT_INSTALL_PLUGINS]/$${PLUGIN_TYPE}
INSTALLS += target
diff --git a/src/plugins/fakeradio/fakeradiodatacontrol.cpp b/src/plugins/fakeradio/fakeradiodatacontrol.cpp
new file mode 100644
index 000000000..c781385be
--- /dev/null
+++ b/src/plugins/fakeradio/fakeradiodatacontrol.cpp
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "fakeradiodatacontrol.h"
+#include "fakeradioservice.h"
+
+#include <QtCore/qdebug.h>
+
+FakeRadioDataControl::FakeRadioDataControl(QObject *parent)
+ :QRadioDataControl(parent)
+{
+ initializeProgramTypeMapping();
+
+ m_rdsTimer = new QTimer(this);
+ connect(m_rdsTimer,SIGNAL(timeout()),this,SLOT(rdsUpdate()));
+ m_rdsTimer->start(5000);
+ rdsUpdate();
+
+ qsrand(QTime::currentTime().msec());
+}
+
+FakeRadioDataControl::~FakeRadioDataControl()
+{
+}
+
+bool FakeRadioDataControl::isAvailable() const
+{
+ return true;
+}
+
+QtMultimedia::AvailabilityError FakeRadioDataControl::availabilityError() const
+{
+ return QtMultimedia::NoError;
+}
+
+QString FakeRadioDataControl::stationId() const
+{
+ return "12345678";
+}
+
+QRadioData::ProgramType FakeRadioDataControl::programType() const
+{
+ return QRadioData::Drama;
+}
+
+QString FakeRadioDataControl::programTypeName() const
+{
+ return "Cycling";
+}
+
+QString FakeRadioDataControl::stationName() const
+{
+ return "Fake FM";
+}
+
+void FakeRadioDataControl::rdsUpdate()
+{
+ static int index = 0;
+ QString rdsStrings[] = {
+ "This is radio Fake FM",
+ "There is nothing to listen to here",
+ "Please remain calm" };
+ setradioText(rdsStrings[index%3]);
+ index++;
+}
+
+void FakeRadioDataControl::setradioText(QString text)
+{
+ m_radioText = text;
+ emit radioTextChanged(m_radioText);
+}
+
+QString FakeRadioDataControl::radioText() const
+{
+ return m_radioText;
+}
+
+void FakeRadioDataControl::setAlternativeFrequenciesEnabled(bool enabled)
+{
+ m_alternativeFrequenciesEnabled = enabled;
+}
+
+bool FakeRadioDataControl::isAlternativeFrequenciesEnabled() const
+{
+ return m_alternativeFrequenciesEnabled;
+}
+
+QRadioData::Error FakeRadioDataControl::error() const
+{
+ return QRadioData::NoError;
+}
+
+QString FakeRadioDataControl::errorString() const
+{
+ return QString();
+}
+
+void FakeRadioDataControl::initializeProgramTypeMapping()
+{
+ m_programTypeMapRDS[0] = QRadioData::Undefined;
+ m_programTypeMapRDS[1] = QRadioData::News;
+ m_programTypeMapRDS[2] = QRadioData::CurrentAffairs;
+ m_programTypeMapRDS[3] = QRadioData::Information;
+ m_programTypeMapRDS[4] = QRadioData::Sport;
+ m_programTypeMapRDS[5] = QRadioData::Education;
+ m_programTypeMapRDS[6] = QRadioData::Drama;
+ m_programTypeMapRDS[7] = QRadioData::Culture;
+ m_programTypeMapRDS[8] = QRadioData::Science;
+ m_programTypeMapRDS[9] = QRadioData::Varied;
+ m_programTypeMapRDS[10] = QRadioData::PopMusic;
+ m_programTypeMapRDS[11] = QRadioData::RockMusic;
+ m_programTypeMapRDS[12] = QRadioData::EasyListening;
+ m_programTypeMapRDS[13] = QRadioData::LightClassical;
+ m_programTypeMapRDS[14] = QRadioData::SeriousClassical;
+ m_programTypeMapRDS[15] = QRadioData::OtherMusic;
+ m_programTypeMapRDS[16] = QRadioData::Weather;
+ m_programTypeMapRDS[17] = QRadioData::Finance;
+ m_programTypeMapRDS[18] = QRadioData::ChildrensProgrammes;
+ m_programTypeMapRDS[19] = QRadioData::SocialAffairs;
+ m_programTypeMapRDS[20] = QRadioData::Religion;
+ m_programTypeMapRDS[21] = QRadioData::PhoneIn;
+ m_programTypeMapRDS[22] = QRadioData::Travel;
+ m_programTypeMapRDS[23] = QRadioData::Leisure;
+ m_programTypeMapRDS[24] = QRadioData::JazzMusic;
+ m_programTypeMapRDS[25] = QRadioData::CountryMusic;
+ m_programTypeMapRDS[26] = QRadioData::NationalMusic;
+ m_programTypeMapRDS[27] = QRadioData::OldiesMusic;
+ m_programTypeMapRDS[28] = QRadioData::FolkMusic;
+ m_programTypeMapRDS[29] = QRadioData::Documentary;
+ m_programTypeMapRDS[30] = QRadioData::AlarmTest;
+ m_programTypeMapRDS[31] = QRadioData::Alarm;
+
+ m_programTypeMapRBDS[0] = QRadioData::Undefined,
+ m_programTypeMapRBDS[1] = QRadioData::News;
+ m_programTypeMapRBDS[2] = QRadioData::Information;
+ m_programTypeMapRBDS[3] = QRadioData::Sport;
+ m_programTypeMapRBDS[4] = QRadioData::Talk;
+ m_programTypeMapRBDS[5] = QRadioData::RockMusic;
+ m_programTypeMapRBDS[6] = QRadioData::ClassicRock;
+ m_programTypeMapRBDS[7] = QRadioData::AdultHits;
+ m_programTypeMapRBDS[8] = QRadioData::SoftRock;
+ m_programTypeMapRBDS[9] = QRadioData::Top40;
+ m_programTypeMapRBDS[10] = QRadioData::CountryMusic;
+ m_programTypeMapRBDS[11] = QRadioData::OldiesMusic;
+ m_programTypeMapRBDS[12] = QRadioData::Soft;
+ m_programTypeMapRBDS[13] = QRadioData::Nostalgia;
+ m_programTypeMapRBDS[14] = QRadioData::JazzMusic;
+ m_programTypeMapRBDS[15] = QRadioData::Classical;
+ m_programTypeMapRBDS[16] = QRadioData::RhythmAndBlues;
+ m_programTypeMapRBDS[17] = QRadioData::SoftRhythmAndBlues;
+ m_programTypeMapRBDS[18] = QRadioData::Language;
+ m_programTypeMapRBDS[19] = QRadioData::ReligiousMusic;
+ m_programTypeMapRBDS[20] = QRadioData::ReligiousTalk;
+ m_programTypeMapRBDS[21] = QRadioData::Personality;
+ m_programTypeMapRBDS[22] = QRadioData::Public;
+ m_programTypeMapRBDS[23] = QRadioData::College;
+ m_programTypeMapRBDS[24] = QRadioData::Undefined;
+ m_programTypeMapRBDS[25] = QRadioData::Undefined;
+ m_programTypeMapRBDS[26] = QRadioData::Undefined;
+ m_programTypeMapRBDS[27] = QRadioData::Undefined;
+ m_programTypeMapRBDS[28] = QRadioData::Undefined;
+ m_programTypeMapRBDS[29] = QRadioData::Weather;
+ m_programTypeMapRBDS[30] = QRadioData::AlarmTest;
+ m_programTypeMapRBDS[31] = QRadioData::Alarm;
+}
+
+bool FakeRadioDataControl::usingRBDS()
+{
+ switch ( QLocale::system().country() )
+ {
+ case QLocale::Canada:
+ case QLocale::Mexico:
+ case QLocale::UnitedStates:
+ return true;
+
+ default:
+ return false;
+ }
+ return false;
+}
+
+QRadioData::ProgramType FakeRadioDataControl::fromRawProgramType(int rawProgramType)
+{
+ if ( usingRBDS() )
+ return m_programTypeMapRBDS.value(rawProgramType, QRadioData::Undefined);
+
+ return m_programTypeMapRDS.value(rawProgramType, QRadioData::Undefined);
+}
diff --git a/src/plugins/fakeradio/fakeradiodatacontrol.h b/src/plugins/fakeradio/fakeradiodatacontrol.h
new file mode 100644
index 000000000..fc417a885
--- /dev/null
+++ b/src/plugins/fakeradio/fakeradiodatacontrol.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FAKERADIODATACONTROL_H
+#define FAKERADIODATACONTROL_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qtimer.h>
+#include <QtCore/qdatetime.h>
+
+#include <qradiodatacontrol.h>
+
+QT_USE_NAMESPACE
+
+class FakeRadioService;
+
+class FakeRadioDataControl : public QRadioDataControl
+{
+ Q_OBJECT
+
+public:
+ FakeRadioDataControl(QObject *parent = 0);
+ ~FakeRadioDataControl();
+
+ bool isAvailable() const;
+ QtMultimedia::AvailabilityError availabilityError() const;
+
+ QString stationId() const;
+ QRadioData::ProgramType programType() const;
+ QString programTypeName() const;
+ QString stationName() const;
+ QString radioText() const;
+ void setAlternativeFrequenciesEnabled(bool enabled);
+ bool isAlternativeFrequenciesEnabled() const;
+
+ QRadioData::Error error() const;
+ QString errorString() const;
+
+private slots:
+ void rdsUpdate();
+
+private:
+ void setradioText(QString);
+ void initializeProgramTypeMapping();
+ bool usingRBDS();
+ QRadioData::ProgramType fromRawProgramType(int rawProgramType);
+
+private: //data
+ bool m_alternativeFrequenciesEnabled;
+ QString m_radioText;
+ QTimer *m_rdsTimer;
+
+ QMap<int, QRadioData::ProgramType> m_programTypeMapRDS;
+ QMap<int, QRadioData::ProgramType> m_programTypeMapRBDS;
+
+};
+
+#endif // FAKERADIODATACONTROL_H
diff --git a/src/plugins/fakeradio/fakeradioservice.cpp b/src/plugins/fakeradio/fakeradioservice.cpp
index 144e3b3c7..5596c6db9 100644
--- a/src/plugins/fakeradio/fakeradioservice.cpp
+++ b/src/plugins/fakeradio/fakeradioservice.cpp
@@ -46,21 +46,46 @@
#include "fakeradioservice.h"
#include "fakeradiotunercontrol.h"
+#include "fakeradiodatacontrol.h"
+
+Q_GLOBAL_STATIC( QMutex, fakeRadioServiceMutex );
+FakeRadioService* FakeRadioService::m_instance = 0;
+int FakeRadioService::m_referenceCount = 0;
FakeRadioService::FakeRadioService(QObject *parent):
QMediaService(parent)
{
- m_control = new FakeRadioTunerControl(this);
+ m_tunerControl = new FakeRadioTunerControl(this);
+ m_dataControl = new FakeRadioDataControl(this);
}
FakeRadioService::~FakeRadioService()
{
}
+FakeRadioService* FakeRadioService::instance()
+{
+ QMutexLocker lock(fakeRadioServiceMutex());
+ if (!m_instance)
+ m_instance = new FakeRadioService;
+ m_referenceCount++;
+ return m_instance;
+}
+
+void FakeRadioService::release()
+{
+ QMutexLocker lock(fakeRadioServiceMutex());
+ m_referenceCount--;
+ if (m_referenceCount == 0)
+ delete m_instance;
+}
+
QMediaControl *FakeRadioService::requestControl(const char* name)
{
if (qstrcmp(name,QRadioTunerControl_iid) == 0)
- return m_control;
+ return m_tunerControl;
+ if (qstrcmp(name,QRadioDataControl_iid) == 0)
+ return m_dataControl;
return 0;
}
diff --git a/src/plugins/fakeradio/fakeradioservice.h b/src/plugins/fakeradio/fakeradioservice.h
index 6b55d5380..01b0f9e4d 100644
--- a/src/plugins/fakeradio/fakeradioservice.h
+++ b/src/plugins/fakeradio/fakeradioservice.h
@@ -43,25 +43,36 @@
#define FAKERADIOSERVICE_H
#include <QtCore/qobject.h>
+#include <QMutex>
#include <qmediaservice.h>
QT_USE_NAMESPACE
class FakeRadioTunerControl;
+class FakeRadioDataControl;
class FakeRadioService : public QMediaService
{
Q_OBJECT
-public:
+private:
FakeRadioService(QObject *parent = 0);
~FakeRadioService();
+public:
+ static FakeRadioService* instance();
+ void release();
+
QMediaControl *requestControl(const char* name);
void releaseControl(QMediaControl *);
private:
- FakeRadioTunerControl *m_control;
+ static FakeRadioService* m_instance;
+ static int m_referenceCount;
+
+ FakeRadioTunerControl *m_tunerControl;
+ FakeRadioDataControl *m_dataControl;
+
};
#endif // FAKERADIOSERVICE_H
diff --git a/src/plugins/fakeradio/fakeradioserviceplugin.cpp b/src/plugins/fakeradio/fakeradioserviceplugin.cpp
index d4881195c..ee8d0c8d7 100644
--- a/src/plugins/fakeradio/fakeradioserviceplugin.cpp
+++ b/src/plugins/fakeradio/fakeradioserviceplugin.cpp
@@ -59,14 +59,16 @@ QStringList FakeRadioServicePlugin::keys() const
QMediaService* FakeRadioServicePlugin::create(QString const& key)
{
if (key == QLatin1String(Q_MEDIASERVICE_RADIO))
- return new FakeRadioService;
+ return FakeRadioService::instance();
return 0;
}
void FakeRadioServicePlugin::release(QMediaService *service)
{
- delete service;
+ FakeRadioService* fakeRadio = qobject_cast<FakeRadioService*>(service);
+ if (fakeRadio)
+ fakeRadio->release();
}
QList<QByteArray> FakeRadioServicePlugin::devices(const QByteArray &service) const
diff --git a/src/plugins/fakeradio/fakeradiotunercontrol.cpp b/src/plugins/fakeradio/fakeradiotunercontrol.cpp
index d88d90ce6..b30cd0bb4 100644
--- a/src/plugins/fakeradio/fakeradiotunercontrol.cpp
+++ b/src/plugins/fakeradio/fakeradiotunercontrol.cpp
@@ -60,10 +60,16 @@ FakeRadioTunerControl::FakeRadioTunerControl(QObject *parent)
m_searching = false;
m_forward = true;
+ m_searchMode = QRadioTuner::SearchFast;
+ m_piCounter = 0;
m_searchTimer = new QTimer(this);
m_searchTimer->setSingleShot(true);
connect(m_searchTimer, SIGNAL(timeout()), this, SLOT(searchEnded()));
+ m_allStationSeekTimer = new QTimer(this);
+ m_allStationSeekTimer->setSingleShot(true);
+ connect(m_allStationSeekTimer,SIGNAL(timeout()),this,SLOT(newStationFound()));
+
QTimer::singleShot(300, this, SLOT(delayedInit()));
qsrand(QTime::currentTime().msec());
@@ -269,6 +275,42 @@ void FakeRadioTunerControl::searchBackward()
performSearch();
}
+void FakeRadioTunerControl::searchAllStations(QRadioTuner::SearchMode searchMode)
+{
+ m_searchMode = searchMode;
+ m_seekingStartFreq = m_currentFreq;
+ m_searching = true;
+ m_allStationSeekTimer->start(10);
+ emit searchingChanged(m_searching);
+}
+
+void FakeRadioTunerControl::newStationFound()
+{
+ QPair<int, int> fRange = frequencyRange(m_currentBand);
+ if (m_currentFreq == fRange.second)
+ m_currentFreq = fRange.first;
+ else
+ m_currentFreq += 100000;
+ emit frequencyChanged(m_currentFreq);
+
+ // There are 200 ticks, we want to find average of 5 stations per scan
+ if (qrand() < (RAND_MAX/40)) {
+ QString programmeId;
+
+ if (m_searchMode == QRadioTuner::SearchGetStationId)
+ programmeId = QString("FakeProgrammeID") + QString::number(m_piCounter++);
+
+ emit stationFound(m_currentFreq, programmeId);
+ }
+
+ if (m_currentFreq == m_seekingStartFreq) {
+ m_searching = false;
+ emit searchingChanged(m_searching);
+ }else {
+ m_allStationSeekTimer->start(10);
+ }
+}
+
void FakeRadioTunerControl::start()
{
if (isAvailable() && m_state != QRadioTuner::ActiveState) {
diff --git a/src/plugins/fakeradio/fakeradiotunercontrol.h b/src/plugins/fakeradio/fakeradiotunercontrol.h
index abb45cf53..d53e947c7 100644
--- a/src/plugins/fakeradio/fakeradiotunercontrol.h
+++ b/src/plugins/fakeradio/fakeradiotunercontrol.h
@@ -90,6 +90,7 @@ public:
void searchForward();
void searchBackward();
+ void searchAllStations(QRadioTuner::SearchMode searchMode = QRadioTuner::SearchFast);
void start();
void stop();
@@ -101,6 +102,7 @@ private slots:
void delayedInit();
void performSearch();
void searchEnded();
+ void newStationFound();
private: //data
QRadioTuner::State m_state;
@@ -108,6 +110,7 @@ private: //data
qint64 m_freqMin;
qint64 m_freqMax;
qint64 m_currentFreq;
+ qint64 m_seekingStartFreq;
bool m_stereo;
QRadioTuner::StereoMode m_stereoMode;
int m_signalStrength;
@@ -117,7 +120,11 @@ private: //data
// searching
bool m_searching;
bool m_forward;
+ QRadioTuner::SearchMode m_searchMode;
+ int m_piCounter;
QTimer *m_searchTimer;
+ QTimer *m_allStationSeekTimer;
+
};
#endif // FAKERADIOTUNERCONTROL_H