Advertisement
jyavenard

Untitled

Jul 6th, 2012
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.49 KB | None | 0 0
  1. diff --git a/mythtv/libs/libmythbase/mythcorecontext.cpp b/mythtv/libs/libmythbase/mythcorecontext.cpp
  2. index f7896b6..b98a0ff 100644
  3. --- a/mythtv/libs/libmythbase/mythcorecontext.cpp
  4. +++ b/mythtv/libs/libmythbase/mythcorecontext.cpp
  5. @@ -1208,6 +1208,13 @@ void MythCoreContext::dispatchNow(const MythEvent &event)
  6. MythObservable::dispatchNow(event);
  7. }
  8.  
  9. +void MythCoreContext::dispatchAndWait(QObject *obj, MythEvent *event)
  10. +{
  11. + LOG(VB_NETWORK, LOG_INFO, QString("MythEvent: %1").arg(event->Message()));
  12. +
  13. + MythObservable::dispatchAndWait(obj, event);
  14. +}
  15. +
  16. void MythCoreContext::SetLocalHostname(const QString &hostname)
  17. {
  18. QMutexLocker locker(&d->m_localHostLock);
  19. diff --git a/mythtv/libs/libmythbase/mythcorecontext.h b/mythtv/libs/libmythbase/mythcorecontext.h
  20. index 0f3bdae..916faa5 100644
  21. --- a/mythtv/libs/libmythbase/mythcorecontext.h
  22. +++ b/mythtv/libs/libmythbase/mythcorecontext.h
  23. @@ -158,6 +158,7 @@ class MBASE_PUBLIC MythCoreContext : public MythObservable, public MythSocketCBs
  24.  
  25. void dispatch(const MythEvent &event);
  26. void dispatchNow(const MythEvent &event); // MDEPRECATED;
  27. + void dispatchAndWait(QObject *obj, MythEvent *event);
  28.  
  29. void InitLocale(void);
  30. void ReInitLocale(void);
  31. diff --git a/mythtv/libs/libmythbase/mythobservable.cpp b/mythtv/libs/libmythbase/mythobservable.cpp
  32. index a867e08..4b6aec3 100644
  33. --- a/mythtv/libs/libmythbase/mythobservable.cpp
  34. +++ b/mythtv/libs/libmythbase/mythobservable.cpp
  35. @@ -1,6 +1,7 @@
  36. #include <QCoreApplication>
  37. #include <QObject>
  38. #include <QMutex>
  39. +#include <QMetaObject>
  40.  
  41. #include "mythobservable.h"
  42.  
  43. @@ -103,3 +104,14 @@ void MythObservable::dispatchNow(const MythEvent &event)
  44. QCoreApplication::sendEvent(*it, event.clone());
  45. }
  46.  
  47. +void MythObservable::dispatchAndWait(QObject *obj, MythEvent *mevent)
  48. +{
  49. + if (obj)
  50. + {
  51. + QEvent *event = static_cast<QEvent *>(mevent);
  52. + QMetaObject::invokeMethod(obj,
  53. + "customEvent",
  54. + Qt::BlockingQueuedConnection,
  55. + Q_ARG(QEvent*, event));
  56. + }
  57. +}
  58. diff --git a/mythtv/libs/libmythbase/mythobservable.h b/mythtv/libs/libmythbase/mythobservable.h
  59. index fa2c796..963e9f0 100644
  60. --- a/mythtv/libs/libmythbase/mythobservable.h
  61. +++ b/mythtv/libs/libmythbase/mythobservable.h
  62. @@ -22,6 +22,8 @@ class MBASE_PUBLIC MythObservable
  63. void dispatchNow(const MythEvent &event); // MDEPRECATED;
  64.  
  65. bool hasListeners(void) { return !m_listeners.isEmpty(); }
  66. +
  67. + void dispatchAndWait(QObject *obj, MythEvent *mevent);
  68.  
  69. protected:
  70. QMutex *m_lock;
  71. diff --git a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp
  72. index d837067..daae7d8 100644
  73. --- a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp
  74. +++ b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp
  75. @@ -19,6 +19,9 @@
  76.  
  77. #include "bonjourregister.h"
  78. #include "mythairplayserver.h"
  79. +#ifdef USING_MYTHRAOP
  80. +#include "mythraopdevice.h"
  81. +#endif
  82.  
  83. MythAirplayServer* MythAirplayServer::gMythAirplayServer = NULL;
  84. MThread* MythAirplayServer::gMythAirplayServerThread = NULL;
  85. @@ -383,12 +386,30 @@ void MythAirplayServer::Start(void)
  86. return;
  87. }
  88.  
  89. +void MythAirplayServer::gotNewConnection(void)
  90. +{
  91. + QMutexLocker locker(m_lock);
  92. +
  93. + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Receiving AirPlay connection Message"));
  94. +}
  95. +
  96. void MythAirplayServer::newConnection(QTcpSocket *client)
  97. {
  98. QMutexLocker locker(m_lock);
  99. LOG(VB_GENERAL, LOG_INFO, LOC + QString("New connection from %1:%2")
  100. .arg(client->peerAddress().toString()).arg(client->peerPort()));
  101.  
  102. +#ifdef USING_MYTHRAOP
  103. + // Stop any RAOP (AirPlay audio) running
  104. + if (MythRAOPDevice::RAOPSharedInstance() != NULL)
  105. + {
  106. + QMetaObject::invokeMethod(MythRAOPDevice::RAOPSharedInstance(),
  107. + "gotNewConnection",
  108. + Qt::BlockingQueuedConnection);
  109. + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Sent AirPlay connection Message"));
  110. + }
  111. +#endif
  112. +
  113. m_sockets.append(client);
  114. connect(client, SIGNAL(disconnected()), this, SLOT(deleteConnection()));
  115. connect(client, SIGNAL(readyRead()), this, SLOT(read()));
  116. @@ -692,7 +713,9 @@ void MythAirplayServer::HandleResponse(APHTTPRequest *req,
  117.  
  118. MythEvent* me = new MythEvent(ACTION_HANDLEMEDIA,
  119. QStringList(file));
  120. - qApp->postEvent(GetMythMainWindow(), me);
  121. + LOG(VB_PLAYBACK, LOG_DEBUG, LOC + "Sending Event");
  122. + gCoreContext->dispatchAndWait(GetMythMainWindow(), me);
  123. + LOG(VB_PLAYBACK, LOG_DEBUG, LOC + "Sent Event");
  124. }
  125. }
  126. else
  127. diff --git a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.h b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.h
  128. index 02cea54..282c70c 100644
  129. --- a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.h
  130. +++ b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.h
  131. @@ -15,6 +15,9 @@ class BonjourRegister;
  132. #define AIRPLAY_HARDWARE_ID_SIZE 6
  133. QString AirPlayHardwareId();
  134.  
  135. +#define AIRPLAY_NEWCONNECTION "AIRPLAY_NEWCONNECTION"
  136. +#define AIRPLAY_DISCONNECTED "AIRPLAY_DISCONNECTED"
  137. +
  138. enum AirplayEvent
  139. {
  140. AP_EVENT_NONE = -1,
  141. @@ -52,9 +55,14 @@ class MTV_PUBLIC MythAirplayServer : public ServerPool
  142. public:
  143. static bool Create(void);
  144. static void Cleanup(void);
  145. + static MythAirplayServer *AirplaySharedInstance(void)
  146. + { return gMythAirplayServer; }
  147.  
  148. MythAirplayServer();
  149.  
  150. + public slots:
  151. + void gotNewConnection(void);
  152. +
  153. private slots:
  154. void Start();
  155. void newConnection(QTcpSocket *client);
  156. diff --git a/mythtv/libs/libmythtv/AirPlay/mythraopconnection.cpp b/mythtv/libs/libmythtv/AirPlay/mythraopconnection.cpp
  157. index 2421869..8098d93 100644
  158. --- a/mythtv/libs/libmythtv/AirPlay/mythraopconnection.cpp
  159. +++ b/mythtv/libs/libmythtv/AirPlay/mythraopconnection.cpp
  160. @@ -17,7 +17,7 @@
  161. #define LOC QString("RAOP Conn: ")
  162. #define MAX_PACKET_SIZE 2048
  163.  
  164. -RSA* MythRAOPConnection::g_rsa = NULL;
  165. +RSA *MythRAOPConnection::g_rsa = NULL;
  166.  
  167. // RAOP RTP packet type
  168. #define TIMING_REQUEST 0x52
  169. @@ -299,8 +299,8 @@ void MythRAOPConnection::ProcessSync(const QByteArray &buf)
  170. {
  171. bool first = (uint8_t)buf[0] == 0x90; // First sync is 0x90,0x55
  172. const char *req = buf.constData();
  173. - uint64_t current_ts = qFromBigEndian(*(uint32_t*)(req + 4));
  174. - uint64_t next_ts = qFromBigEndian(*(uint32_t*)(req + 16));
  175. + uint64_t current_ts = qFromBigEndian(*(uint32_t *)(req + 4));
  176. + uint64_t next_ts = qFromBigEndian(*(uint32_t *)(req + 16));
  177.  
  178. uint64_t current = framesToMs(current_ts);
  179. uint64_t next = framesToMs(next_ts);
  180. @@ -478,8 +478,8 @@ void MythRAOPConnection::ProcessTimeResponse(const QByteArray &buf)
  181. timeval t1, t2;
  182. const char *req = buf.constData();
  183.  
  184. - t1.tv_sec = qFromBigEndian(*(uint32_t*)(req + 8));
  185. - t1.tv_usec = qFromBigEndian(*(uint32_t*)(req + 12));
  186. + t1.tv_sec = qFromBigEndian(*(uint32_t *)(req + 8));
  187. + t1.tv_usec = qFromBigEndian(*(uint32_t *)(req + 12));
  188.  
  189. gettimeofday(&t2, NULL);
  190. uint64_t time1, time2;
  191. @@ -493,8 +493,8 @@ void MythRAOPConnection::ProcessTimeResponse(const QByteArray &buf)
  192.  
  193. // now calculate the time difference between the client and us.
  194. // this is NTP time, where sec is in seconds, and ticks is in 1/2^32s
  195. - uint32_t sec = qFromBigEndian(*(uint32_t*)(req + 24));
  196. - uint32_t ticks = qFromBigEndian(*(uint32_t*)(req + 28));
  197. + uint32_t sec = qFromBigEndian(*(uint32_t *)(req + 24));
  198. + uint32_t ticks = qFromBigEndian(*(uint32_t *)(req + 28));
  199. // convert ticks into ms
  200. int64_t master = NTPToLocal(sec, ticks);
  201. m_clockSkew = master - time2;
  202. @@ -534,7 +534,7 @@ bool MythRAOPConnection::GetPacketType(const QByteArray &buf, uint8_t &type,
  203. ptr += 4;
  204. }
  205. seq = qFromBigEndian(*(uint16_t *)(ptr + 2));
  206. - timestamp = qFromBigEndian(*(uint32_t*)(ptr + 4));
  207. + timestamp = qFromBigEndian(*(uint32_t *)(ptr + 4));
  208. return true;
  209. }
  210.  
  211. @@ -560,7 +560,7 @@ uint32_t MythRAOPConnection::decodeAudioPacket(uint8_t type,
  212. unsigned char iv[16];
  213. unsigned char decrypted_data[MAX_PACKET_SIZE];
  214. memcpy(iv, m_AESIV.constData(), sizeof(iv));
  215. - AES_cbc_encrypt((const unsigned char*)data_in,
  216. + AES_cbc_encrypt((const unsigned char *)data_in,
  217. decrypted_data, aeslen,
  218. &m_aesKey, iv, AES_DECRYPT);
  219. memcpy(decrypted_data + aeslen, data_in + aeslen, len - aeslen);
  220. @@ -737,7 +737,7 @@ void MythRAOPConnection::audioRetry(void)
  221. {
  222. if (!m_audio)
  223. {
  224. - MythRAOPDevice* p = (MythRAOPDevice*)parent();
  225. + MythRAOPDevice *p = (MythRAOPDevice *)parent();
  226. if (p && p->NextInAudioQueue(this) && OpenAudioDevice())
  227. {
  228. CreateDecoder();
  229. @@ -928,12 +928,12 @@ void MythRAOPConnection::ProcessRequest(const QStringList &header,
  230.  
  231. LOG(VB_GENERAL, LOG_DEBUG, LOC +
  232. QString("Full base64 response: '%1' size %2")
  233. - .arg(QByteArray((const char*)from, i).toBase64().constData())
  234. + .arg(QByteArray((const char *)from, i).toBase64().constData())
  235. .arg(i));
  236.  
  237. RSA_private_encrypt(i, from, to, LoadKey(), RSA_PKCS1_PADDING);
  238.  
  239. - QByteArray base64 = QByteArray((const char*)to, tosize).toBase64();
  240. + QByteArray base64 = QByteArray((const char *)to, tosize).toBase64();
  241. delete[] to;
  242.  
  243. for (int pos = base64.size() - 1; pos > 0; pos--)
  244. @@ -969,13 +969,13 @@ void MythRAOPConnection::ProcessRequest(const QStringList &header,
  245. int size = sizeof(char) * RSA_size(LoadKey());
  246. char *decryptedkey = new char[size];
  247. if (RSA_private_decrypt(decodedkey.size(),
  248. - (const unsigned char*)decodedkey.constData(),
  249. - (unsigned char*)decryptedkey,
  250. + (const unsigned char *)decodedkey.constData(),
  251. + (unsigned char *)decryptedkey,
  252. LoadKey(), RSA_PKCS1_OAEP_PADDING))
  253. {
  254. LOG(VB_GENERAL, LOG_DEBUG, LOC +
  255. "Successfully decrypted AES key from RSA.");
  256. - AES_set_decrypt_key((const unsigned char*)decryptedkey,
  257. + AES_set_decrypt_key((const unsigned char *)decryptedkey,
  258. 128, &m_aesKey);
  259. }
  260. else
  261. @@ -1268,7 +1268,7 @@ void MythRAOPConnection::FinishResponse(NetStream *stream, QTcpSocket *socket,
  262. * The RSA key is resident in memory for the entire duration of the application
  263. * as such RSA_free is never called on it.
  264. */
  265. -RSA* MythRAOPConnection::LoadKey(void)
  266. +RSA *MythRAOPConnection::LoadKey(void)
  267. {
  268. static QMutex lock;
  269. QMutexLocker locker(&lock);
  270. @@ -1277,7 +1277,7 @@ RSA* MythRAOPConnection::LoadKey(void)
  271. return g_rsa;
  272.  
  273. QString sName( "/RAOPKey.rsa" );
  274. - FILE * file = fopen(GetConfDir().toUtf8() + sName.toUtf8(), "rb");
  275. + FILE *file = fopen(GetConfDir().toUtf8() + sName.toUtf8(), "rb");
  276.  
  277. if ( !file )
  278. {
  279. @@ -1425,7 +1425,7 @@ bool MythRAOPConnection::CreateDecoder(void)
  280. m_codeccontext = avcodec_alloc_context3(m_codec);
  281. if (m_codeccontext)
  282. {
  283. - unsigned char* extradata = new unsigned char[36];
  284. + unsigned char *extradata = new unsigned char[36];
  285. memset(extradata, 0, 36);
  286. if (m_audioFormat.size() < 12)
  287. {
  288. diff --git a/mythtv/libs/libmythtv/AirPlay/mythraopconnection.h b/mythtv/libs/libmythtv/AirPlay/mythraopconnection.h
  289. index 2bc4120..28bc03f 100644
  290. --- a/mythtv/libs/libmythtv/AirPlay/mythraopconnection.h
  291. +++ b/mythtv/libs/libmythtv/AirPlay/mythraopconnection.h
  292. @@ -45,11 +45,11 @@ class MythRAOPConnection : public QObject
  293. friend class MythRAOPDevice;
  294.  
  295. public:
  296. - MythRAOPConnection(QObject *parent, QTcpSocket* socket, QByteArray id,
  297. + MythRAOPConnection(QObject *parent, QTcpSocket *socket, QByteArray id,
  298. int port);
  299. ~MythRAOPConnection();
  300. bool Init(void);
  301. - QTcpSocket* GetSocket() { return m_socket; }
  302. + QTcpSocket *GetSocket() { return m_socket; }
  303. int GetDataPort() { return m_dataPort; }
  304. bool HasAudio() { return m_audio; }
  305. static QMap<QString,QString> decodeDMAP(const QByteArray &dmap);
  306. @@ -61,7 +61,7 @@ class MythRAOPConnection : public QObject
  307. void audioRetry(void);
  308.  
  309. protected:
  310. - static RSA* LoadKey(void);
  311. + static RSA *LoadKey(void);
  312.  
  313. private:
  314. void ProcessSync(const QByteArray &buf);
  315. diff --git a/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp
  316. index 91e949d..a588aef 100644
  317. --- a/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp
  318. +++ b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp
  319. @@ -1,6 +1,7 @@
  320. #include <QTimer>
  321. #include <QtEndian>
  322. #include <QNetworkInterface>
  323. +#include <QCoreApplication>
  324.  
  325. #include "mthread.h"
  326. #include "mythlogging.h"
  327. @@ -11,9 +12,9 @@
  328. #include "mythraopdevice.h"
  329. #include "mythairplayserver.h"
  330.  
  331. -MythRAOPDevice* MythRAOPDevice::gMythRAOPDevice = NULL;
  332. -MThread* MythRAOPDevice::gMythRAOPDeviceThread = NULL;
  333. -QMutex* MythRAOPDevice::gMythRAOPDeviceMutex = new QMutex(QMutex::Recursive);
  334. +MythRAOPDevice *MythRAOPDevice::gMythRAOPDevice = NULL;
  335. +MThread *MythRAOPDevice::gMythRAOPDeviceThread = NULL;
  336. +QMutex *MythRAOPDevice::gMythRAOPDeviceMutex = new QMutex(QMutex::Recursive);
  337.  
  338. #define LOC QString("RAOP Device: ")
  339.  
  340. @@ -108,12 +109,7 @@ void MythRAOPDevice::Teardown(void)
  341. m_bonjour = NULL;
  342.  
  343. // disconnect clients
  344. - foreach (MythRAOPConnection* client, m_clients)
  345. - {
  346. - disconnect(client->GetSocket(), 0, 0, 0);
  347. - delete client;
  348. - }
  349. - m_clients.clear();
  350. + deleteAllClients();
  351. }
  352.  
  353. void MythRAOPDevice::Start(void)
  354. @@ -194,32 +190,35 @@ bool MythRAOPDevice::NextInAudioQueue(MythRAOPConnection *conn)
  355. return true;
  356. }
  357.  
  358. +void MythRAOPDevice::gotNewConnection(void)
  359. +{
  360. + QMutexLocker locker(m_lock);
  361. +
  362. + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Receiving AirPlay connection Message"));
  363. + deleteAllClients();
  364. +}
  365. +
  366. void MythRAOPDevice::newConnection(QTcpSocket *client)
  367. {
  368. QMutexLocker locker(m_lock);
  369. LOG(VB_GENERAL, LOG_INFO, LOC + QString("New connection from %1:%2")
  370. .arg(client->peerAddress().toString()).arg(client->peerPort()));
  371.  
  372. - int port = 6000;
  373. - while (port < (6000 + RAOP_PORT_RANGE))
  374. + if (MythAirplayServer::AirplaySharedInstance() != NULL)
  375. {
  376. - bool found = false;
  377. - foreach (MythRAOPConnection* client, m_clients)
  378. - {
  379. - if (client->GetDataPort() == port)
  380. - {
  381. - found = true;
  382. - port++;
  383. - }
  384. - }
  385. - if (!found)
  386. - break;
  387. + QMetaObject::invokeMethod(MythAirplayServer::AirplaySharedInstance(),
  388. + "gotNewConnection",
  389. + Qt::BlockingQueuedConnection);
  390. + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Sent AirPlay connection Message"));
  391. }
  392.  
  393. MythRAOPConnection *obj =
  394. - new MythRAOPConnection(this, client, m_hardwareId, port);
  395. + new MythRAOPConnection(this, client, m_hardwareId, 6000);
  396. +
  397. if (obj->Init())
  398. {
  399. + // Only accept a single client at a time.
  400. + deleteAllClients();
  401. m_clients.append(obj);
  402. connect(client, SIGNAL(disconnected()), this, SLOT(deleteClient()));
  403. return;
  404. @@ -236,6 +235,7 @@ void MythRAOPDevice::deleteClient(void)
  405. {
  406. QMutexLocker locker(m_lock);
  407. QList<MythRAOPConnection *>::iterator it;
  408. +
  409. for (it = m_clients.begin(); it != m_clients.end(); ++it)
  410. {
  411. if ((*it)->GetSocket()->state() == QTcpSocket::UnconnectedState)
  412. @@ -247,3 +247,19 @@ void MythRAOPDevice::deleteClient(void)
  413. }
  414. }
  415. }
  416. +
  417. +void MythRAOPDevice::deleteAllClients(void)
  418. +{
  419. + QMutexLocker locker(m_lock);
  420. +
  421. + while (!m_clients.isEmpty())
  422. + {
  423. + MythRAOPConnection *client = m_clients.takeFirst();
  424. + LOG(VB_GENERAL, LOG_INFO, LOC +
  425. + QString("Removing client connection %1:%2")
  426. + .arg(client->GetSocket()->peerAddress().toString())
  427. + .arg(client->GetSocket()->peerPort()));
  428. + disconnect(client->GetSocket(), 0, 0, 0);
  429. + delete client;
  430. + }
  431. +}
  432. diff --git a/mythtv/libs/libmythtv/AirPlay/mythraopdevice.h b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.h
  433. index 27855b3..05d4aa7 100644
  434. --- a/mythtv/libs/libmythtv/AirPlay/mythraopdevice.h
  435. +++ b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.h
  436. @@ -20,10 +20,14 @@ class MTV_PUBLIC MythRAOPDevice : public ServerPool
  437. public:
  438. static bool Create(void);
  439. static void Cleanup(void);
  440. + static MythRAOPDevice *RAOPSharedInstance(void) { return gMythRAOPDevice; }
  441.  
  442. MythRAOPDevice();
  443. bool NextInAudioQueue(MythRAOPConnection* conn);
  444.  
  445. + public slots:
  446. + void gotNewConnection(void);
  447. +
  448. private slots:
  449. void Start();
  450. void newConnection(QTcpSocket *client);
  451. @@ -32,6 +36,7 @@ class MTV_PUBLIC MythRAOPDevice : public ServerPool
  452. private:
  453. virtual ~MythRAOPDevice(void);
  454. void Teardown(void);
  455. + void deleteAllClients();
  456.  
  457. // Globals
  458. static MythRAOPDevice *gMythRAOPDevice;
  459. diff --git a/mythtv/libs/libmythtv/libmythtv.pro b/mythtv/libs/libmythtv/libmythtv.pro
  460. index b79b8fd..3ed36fc 100644
  461. --- a/mythtv/libs/libmythtv/libmythtv.pro
  462. +++ b/mythtv/libs/libmythtv/libmythtv.pro
  463. @@ -407,6 +407,7 @@ using_frontend {
  464. SOURCES += AirPlay/mythairplayserver.cpp
  465. using_libcrypto: HEADERS += AirPlay/mythraopdevice.h AirPlay/mythraopconnection.h
  466. using_libcrypto: SOURCES += AirPlay/mythraopdevice.cpp AirPlay/mythraopconnection.cpp
  467. + using_libcrypto: DEFINES += USING_MYTHRAOP
  468. }
  469.  
  470. using_mheg {
  471. diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp
  472. index 5a637f7..1a0920c 100644
  473. --- a/mythtv/libs/libmythtv/mythplayer.cpp
  474. +++ b/mythtv/libs/libmythtv/mythplayer.cpp
  475. @@ -2347,6 +2347,8 @@ bool MythPlayer::VideoLoop(void)
  476. else
  477. DisplayNormalFrame();
  478.  
  479. + QCoreApplication::processEvents();
  480. +
  481. if (FlagIsSet(kVideoIsNull) && decoder)
  482. decoder->UpdateFramesPlayed();
  483. else
  484. diff --git a/mythtv/libs/libmythui/mythmainwindow.h b/mythtv/libs/libmythui/mythmainwindow.h
  485. index 1f629b5..901fac4 100644
  486. --- a/mythtv/libs/libmythui/mythmainwindow.h
  487. +++ b/mythtv/libs/libmythui/mythmainwindow.h
  488. @@ -140,6 +140,7 @@ class MUI_PUBLIC MythMainWindow : public QWidget
  489. protected slots:
  490. void animate();
  491. void doRemoteScreenShot(QString filename, int x, int y);
  492. + void customEvent(QEvent *ce);
  493.  
  494. signals:
  495. void signalRemoteScreenShot(QString filename, int x, int y);
  496. @@ -151,7 +152,6 @@ class MUI_PUBLIC MythMainWindow : public QWidget
  497. void InitKeys(void);
  498.  
  499. bool eventFilter(QObject *o, QEvent *e);
  500. - void customEvent(QEvent *ce);
  501. void closeEvent(QCloseEvent *e);
  502.  
  503. void drawScreen();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement