Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/mythtv/libs/libmythbase/mythcorecontext.cpp b/mythtv/libs/libmythbase/mythcorecontext.cpp
- index f7896b6..b98a0ff 100644
- --- a/mythtv/libs/libmythbase/mythcorecontext.cpp
- +++ b/mythtv/libs/libmythbase/mythcorecontext.cpp
- @@ -1208,6 +1208,13 @@ void MythCoreContext::dispatchNow(const MythEvent &event)
- MythObservable::dispatchNow(event);
- }
- +void MythCoreContext::dispatchAndWait(QObject *obj, MythEvent *event)
- +{
- + LOG(VB_NETWORK, LOG_INFO, QString("MythEvent: %1").arg(event->Message()));
- +
- + MythObservable::dispatchAndWait(obj, event);
- +}
- +
- void MythCoreContext::SetLocalHostname(const QString &hostname)
- {
- QMutexLocker locker(&d->m_localHostLock);
- diff --git a/mythtv/libs/libmythbase/mythcorecontext.h b/mythtv/libs/libmythbase/mythcorecontext.h
- index 0f3bdae..916faa5 100644
- --- a/mythtv/libs/libmythbase/mythcorecontext.h
- +++ b/mythtv/libs/libmythbase/mythcorecontext.h
- @@ -158,6 +158,7 @@ class MBASE_PUBLIC MythCoreContext : public MythObservable, public MythSocketCBs
- void dispatch(const MythEvent &event);
- void dispatchNow(const MythEvent &event); // MDEPRECATED;
- + void dispatchAndWait(QObject *obj, MythEvent *event);
- void InitLocale(void);
- void ReInitLocale(void);
- diff --git a/mythtv/libs/libmythbase/mythobservable.cpp b/mythtv/libs/libmythbase/mythobservable.cpp
- index a867e08..4b6aec3 100644
- --- a/mythtv/libs/libmythbase/mythobservable.cpp
- +++ b/mythtv/libs/libmythbase/mythobservable.cpp
- @@ -1,6 +1,7 @@
- #include <QCoreApplication>
- #include <QObject>
- #include <QMutex>
- +#include <QMetaObject>
- #include "mythobservable.h"
- @@ -103,3 +104,14 @@ void MythObservable::dispatchNow(const MythEvent &event)
- QCoreApplication::sendEvent(*it, event.clone());
- }
- +void MythObservable::dispatchAndWait(QObject *obj, MythEvent *mevent)
- +{
- + if (obj)
- + {
- + QEvent *event = static_cast<QEvent *>(mevent);
- + QMetaObject::invokeMethod(obj,
- + "customEvent",
- + Qt::BlockingQueuedConnection,
- + Q_ARG(QEvent*, event));
- + }
- +}
- diff --git a/mythtv/libs/libmythbase/mythobservable.h b/mythtv/libs/libmythbase/mythobservable.h
- index fa2c796..963e9f0 100644
- --- a/mythtv/libs/libmythbase/mythobservable.h
- +++ b/mythtv/libs/libmythbase/mythobservable.h
- @@ -22,6 +22,8 @@ class MBASE_PUBLIC MythObservable
- void dispatchNow(const MythEvent &event); // MDEPRECATED;
- bool hasListeners(void) { return !m_listeners.isEmpty(); }
- +
- + void dispatchAndWait(QObject *obj, MythEvent *mevent);
- protected:
- QMutex *m_lock;
- diff --git a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp
- index d837067..daae7d8 100644
- --- a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp
- +++ b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp
- @@ -19,6 +19,9 @@
- #include "bonjourregister.h"
- #include "mythairplayserver.h"
- +#ifdef USING_MYTHRAOP
- +#include "mythraopdevice.h"
- +#endif
- MythAirplayServer* MythAirplayServer::gMythAirplayServer = NULL;
- MThread* MythAirplayServer::gMythAirplayServerThread = NULL;
- @@ -383,12 +386,30 @@ void MythAirplayServer::Start(void)
- return;
- }
- +void MythAirplayServer::gotNewConnection(void)
- +{
- + QMutexLocker locker(m_lock);
- +
- + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Receiving AirPlay connection Message"));
- +}
- +
- void MythAirplayServer::newConnection(QTcpSocket *client)
- {
- QMutexLocker locker(m_lock);
- LOG(VB_GENERAL, LOG_INFO, LOC + QString("New connection from %1:%2")
- .arg(client->peerAddress().toString()).arg(client->peerPort()));
- +#ifdef USING_MYTHRAOP
- + // Stop any RAOP (AirPlay audio) running
- + if (MythRAOPDevice::RAOPSharedInstance() != NULL)
- + {
- + QMetaObject::invokeMethod(MythRAOPDevice::RAOPSharedInstance(),
- + "gotNewConnection",
- + Qt::BlockingQueuedConnection);
- + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Sent AirPlay connection Message"));
- + }
- +#endif
- +
- m_sockets.append(client);
- connect(client, SIGNAL(disconnected()), this, SLOT(deleteConnection()));
- connect(client, SIGNAL(readyRead()), this, SLOT(read()));
- @@ -692,7 +713,9 @@ void MythAirplayServer::HandleResponse(APHTTPRequest *req,
- MythEvent* me = new MythEvent(ACTION_HANDLEMEDIA,
- QStringList(file));
- - qApp->postEvent(GetMythMainWindow(), me);
- + LOG(VB_PLAYBACK, LOG_DEBUG, LOC + "Sending Event");
- + gCoreContext->dispatchAndWait(GetMythMainWindow(), me);
- + LOG(VB_PLAYBACK, LOG_DEBUG, LOC + "Sent Event");
- }
- }
- else
- diff --git a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.h b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.h
- index 02cea54..282c70c 100644
- --- a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.h
- +++ b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.h
- @@ -15,6 +15,9 @@ class BonjourRegister;
- #define AIRPLAY_HARDWARE_ID_SIZE 6
- QString AirPlayHardwareId();
- +#define AIRPLAY_NEWCONNECTION "AIRPLAY_NEWCONNECTION"
- +#define AIRPLAY_DISCONNECTED "AIRPLAY_DISCONNECTED"
- +
- enum AirplayEvent
- {
- AP_EVENT_NONE = -1,
- @@ -52,9 +55,14 @@ class MTV_PUBLIC MythAirplayServer : public ServerPool
- public:
- static bool Create(void);
- static void Cleanup(void);
- + static MythAirplayServer *AirplaySharedInstance(void)
- + { return gMythAirplayServer; }
- MythAirplayServer();
- + public slots:
- + void gotNewConnection(void);
- +
- private slots:
- void Start();
- void newConnection(QTcpSocket *client);
- diff --git a/mythtv/libs/libmythtv/AirPlay/mythraopconnection.cpp b/mythtv/libs/libmythtv/AirPlay/mythraopconnection.cpp
- index 2421869..8098d93 100644
- --- a/mythtv/libs/libmythtv/AirPlay/mythraopconnection.cpp
- +++ b/mythtv/libs/libmythtv/AirPlay/mythraopconnection.cpp
- @@ -17,7 +17,7 @@
- #define LOC QString("RAOP Conn: ")
- #define MAX_PACKET_SIZE 2048
- -RSA* MythRAOPConnection::g_rsa = NULL;
- +RSA *MythRAOPConnection::g_rsa = NULL;
- // RAOP RTP packet type
- #define TIMING_REQUEST 0x52
- @@ -299,8 +299,8 @@ void MythRAOPConnection::ProcessSync(const QByteArray &buf)
- {
- bool first = (uint8_t)buf[0] == 0x90; // First sync is 0x90,0x55
- const char *req = buf.constData();
- - uint64_t current_ts = qFromBigEndian(*(uint32_t*)(req + 4));
- - uint64_t next_ts = qFromBigEndian(*(uint32_t*)(req + 16));
- + uint64_t current_ts = qFromBigEndian(*(uint32_t *)(req + 4));
- + uint64_t next_ts = qFromBigEndian(*(uint32_t *)(req + 16));
- uint64_t current = framesToMs(current_ts);
- uint64_t next = framesToMs(next_ts);
- @@ -478,8 +478,8 @@ void MythRAOPConnection::ProcessTimeResponse(const QByteArray &buf)
- timeval t1, t2;
- const char *req = buf.constData();
- - t1.tv_sec = qFromBigEndian(*(uint32_t*)(req + 8));
- - t1.tv_usec = qFromBigEndian(*(uint32_t*)(req + 12));
- + t1.tv_sec = qFromBigEndian(*(uint32_t *)(req + 8));
- + t1.tv_usec = qFromBigEndian(*(uint32_t *)(req + 12));
- gettimeofday(&t2, NULL);
- uint64_t time1, time2;
- @@ -493,8 +493,8 @@ void MythRAOPConnection::ProcessTimeResponse(const QByteArray &buf)
- // now calculate the time difference between the client and us.
- // this is NTP time, where sec is in seconds, and ticks is in 1/2^32s
- - uint32_t sec = qFromBigEndian(*(uint32_t*)(req + 24));
- - uint32_t ticks = qFromBigEndian(*(uint32_t*)(req + 28));
- + uint32_t sec = qFromBigEndian(*(uint32_t *)(req + 24));
- + uint32_t ticks = qFromBigEndian(*(uint32_t *)(req + 28));
- // convert ticks into ms
- int64_t master = NTPToLocal(sec, ticks);
- m_clockSkew = master - time2;
- @@ -534,7 +534,7 @@ bool MythRAOPConnection::GetPacketType(const QByteArray &buf, uint8_t &type,
- ptr += 4;
- }
- seq = qFromBigEndian(*(uint16_t *)(ptr + 2));
- - timestamp = qFromBigEndian(*(uint32_t*)(ptr + 4));
- + timestamp = qFromBigEndian(*(uint32_t *)(ptr + 4));
- return true;
- }
- @@ -560,7 +560,7 @@ uint32_t MythRAOPConnection::decodeAudioPacket(uint8_t type,
- unsigned char iv[16];
- unsigned char decrypted_data[MAX_PACKET_SIZE];
- memcpy(iv, m_AESIV.constData(), sizeof(iv));
- - AES_cbc_encrypt((const unsigned char*)data_in,
- + AES_cbc_encrypt((const unsigned char *)data_in,
- decrypted_data, aeslen,
- &m_aesKey, iv, AES_DECRYPT);
- memcpy(decrypted_data + aeslen, data_in + aeslen, len - aeslen);
- @@ -737,7 +737,7 @@ void MythRAOPConnection::audioRetry(void)
- {
- if (!m_audio)
- {
- - MythRAOPDevice* p = (MythRAOPDevice*)parent();
- + MythRAOPDevice *p = (MythRAOPDevice *)parent();
- if (p && p->NextInAudioQueue(this) && OpenAudioDevice())
- {
- CreateDecoder();
- @@ -928,12 +928,12 @@ void MythRAOPConnection::ProcessRequest(const QStringList &header,
- LOG(VB_GENERAL, LOG_DEBUG, LOC +
- QString("Full base64 response: '%1' size %2")
- - .arg(QByteArray((const char*)from, i).toBase64().constData())
- + .arg(QByteArray((const char *)from, i).toBase64().constData())
- .arg(i));
- RSA_private_encrypt(i, from, to, LoadKey(), RSA_PKCS1_PADDING);
- - QByteArray base64 = QByteArray((const char*)to, tosize).toBase64();
- + QByteArray base64 = QByteArray((const char *)to, tosize).toBase64();
- delete[] to;
- for (int pos = base64.size() - 1; pos > 0; pos--)
- @@ -969,13 +969,13 @@ void MythRAOPConnection::ProcessRequest(const QStringList &header,
- int size = sizeof(char) * RSA_size(LoadKey());
- char *decryptedkey = new char[size];
- if (RSA_private_decrypt(decodedkey.size(),
- - (const unsigned char*)decodedkey.constData(),
- - (unsigned char*)decryptedkey,
- + (const unsigned char *)decodedkey.constData(),
- + (unsigned char *)decryptedkey,
- LoadKey(), RSA_PKCS1_OAEP_PADDING))
- {
- LOG(VB_GENERAL, LOG_DEBUG, LOC +
- "Successfully decrypted AES key from RSA.");
- - AES_set_decrypt_key((const unsigned char*)decryptedkey,
- + AES_set_decrypt_key((const unsigned char *)decryptedkey,
- 128, &m_aesKey);
- }
- else
- @@ -1268,7 +1268,7 @@ void MythRAOPConnection::FinishResponse(NetStream *stream, QTcpSocket *socket,
- * The RSA key is resident in memory for the entire duration of the application
- * as such RSA_free is never called on it.
- */
- -RSA* MythRAOPConnection::LoadKey(void)
- +RSA *MythRAOPConnection::LoadKey(void)
- {
- static QMutex lock;
- QMutexLocker locker(&lock);
- @@ -1277,7 +1277,7 @@ RSA* MythRAOPConnection::LoadKey(void)
- return g_rsa;
- QString sName( "/RAOPKey.rsa" );
- - FILE * file = fopen(GetConfDir().toUtf8() + sName.toUtf8(), "rb");
- + FILE *file = fopen(GetConfDir().toUtf8() + sName.toUtf8(), "rb");
- if ( !file )
- {
- @@ -1425,7 +1425,7 @@ bool MythRAOPConnection::CreateDecoder(void)
- m_codeccontext = avcodec_alloc_context3(m_codec);
- if (m_codeccontext)
- {
- - unsigned char* extradata = new unsigned char[36];
- + unsigned char *extradata = new unsigned char[36];
- memset(extradata, 0, 36);
- if (m_audioFormat.size() < 12)
- {
- diff --git a/mythtv/libs/libmythtv/AirPlay/mythraopconnection.h b/mythtv/libs/libmythtv/AirPlay/mythraopconnection.h
- index 2bc4120..28bc03f 100644
- --- a/mythtv/libs/libmythtv/AirPlay/mythraopconnection.h
- +++ b/mythtv/libs/libmythtv/AirPlay/mythraopconnection.h
- @@ -45,11 +45,11 @@ class MythRAOPConnection : public QObject
- friend class MythRAOPDevice;
- public:
- - MythRAOPConnection(QObject *parent, QTcpSocket* socket, QByteArray id,
- + MythRAOPConnection(QObject *parent, QTcpSocket *socket, QByteArray id,
- int port);
- ~MythRAOPConnection();
- bool Init(void);
- - QTcpSocket* GetSocket() { return m_socket; }
- + QTcpSocket *GetSocket() { return m_socket; }
- int GetDataPort() { return m_dataPort; }
- bool HasAudio() { return m_audio; }
- static QMap<QString,QString> decodeDMAP(const QByteArray &dmap);
- @@ -61,7 +61,7 @@ class MythRAOPConnection : public QObject
- void audioRetry(void);
- protected:
- - static RSA* LoadKey(void);
- + static RSA *LoadKey(void);
- private:
- void ProcessSync(const QByteArray &buf);
- diff --git a/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp
- index 91e949d..a588aef 100644
- --- a/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp
- +++ b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp
- @@ -1,6 +1,7 @@
- #include <QTimer>
- #include <QtEndian>
- #include <QNetworkInterface>
- +#include <QCoreApplication>
- #include "mthread.h"
- #include "mythlogging.h"
- @@ -11,9 +12,9 @@
- #include "mythraopdevice.h"
- #include "mythairplayserver.h"
- -MythRAOPDevice* MythRAOPDevice::gMythRAOPDevice = NULL;
- -MThread* MythRAOPDevice::gMythRAOPDeviceThread = NULL;
- -QMutex* MythRAOPDevice::gMythRAOPDeviceMutex = new QMutex(QMutex::Recursive);
- +MythRAOPDevice *MythRAOPDevice::gMythRAOPDevice = NULL;
- +MThread *MythRAOPDevice::gMythRAOPDeviceThread = NULL;
- +QMutex *MythRAOPDevice::gMythRAOPDeviceMutex = new QMutex(QMutex::Recursive);
- #define LOC QString("RAOP Device: ")
- @@ -108,12 +109,7 @@ void MythRAOPDevice::Teardown(void)
- m_bonjour = NULL;
- // disconnect clients
- - foreach (MythRAOPConnection* client, m_clients)
- - {
- - disconnect(client->GetSocket(), 0, 0, 0);
- - delete client;
- - }
- - m_clients.clear();
- + deleteAllClients();
- }
- void MythRAOPDevice::Start(void)
- @@ -194,32 +190,35 @@ bool MythRAOPDevice::NextInAudioQueue(MythRAOPConnection *conn)
- return true;
- }
- +void MythRAOPDevice::gotNewConnection(void)
- +{
- + QMutexLocker locker(m_lock);
- +
- + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Receiving AirPlay connection Message"));
- + deleteAllClients();
- +}
- +
- void MythRAOPDevice::newConnection(QTcpSocket *client)
- {
- QMutexLocker locker(m_lock);
- LOG(VB_GENERAL, LOG_INFO, LOC + QString("New connection from %1:%2")
- .arg(client->peerAddress().toString()).arg(client->peerPort()));
- - int port = 6000;
- - while (port < (6000 + RAOP_PORT_RANGE))
- + if (MythAirplayServer::AirplaySharedInstance() != NULL)
- {
- - bool found = false;
- - foreach (MythRAOPConnection* client, m_clients)
- - {
- - if (client->GetDataPort() == port)
- - {
- - found = true;
- - port++;
- - }
- - }
- - if (!found)
- - break;
- + QMetaObject::invokeMethod(MythAirplayServer::AirplaySharedInstance(),
- + "gotNewConnection",
- + Qt::BlockingQueuedConnection);
- + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Sent AirPlay connection Message"));
- }
- MythRAOPConnection *obj =
- - new MythRAOPConnection(this, client, m_hardwareId, port);
- + new MythRAOPConnection(this, client, m_hardwareId, 6000);
- +
- if (obj->Init())
- {
- + // Only accept a single client at a time.
- + deleteAllClients();
- m_clients.append(obj);
- connect(client, SIGNAL(disconnected()), this, SLOT(deleteClient()));
- return;
- @@ -236,6 +235,7 @@ void MythRAOPDevice::deleteClient(void)
- {
- QMutexLocker locker(m_lock);
- QList<MythRAOPConnection *>::iterator it;
- +
- for (it = m_clients.begin(); it != m_clients.end(); ++it)
- {
- if ((*it)->GetSocket()->state() == QTcpSocket::UnconnectedState)
- @@ -247,3 +247,19 @@ void MythRAOPDevice::deleteClient(void)
- }
- }
- }
- +
- +void MythRAOPDevice::deleteAllClients(void)
- +{
- + QMutexLocker locker(m_lock);
- +
- + while (!m_clients.isEmpty())
- + {
- + MythRAOPConnection *client = m_clients.takeFirst();
- + LOG(VB_GENERAL, LOG_INFO, LOC +
- + QString("Removing client connection %1:%2")
- + .arg(client->GetSocket()->peerAddress().toString())
- + .arg(client->GetSocket()->peerPort()));
- + disconnect(client->GetSocket(), 0, 0, 0);
- + delete client;
- + }
- +}
- diff --git a/mythtv/libs/libmythtv/AirPlay/mythraopdevice.h b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.h
- index 27855b3..05d4aa7 100644
- --- a/mythtv/libs/libmythtv/AirPlay/mythraopdevice.h
- +++ b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.h
- @@ -20,10 +20,14 @@ class MTV_PUBLIC MythRAOPDevice : public ServerPool
- public:
- static bool Create(void);
- static void Cleanup(void);
- + static MythRAOPDevice *RAOPSharedInstance(void) { return gMythRAOPDevice; }
- MythRAOPDevice();
- bool NextInAudioQueue(MythRAOPConnection* conn);
- + public slots:
- + void gotNewConnection(void);
- +
- private slots:
- void Start();
- void newConnection(QTcpSocket *client);
- @@ -32,6 +36,7 @@ class MTV_PUBLIC MythRAOPDevice : public ServerPool
- private:
- virtual ~MythRAOPDevice(void);
- void Teardown(void);
- + void deleteAllClients();
- // Globals
- static MythRAOPDevice *gMythRAOPDevice;
- diff --git a/mythtv/libs/libmythtv/libmythtv.pro b/mythtv/libs/libmythtv/libmythtv.pro
- index b79b8fd..3ed36fc 100644
- --- a/mythtv/libs/libmythtv/libmythtv.pro
- +++ b/mythtv/libs/libmythtv/libmythtv.pro
- @@ -407,6 +407,7 @@ using_frontend {
- SOURCES += AirPlay/mythairplayserver.cpp
- using_libcrypto: HEADERS += AirPlay/mythraopdevice.h AirPlay/mythraopconnection.h
- using_libcrypto: SOURCES += AirPlay/mythraopdevice.cpp AirPlay/mythraopconnection.cpp
- + using_libcrypto: DEFINES += USING_MYTHRAOP
- }
- using_mheg {
- diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp
- index 5a637f7..1a0920c 100644
- --- a/mythtv/libs/libmythtv/mythplayer.cpp
- +++ b/mythtv/libs/libmythtv/mythplayer.cpp
- @@ -2347,6 +2347,8 @@ bool MythPlayer::VideoLoop(void)
- else
- DisplayNormalFrame();
- + QCoreApplication::processEvents();
- +
- if (FlagIsSet(kVideoIsNull) && decoder)
- decoder->UpdateFramesPlayed();
- else
- diff --git a/mythtv/libs/libmythui/mythmainwindow.h b/mythtv/libs/libmythui/mythmainwindow.h
- index 1f629b5..901fac4 100644
- --- a/mythtv/libs/libmythui/mythmainwindow.h
- +++ b/mythtv/libs/libmythui/mythmainwindow.h
- @@ -140,6 +140,7 @@ class MUI_PUBLIC MythMainWindow : public QWidget
- protected slots:
- void animate();
- void doRemoteScreenShot(QString filename, int x, int y);
- + void customEvent(QEvent *ce);
- signals:
- void signalRemoteScreenShot(QString filename, int x, int y);
- @@ -151,7 +152,6 @@ class MUI_PUBLIC MythMainWindow : public QWidget
- void InitKeys(void);
- bool eventFilter(QObject *o, QEvent *e);
- - void customEvent(QEvent *ce);
- void closeEvent(QCloseEvent *e);
- void drawScreen();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement