rpms/mythtv/F-15 mythtv.spec,1.92,1.93
by Richard Shaw
Author: hobbes1069
Update of /cvs/free/rpms/mythtv/F-15
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv5854
Modified Files:
mythtv.spec
Log Message:
Remove reference to SystemD service file from spec.
12 years, 7 months
rpms/mythtv/F-15 mythbackend.logrotate, 1.1, 1.2 mythtv-0.25-fixes.patch, 1.3, 1.4 mythtv.spec, 1.91, 1.92
by Richard Shaw
Author: hobbes1069
Update of /cvs/free/rpms/mythtv/F-15
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv5710
Modified Files:
mythbackend.logrotate mythtv-0.25-fixes.patch mythtv.spec
Log Message:
* Sun Apr 29 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-5
- Update to latest 0.25/fixes.
- Really fix logrotate this time.
- Add pmount to mytharchive requirements.
Index: mythbackend.logrotate
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-15/mythbackend.logrotate,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- mythbackend.logrotate 3 Mar 2011 02:45:10 -0000 1.1
+++ mythbackend.logrotate 30 Apr 2012 13:36:11 -0000 1.2
@@ -1,4 +1,4 @@
-/var/log/mythtv/mythbackend.log {
+/var/log/mythtv/mythbackend.log /var/log/mythtv/myth*.*.*.log {
notifempty
missingok
compress
mythtv-0.25-fixes.patch:
mythplugins/mytharchive/i18n/mytharchive_fi.qm |binary
mythplugins/mytharchive/i18n/mytharchive_fi.ts | 238
mythplugins/mythbrowser/i18n/mythbrowser_fi.qm |binary
mythplugins/mythbrowser/i18n/mythbrowser_fi.ts | 44
mythplugins/mythgallery/i18n/mythgallery_fi.qm |binary
mythplugins/mythgallery/i18n/mythgallery_fi.ts | 264
mythplugins/mythgame/i18n/mythgame_fi.qm |binary
mythplugins/mythgame/i18n/mythgame_fi.ts | 178
mythplugins/mythmusic/i18n/mythmusic_fi.qm |binary
mythplugins/mythmusic/i18n/mythmusic_fi.ts | 2219 +++++-
mythplugins/mythmusic/mythmusic/visualize.cpp | 60
mythplugins/mythnetvision/i18n/mythnetvision_fi.qm |binary
mythplugins/mythnetvision/i18n/mythnetvision_fi.ts | 96
mythplugins/mythnetvision/mythnetvision/nettree.cpp | 8
mythplugins/mythnetvision/mythnetvision/rsseditor.cpp | 6
mythplugins/mythnews/i18n/mythnews_fi.qm |binary
mythplugins/mythnews/i18n/mythnews_fi.ts | 44
mythplugins/mythweather/i18n/mythweather_fi.qm |binary
mythplugins/mythweather/i18n/mythweather_fi.ts | 60
mythplugins/mythzoneminder/i18n/mythzoneminder_fi.qm |binary
mythplugins/mythzoneminder/i18n/mythzoneminder_fi.ts | 84
mythplugins/mythzoneminder/mythzmserver/zmserver.cpp | 3
mythtv/VERSION | 2
mythtv/bindings/python/MythTV/mythproto.py | 4
mythtv/bindings/python/MythTV/static.py | 2
mythtv/configure | 15
mythtv/docs/doxygen-create-developer-docs.cfg | 2
mythtv/filters/yadif/filter_yadif.c | 2
mythtv/i18n/mythfrontend_fi.qm |binary
mythtv/i18n/mythfrontend_fi.ts | 3662 ++++++----
mythtv/i18n/mythfrontend_nb.qm |binary
mythtv/i18n/mythfrontend_nb.ts | 2
mythtv/libs/libmyth/audio/audiooutputalsa.cpp | 2
mythtv/libs/libmyth/audio/audiooutputbase.cpp | 55
mythtv/libs/libmyth/audio/audiooutputbase.h | 4
mythtv/libs/libmyth/audio/audiooutputca.cpp | 2
mythtv/libs/libmyth/audio/audiooutputdigitalencoder.cpp | 27
mythtv/libs/libmyth/remoteutil.cpp | 16
mythtv/libs/libmyth/remoteutil.h | 1
mythtv/libs/libmyth/rssparse.h | 1
mythtv/libs/libmythbase/bonjourregister.cpp | 5
mythtv/libs/libmythbase/compat.h | 2
mythtv/libs/libmythbase/logging.cpp | 3
mythtv/libs/libmythbase/serverpool.cpp | 46
mythtv/libs/libmythprotoserver/requesthandler/deletethread.cpp | 6
mythtv/libs/libmythsoundtouch/STTypes.h | 2
mythtv/libs/libmythsoundtouch/libmythsoundtouch.pro | 1
mythtv/libs/libmythtv/audioinput.h | 1
mythtv/libs/libmythtv/avformatdecoder.cpp | 10
mythtv/libs/libmythtv/dvdringbuffer.cpp | 49
mythtv/libs/libmythtv/fileringbuffer.cpp | 6
mythtv/libs/libmythtv/libmythtv.pro | 1
mythtv/libs/libmythtv/mythairplayserver.cpp | 2
mythtv/libs/libmythtv/mythplayer.cpp | 30
mythtv/libs/libmythtv/mythplayer.h | 3
mythtv/libs/libmythtv/mythraopconnection.cpp | 262
mythtv/libs/libmythtv/mythraopconnection.h | 13
mythtv/libs/libmythtv/mythraopdevice.cpp | 13
mythtv/libs/libmythtv/osd.cpp | 2
mythtv/libs/libmythtv/playercontext.h | 4
mythtv/libs/libmythtv/ringbuffer.cpp | 8
mythtv/libs/libmythtv/teletextscreen.cpp | 8
mythtv/libs/libmythtv/tv_play.cpp | 26
mythtv/libs/libmythtv/tv_rec.cpp | 3
mythtv/libs/libmythtv/tvremoteutil.cpp | 55
mythtv/libs/libmythtv/tvremoteutil.h | 7
mythtv/libs/libmythtv/videodisplayprofile.cpp | 3
mythtv/libs/libmythtv/videodisplayprofile.h | 2
mythtv/libs/libmythtv/videoout_xv.cpp | 7
mythtv/libs/libmythtv/videoout_xv.h | 1
mythtv/libs/libmythtv/videooutbase.cpp | 48
mythtv/libs/libmythui/mythmainwindow.cpp | 2
mythtv/libs/libmythupnp/httprequest.cpp | 1
mythtv/programs/mythbackend/filetransfer.cpp | 4
mythtv/programs/mythfrontend/audiogeneralsettings.cpp | 5
mythtv/programs/mythfrontend/globalsettings.cpp | 2
mythtv/programs/mythfrontend/guidegrid.cpp | 8
mythtv/programs/mythfrontend/scheduleeditor.cpp | 7
mythtv/programs/mythtranscode/transcode.h | 5
mythtv/programs/mythutil/markuputils.cpp | 4
mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py | 2
81 files changed, 5628 insertions(+), 2144 deletions(-)
Index: mythtv-0.25-fixes.patch
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-15/mythtv-0.25-fixes.patch,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- mythtv-0.25-fixes.patch 23 Apr 2012 15:29:20 -0000 1.3
+++ mythtv-0.25-fixes.patch 30 Apr 2012 13:36:11 -0000 1.4
@@ -8,6 +8,7 @@
mythplugins/mythgame/i18n/mythgame_fi.ts | 178 +-
mythplugins/mythmusic/i18n/mythmusic_fi.qm | Bin 56677 -> 56868 bytes
mythplugins/mythmusic/i18n/mythmusic_fi.ts | 2219 ++++++++++--
+ mythplugins/mythmusic/mythmusic/visualize.cpp | 60 +-
mythplugins/mythnetvision/i18n/mythnetvision_fi.qm | Bin 10270 -> 11758 bytes
mythplugins/mythnetvision/i18n/mythnetvision_fi.ts | 96 +-
.../mythnetvision/mythnetvision/nettree.cpp | 8 +-
@@ -20,7 +21,7 @@
.../mythzoneminder/i18n/mythzoneminder_fi.ts | 84 +-
.../mythzoneminder/mythzmserver/zmserver.cpp | 3 -
mythtv/VERSION | 2 +-
- mythtv/bindings/python/MythTV/mythproto.py | 2 +-
+ mythtv/bindings/python/MythTV/mythproto.py | 4 +-
mythtv/bindings/python/MythTV/static.py | 2 +-
mythtv/configure | 15 +-
mythtv/docs/doxygen-create-developer-docs.cfg | 2 +-
@@ -37,6 +38,7 @@
mythtv/libs/libmyth/remoteutil.cpp | 16 -
mythtv/libs/libmyth/remoteutil.h | 1 -
mythtv/libs/libmyth/rssparse.h | 1 +
+ mythtv/libs/libmythbase/bonjourregister.cpp | 5 +-
mythtv/libs/libmythbase/compat.h | 2 +
mythtv/libs/libmythbase/logging.cpp | 3 +-
mythtv/libs/libmythbase/serverpool.cpp | 46 +-
@@ -46,15 +48,20 @@
mythtv/libs/libmythtv/audioinput.h | 1 +
mythtv/libs/libmythtv/avformatdecoder.cpp | 10 +-
mythtv/libs/libmythtv/dvdringbuffer.cpp | 49 +-
+ mythtv/libs/libmythtv/fileringbuffer.cpp | 6 +-
mythtv/libs/libmythtv/libmythtv.pro | 1 +
mythtv/libs/libmythtv/mythairplayserver.cpp | 2 +-
mythtv/libs/libmythtv/mythplayer.cpp | 30 +-
mythtv/libs/libmythtv/mythplayer.h | 3 +
- mythtv/libs/libmythtv/mythraopdevice.cpp | 5 +-
+ mythtv/libs/libmythtv/mythraopconnection.cpp | 262 +-
+ mythtv/libs/libmythtv/mythraopconnection.h | 13 +-
+ mythtv/libs/libmythtv/mythraopdevice.cpp | 13 +-
+ mythtv/libs/libmythtv/osd.cpp | 2 +-
mythtv/libs/libmythtv/playercontext.h | 4 +-
mythtv/libs/libmythtv/ringbuffer.cpp | 8 +-
mythtv/libs/libmythtv/teletextscreen.cpp | 8 +-
mythtv/libs/libmythtv/tv_play.cpp | 26 +-
+ mythtv/libs/libmythtv/tv_rec.cpp | 3 +
mythtv/libs/libmythtv/tvremoteutil.cpp | 55 +-
mythtv/libs/libmythtv/tvremoteutil.h | 7 +-
mythtv/libs/libmythtv/videodisplayprofile.cpp | 3 -
@@ -64,13 +71,15 @@
mythtv/libs/libmythtv/videooutbase.cpp | 48 +-
mythtv/libs/libmythui/mythmainwindow.cpp | 2 +
mythtv/libs/libmythupnp/httprequest.cpp | 1 +
+ mythtv/programs/mythbackend/filetransfer.cpp | 4 +
.../programs/mythfrontend/audiogeneralsettings.cpp | 5 +-
mythtv/programs/mythfrontend/globalsettings.cpp | 2 +-
- mythtv/programs/mythfrontend/guidegrid.cpp | 4 +-
+ mythtv/programs/mythfrontend/guidegrid.cpp | 8 +-
mythtv/programs/mythfrontend/scheduleeditor.cpp | 7 +-
mythtv/programs/mythtranscode/transcode.h | 5 +-
mythtv/programs/mythutil/markuputils.cpp | 4 +-
- 72 files changed, 5420 insertions(+), 1981 deletions(-)
+ .../nv_python_libs/bliptv/bliptv_api.py | 2 +-
+ 81 files changed, 5628 insertions(+), 2144 deletions(-)
diff --git a/mythplugins/mytharchive/i18n/mytharchive_fi.qm b/mythplugins/mytharchive/i18n/mytharchive_fi.qm
index 2fc0f91..8e2d841 100644
@@ -4872,6 +4881,195 @@
</message>
</context>
</TS>
+diff --git a/mythplugins/mythmusic/mythmusic/visualize.cpp b/mythplugins/mythmusic/mythmusic/visualize.cpp
+index 66b050c..fac7989 100644
+--- a/mythplugins/mythmusic/mythmusic/visualize.cpp
++++ b/mythplugins/mythmusic/mythmusic/visualize.cpp
+@@ -168,11 +168,11 @@ bool StereoScope::process( VisualNode *node )
+ bool allZero = true;
+
+
+- if (node)
++ if (node)
+ {
+ double index = 0;
+ double const step = (double)SAMPLES_DEFAULT_SIZE / size.width();
+- for ( int i = 0; i < size.width(); i++)
++ for ( int i = 0; i < size.width(); i++)
+ {
+ unsigned long indexTo = (unsigned long)(index + step);
+ if (indexTo == (unsigned long)(index))
+@@ -194,13 +194,13 @@ bool StereoScope::process( VisualNode *node )
+ if ( valL < 0. )
+ valL = 0.;
+ }
+- if (valR < 0.)
++ if (valR < 0.)
+ {
+ valR += falloff;
+ if ( valR > 0. )
+ valR = 0.;
+- }
+- else
++ }
++ else
+ {
+ valR -= falloff;
+ if ( valR < 0. )
+@@ -208,7 +208,7 @@ bool StereoScope::process( VisualNode *node )
+ }
+ }
+ #endif
+- for (unsigned long s = (unsigned long)index; s < indexTo && s < node->length; s++)
++ for (unsigned long s = (unsigned long)index; s < indexTo && s < node->length; s++)
+ {
+ double tmpL = ( ( node->left ?
+ double( node->left[s] ) : 0.) *
+@@ -235,10 +235,10 @@ bool StereoScope::process( VisualNode *node )
+ index = index + step;
+ }
+ #if RUBBERBAND
+- }
+- else if (rubberband)
++ }
++ else if (rubberband)
+ {
+- for ( int i = 0; i < size.width(); i++)
++ for ( int i = 0; i < size.width(); i++)
+ {
+ double valL = magnitudes[ i ];
+ if (valL < 0) {
+@@ -271,8 +271,8 @@ bool StereoScope::process( VisualNode *node )
+ magnitudes[ i + size.width() ] = valR;
+ }
+ #endif
+- }
+- else
++ }
++ else
+ {
+ for ( int i = 0; (unsigned) i < magnitudes.size(); i++ )
+ magnitudes[ i ] = 0.;
+@@ -284,7 +284,7 @@ bool StereoScope::process( VisualNode *node )
+ bool StereoScope::draw( QPainter *p, const QColor &back )
+ {
+ p->fillRect(0, 0, size.width(), size.height(), back);
+- for ( int i = 1; i < size.width(); i++ )
++ for ( int i = 1; i < size.width(); i++ )
+ {
+ #if TWOCOLOUR
+ double r, g, b, per;
+@@ -611,7 +611,7 @@ Spectrum::Spectrum()
+ rplan = fftw_plan_dft_r2c_1d(FFTW_N, rin, (myth_fftw_complex_cast*)rout, FFTW_MEASURE);
+
+ startColor = QColor(0,0,255);
+- targetColor = QColor(255,0,0);
++ targetColor = QColor(255,0,0);
+ }
+
+ Spectrum::~Spectrum()
+@@ -679,7 +679,7 @@ bool Spectrum::process(VisualNode *node)
+ double *magnitudesp = magnitudes.data();
+ double magL, magR, tmp;
+
+- if (node)
++ if (node)
+ {
+ i = node->length;
+ if (i > FFTW_N)
+@@ -700,9 +700,9 @@ bool Spectrum::process(VisualNode *node)
+
+ for (i = 0; (int)i < rects.size(); i++, w += analyzerBarWidth)
+ {
+- magL = (log(sq(real(lout[index])) + sq(real(lout[FFTW_N - index]))) - 22.0) *
++ magL = (log(sq(real(lout[index])) + sq(real(lout[FFTW_N - index]))) - 22.0) *
+ scaleFactor;
+- magR = (log(sq(real(rout[index])) + sq(real(rout[FFTW_N - index]))) - 22.0) *
++ magR = (log(sq(real(rout[index])) + sq(real(rout[FFTW_N - index]))) - 22.0) *
+ scaleFactor;
+
+ if (magL > size.height() / 2)
+@@ -784,11 +784,11 @@ bool Spectrum::draw(QPainter *p, const QColor &back)
+
+ per = clamp(per, 1.0, 0.0);
+
+- r = startColor.red() +
++ r = startColor.red() +
+ (targetColor.red() - startColor.red()) * (per * per);
+- g = startColor.green() +
++ g = startColor.green() +
+ (targetColor.green() - startColor.green()) * (per * per);
+- b = startColor.blue() +
++ b = startColor.blue() +
+ (targetColor.blue() - startColor.blue()) * (per * per);
+
+ r = clamp(r, 255.0, 0.0);
+@@ -848,14 +848,14 @@ void Squares::resize (const QSize &newsize) {
+ size = newsize;
+ }
+
+-void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
++void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
+ {
+ double r, g, b, per;
+ int correction = (size.width() % rects.size ()) / 2;
+ int x = ((i / 2) * w) + correction;
+ int y;
+
+- if (i % 2 == 0)
++ if (i % 2 == 0)
+ {
+ y = c - h;
+ per = double(fake_height - rect->top()) / double(fake_height);
+@@ -866,15 +866,15 @@ void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
+ per = double(rect->bottom()) / double(fake_height);
+ }
+
+- per = clamp(per, 1.0, 0.0);
+-
+- r = startColor.red() +
++ per = clamp(per, 1.0, 0.0);
++
++ r = startColor.red() +
+ (targetColor.red() - startColor.red()) * (per * per);
+- g = startColor.green() +
++ g = startColor.green() +
+ (targetColor.green() - startColor.green()) * (per * per);
+- b = startColor.blue() +
++ b = startColor.blue() +
+ (targetColor.blue() - startColor.blue()) * (per * per);
+-
++
+ r = clamp(r, 255.0, 0.0);
+ g = clamp(g, 255.0, 0.0);
+ b = clamp(b, 255.0, 0.0);
+@@ -1496,7 +1496,7 @@ void AlbumArt::handleKeyPress(const QString &action)
+ /// this is the time an image is shown in the albumart visualizer
+ #define ALBUMARTCYCLETIME 10
+
+-bool AlbumArt::needsUpdate()
++bool AlbumArt::needsUpdate()
+ {
+ // if the track has changed we need to update the image
+ if (gPlayer->getCurrentMetadata() && m_currentMetadata != gPlayer->getCurrentMetadata())
+@@ -1536,7 +1536,7 @@ bool AlbumArt::draw(QPainter *p, const QColor &back)
+ }
+ }
+
+- if (m_image.isNull())
++ if (m_image.isNull())
+ {
+ drawWarning(p, back, m_size, QObject::tr("?"), 100);
+ return true;
+@@ -1581,7 +1581,7 @@ static class AlbumArtFactory : public VisFactory
+ Blank::Blank()
+ : VisualBase(true)
+ {
+- m_fps = 20;
++ m_fps = 1;
+ }
+
+ Blank::~Blank()
diff --git a/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm b/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm
index 38f9ca4..e8d8d66 100644
Binary files a/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm and b/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm differ
@@ -5552,7 +5750,7 @@
\ No newline at end of file
+SOURCE_VERSION="v0.25"
diff --git a/mythtv/bindings/python/MythTV/mythproto.py b/mythtv/bindings/python/MythTV/mythproto.py
-index 41a39e8..9a891cb 100644
+index 41a39e8..f7ae3e6 100644
--- a/mythtv/bindings/python/MythTV/mythproto.py
+++ b/mythtv/bindings/python/MythTV/mythproto.py
@@ -657,7 +657,7 @@ class FileOps( BECache ):
@@ -5564,6 +5762,15 @@
if host:
m.append(host)
return self.backendCommand(BACKEND_SEP.join(m))
+@@ -784,7 +784,7 @@ class FreeSpace( DictData ):
+ _field_order = [ 'host', 'path', 'islocal',
+ 'disknumber', 'sgroupid', 'blocksize',
+ 'totalspace', 'usedspace']
+- _field_type = [3, 3, 2, 0, 0, 0, 0, 0, 0, 0]
++ _field_type = [3, 3, 2, 0, 0, 0, 0, 0]
+ def __str__(self):
+ return "<FreeSpace '%s@%s' at %s>"\
+ % (self.path, self.host, hex(id(self)))
diff --git a/mythtv/bindings/python/MythTV/static.py b/mythtv/bindings/python/MythTV/static.py
index 6b587b2..f539706 100644
--- a/mythtv/bindings/python/MythTV/static.py
@@ -12494,6 +12701,33 @@
#include "mythexp.h"
+diff --git a/mythtv/libs/libmythbase/bonjourregister.cpp b/mythtv/libs/libmythbase/bonjourregister.cpp
+index 017ee6d..7f98732 100644
+--- a/mythtv/libs/libmythbase/bonjourregister.cpp
++++ b/mythtv/libs/libmythbase/bonjourregister.cpp
+@@ -5,6 +5,7 @@
+
+ #include "mythlogging.h"
+ #include "bonjourregister.h"
++#include "mythcorecontext.h"
+
+ #define LOC QString("Bonjour: ")
+
+@@ -41,11 +42,13 @@ bool BonjourRegister::Register(uint16_t port, const QByteArray &type,
+ return true;
+ }
+
++ QByteArray host(gCoreContext->GetSetting("BonjourHostname", "").toUtf8());
++ const char *host_ptr = host.size() > 0 ? host.constData() : NULL;
+ uint16_t qport = qToBigEndian(port);
+ DNSServiceErrorType res =
+ DNSServiceRegister(&m_dnssref, 0, 0, (const char*)name.data(),
+ (const char*)type.data(),
+- NULL, 0, qport, txt.size(), (void*)txt.data(),
++ NULL, host_ptr, qport, txt.size(), (void*)txt.data(),
+ BonjourCallback, this);
+
+ if (kDNSServiceErr_NoError != res)
diff --git a/mythtv/libs/libmythbase/compat.h b/mythtv/libs/libmythbase/compat.h
index ff2890f..425624a 100644
--- a/mythtv/libs/libmythbase/compat.h
@@ -12766,6 +13000,30 @@
LOG(VB_PLAYBACK, LOG_INFO, LOC +
QString("DVD Serial Number %1").arg(m_serialnumber));
+diff --git a/mythtv/libs/libmythtv/fileringbuffer.cpp b/mythtv/libs/libmythtv/fileringbuffer.cpp
+index f917416..2985f57 100644
+--- a/mythtv/libs/libmythtv/fileringbuffer.cpp
++++ b/mythtv/libs/libmythtv/fileringbuffer.cpp
+@@ -453,8 +453,8 @@ int FileRingBuffer::safe_read(int fd, void *data, uint sz)
+ tot += ret;
+ }
+
+- //if (oldfile)
+- //break;
++ if (oldfile)
++ break;
+
+ if (ret == 0) // EOF returns 0
+ {
+@@ -465,7 +465,7 @@ int FileRingBuffer::safe_read(int fd, void *data, uint sz)
+
+ // 0.36 second timeout for livetvchain with usleep(60000),
+ // or 2.4 seconds if it's a new file less than 30 minutes old.
+- if (zerocnt >= (oldfile ? 4 : (livetvchain ? 6 : 40)))
++ if (zerocnt >= (livetvchain ? 6 : 40))
+ {
+ break;
+ }
diff --git a/mythtv/libs/libmythtv/libmythtv.pro b/mythtv/libs/libmythtv/libmythtv.pro
index f50d2cb..6df71d0 100644
--- a/mythtv/libs/libmythtv/libmythtv.pro
@@ -12867,19 +13125,501 @@
};
#endif
+diff --git a/mythtv/libs/libmythtv/mythraopconnection.cpp b/mythtv/libs/libmythtv/mythraopconnection.cpp
+index 962c142..df0b3a9 100644
+--- a/mythtv/libs/libmythtv/mythraopconnection.cpp
++++ b/mythtv/libs/libmythtv/mythraopconnection.cpp
+@@ -1,6 +1,3 @@
+-// TODO
+-// remove hardcoded frames per packet
+-
+ #include <QTimer>
+ #include <QTcpSocket>
+ #include <QUdpSocket>
+@@ -23,6 +20,22 @@
+
+ RSA* MythRAOPConnection::g_rsa = NULL;
+
++class NetStream : public QTextStream
++{
++public:
++ NetStream(QIODevice *device) : QTextStream(device)
++ {
++ };
++ NetStream &operator<<(const QString &str)
++ {
++ LOG(VB_GENERAL, LOG_DEBUG,
++ LOC + QString("Sending(%1): ").arg(str.length()) + str);
++ QTextStream *q = this;
++ *q << str;
++ return *this;
++ };
++};
++
+ MythRAOPConnection::MythRAOPConnection(QObject *parent, QTcpSocket *socket,
+ QByteArray id, int port)
+ : QObject(parent), m_watchdogTimer(NULL), m_socket(socket),
+@@ -87,7 +100,7 @@ MythRAOPConnection::~MythRAOPConnection()
+ bool MythRAOPConnection::Init(void)
+ {
+ // connect up the request socket
+- m_textStream = new QTextStream(m_socket);
++ m_textStream = new NetStream(m_socket);
+ m_textStream->setCodec("UTF-8");
+ if (!connect(m_socket, SIGNAL(readyRead()), this, SLOT(readClient())))
+ {
+@@ -138,6 +151,24 @@ bool MythRAOPConnection::Init(void)
+ return true;
+ }
+
++void MythRAOPConnection::udpDataReady(void)
++{
++ QUdpSocket *socket = dynamic_cast<QUdpSocket*>(sender());
++
++ while (socket->state() == QAbstractSocket::BoundState &&
++ socket->hasPendingDatagrams())
++ {
++ QByteArray buffer;
++ buffer.resize(socket->pendingDatagramSize());
++ QHostAddress sender;
++ quint16 senderPort;
++
++ socket->readDatagram(buffer.data(), buffer.size(),
++ &sender, &senderPort);
++ udpDataReady(buffer, sender, senderPort);
++ }
++}
++
+ void MythRAOPConnection::udpDataReady(QByteArray buf, QHostAddress peer,
+ quint16 port)
+ {
+@@ -191,7 +222,8 @@ void MythRAOPConnection::udpDataReady(QByteArray buf, QHostAddress peer,
+ m_resends.remove(this_sequence);
+ }
+ else
+- LOG(VB_GENERAL, LOG_WARNING, LOC + "Received unexpected resent packet.");
++ LOG(VB_GENERAL, LOG_WARNING, LOC + QString("Received unexpected resent packet %1")
++ .arg(this_sequence));
+ }
+
+ ExpireResendRequests(timenow);
+@@ -332,12 +364,13 @@ void MythRAOPConnection::ProcessSyncPacket(const QByteArray &buf, uint64_t timen
+
+ if (m_audio)
+ {
++ uint64_t total = averageaudio + averagequeue;
+ LOG(VB_GENERAL, LOG_DEBUG, LOC +
+ QString("Sync packet: Timestamp: %1 Current Audio ts: %2 (avsync %3ms) "
+ "Latency: audio %4 queue %5 total %6ms <-> target %7ms")
+ .arg(m_lastSyncTimestamp).arg(m_audio->GetAudiotime()).arg(averageav, 0)
+ .arg(averageaudio).arg(averagequeue)
+- .arg(averageaudio + averagequeue).arg(m_lastLatency));
++ .arg(total).arg(m_lastLatency));
+ }
+ m_latencyAudio = m_latencyQueued = m_latencyCounter = m_avSync = 0;
+ }
+@@ -463,78 +496,82 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ return;
+ }
+
+- QByteArray option = lines[0].left(lines[0].indexOf(" "));
++ *m_textStream << "RTSP/1.0 200 OK\r\n";
+
+- if (option == "OPTIONS")
++ if (tags.contains("Apple-Challenge"))
+ {
+- StartResponse(m_textStream);
+- if (tags.contains("Apple-Challenge"))
+- {
+- *m_textStream << "Apple-Response: ";
+- if (!LoadKey())
+- return;
+- int tosize = RSA_size(LoadKey());
+- unsigned char to[tosize];
+-
+- QByteArray challenge = QByteArray::fromBase64(tags["Apple-Challenge"].data());
+- int challenge_size = challenge.size();
+- if (challenge_size != 16)
+- {
+- LOG(VB_GENERAL, LOG_ERR, LOC +
+- QString("Decoded challenge size %1, expected 16").arg(challenge_size));
+- if (challenge_size > 16)
+- challenge_size = 16;
+- }
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Received Apple-Challenge"));
+
+- int i = 0;
+- unsigned char from[38];
+- memcpy(from, challenge.data(), challenge_size);
+- i += challenge_size;
+- if (m_socket->localAddress().protocol() == QAbstractSocket::IPv4Protocol)
+- {
+- uint32_t ip = m_socket->localAddress().toIPv4Address();
+- ip = qToBigEndian(ip);
+- memcpy(from + i, &ip, 4);
+- i += 4;
+- }
+- else if (m_socket->localAddress().protocol() == QAbstractSocket::IPv6Protocol)
+- {
+- // NB IPv6 untested
+- Q_IPV6ADDR ip = m_socket->localAddress().toIPv6Address();
+- //ip = qToBigEndian(ip);
+- memcpy(from + i, &ip, 16);
+- i += 16;
+- }
+- memcpy(from + i, m_hardwareId.data(), RAOP_HARDWARE_ID_SIZE);
+- i += RAOP_HARDWARE_ID_SIZE;
++ *m_textStream << "Apple-Response: ";
++ if (!LoadKey())
++ return;
++ int tosize = RSA_size(LoadKey());
++ unsigned char to[tosize];
+
+- int pad = 32 - i;
+- if (pad > 0)
+- {
+- memset(from + i, 0, pad);
+- i += pad;
+- }
++ QByteArray challenge = QByteArray::fromBase64(tags["Apple-Challenge"].data());
++ int challenge_size = challenge.size();
++ if (challenge_size != 16)
++ {
++ LOG(VB_GENERAL, LOG_ERR, LOC +
++ QString("Decoded challenge size %1, expected 16").arg(challenge_size));
++ if (challenge_size > 16)
++ challenge_size = 16;
++ }
++
++ int i = 0;
++ unsigned char from[38];
++ memcpy(from, challenge.data(), challenge_size);
++ i += challenge_size;
++ if (m_socket->localAddress().protocol() == QAbstractSocket::IPv4Protocol)
++ {
++ uint32_t ip = m_socket->localAddress().toIPv4Address();
++ ip = qToBigEndian(ip);
++ memcpy(from + i, &ip, 4);
++ i += 4;
++ }
++ else if (m_socket->localAddress().protocol() == QAbstractSocket::IPv6Protocol)
++ {
++ // NB IPv6 untested
++ Q_IPV6ADDR ip = m_socket->localAddress().toIPv6Address();
++ //ip = qToBigEndian(ip);
++ memcpy(from + i, &ip, 16);
++ i += 16;
++ }
++ memcpy(from + i, m_hardwareId.data(), RAOP_HARDWARE_ID_SIZE);
++ i += RAOP_HARDWARE_ID_SIZE;
+
+- LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Full base64 response: '%1' size %2")
+- .arg(QByteArray((const char*)from, i).toBase64().data()).arg(i));
++ int pad = 32 - i;
++ if (pad > 0)
++ {
++ memset(from + i, 0, pad);
++ i += pad;
++ }
+
+- RSA_private_encrypt(i, from, to, LoadKey(), RSA_PKCS1_PADDING);
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Full base64 response: '%1' size %2")
++ .arg(QByteArray((const char*)from, i).toBase64().data()).arg(i));
+
+- QByteArray base64 = QByteArray((const char*)to, tosize).toBase64();
++ RSA_private_encrypt(i, from, to, LoadKey(), RSA_PKCS1_PADDING);
+
+- for (int pos = base64.size() - 1; pos > 0; pos--)
+- {
+- if (base64[pos] == '=')
+- base64[pos] = ' ';
+- else
+- break;
+- }
++ QByteArray base64 = QByteArray((const char*)to, tosize).toBase64();
+
+- *m_textStream << base64.trimmed() << "\r\n";
++ for (int pos = base64.size() - 1; pos > 0; pos--)
++ {
++ if (base64[pos] == '=')
++ base64[pos] = ' ';
++ else
++ break;
+ }
++ LOG(VB_GENERAL, LOG_DEBUG, QString("tSize=%1 tLen=%2 tResponse=%3")
++ .arg(tosize).arg(base64.size()).arg(base64.data()));
++ *m_textStream << base64.trimmed() << "\r\n";
++ }
+
++ QByteArray option = lines[0].left(lines[0].indexOf(" "));
++
++ if (option == "OPTIONS")
++ {
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ *m_textStream << "Public: ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, TEARDOWN, OPTIONS, GET_PARAMETER, SET_PARAMETER\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+ }
+ else if (option == "ANNOUNCE")
+ {
+@@ -589,9 +626,7 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Audio parameter: %1").arg(fmt));
+ }
+ }
+-
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+ else if (option == "SETUP")
+ {
+@@ -617,14 +652,6 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ QString("control port: %1 timing port: %2")
+ .arg(control_port).arg(timing_port));
+
+- StartResponse(m_textStream);
+- *m_textStream << "Transport: " << tags["Transport"];
+- *m_textStream << ";server_port=" << QString::number(m_dataPort) << "\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+-
+- if (OpenAudioDevice())
+- CreateDecoder();
+-
+ if (m_clientControlSocket)
+ {
+ m_clientControlSocket->disconnect();
+@@ -632,21 +659,31 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ delete m_clientControlSocket;
+ }
+
+- m_clientControlSocket = new ServerPool(this);
++ m_clientControlSocket = new QUdpSocket(this);
+ if (!m_clientControlSocket->bind(control_port))
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC +
+- QString("Failed to bind to client control port %1").arg(control_port));
++ QString("Failed to bind to client control port %1. "
++ "Control of audio stream may fail")
++ .arg(control_port));
+ }
+ else
+ {
+ LOG(VB_GENERAL, LOG_INFO, LOC +
+ QString("Bound to client control port %1").arg(control_port));
+- m_peerAddress = m_socket->peerAddress();
+- m_clientControlPort = control_port;
+- connect(m_clientControlSocket, SIGNAL(newDatagram(QByteArray, QHostAddress, quint16)),
+- this, SLOT(udpDataReady(QByteArray, QHostAddress, quint16)));
+ }
++
++ if (OpenAudioDevice())
++ CreateDecoder();
++
++ m_peerAddress = m_socket->peerAddress();
++ m_clientControlPort = control_port;
++ connect(m_clientControlSocket, SIGNAL(readyRead()), this, SLOT(udpDataReady()));
++
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ *m_textStream << "Transport: " << tags["Transport"].data();
++ *m_textStream << ";server_port=" << QString::number(m_dataPort);
++ *m_textStream << "\r\nSession: MYTHTV\r\n";
+ }
+ else
+ {
+@@ -656,13 +693,24 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ }
+ else if (option == "RECORD")
+ {
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ }
++ else if (option == "TEARDOWN")
++ {
++ *m_textStream << "Connection: close\r\n";
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ }
++ else if (option == "FLUSH")
++ {
++ ResetAudio();
++ *m_textStream << "flush\r\n";
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+ else if (option == "SET_PARAMETER")
+ {
+ foreach (QByteArray line, lines)
+ {
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ if (line.startsWith("volume:") && m_allowVolumeControl && m_audio)
+ {
+ QByteArray rawvol = line.mid(7).trimmed();
+@@ -674,43 +722,34 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ m_audio->SetCurrentVolume((int)volume);
+ }
+ }
+-
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+- }
+- else if (option == "FLUSH")
+- {
+- ResetAudio();
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+ }
+- else if (option == "TEARDOWN")
++ else
+ {
+- StartResponse(m_textStream);
+- *m_textStream << "Connection: close\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Command not handled: %1")
++ .arg(option.data()));
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+-
++ FinishResponse(m_textStream, m_socket, option, tags["CSeq"]);
+ }
+
+-void MythRAOPConnection::StartResponse(QTextStream *stream)
++void MythRAOPConnection::StartResponse(NetStream *stream,
++ QByteArray &option, QByteArray &cseq)
+ {
+ if (!stream)
+ return;
+- *stream << "RTSP/1.0 200 OK\r\n";
+-}
+-
+-void MythRAOPConnection::FinishResponse(QTextStream *stream, QTcpSocket *socket,
+- QByteArray &option, QByteArray &cseq)
+-{
+ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("%1 sequence %2")
+ .arg(option.data()).arg(cseq.data()));
+ *stream << "Audio-Jack-Status: connected; type=analog\r\n";
+ *stream << "CSeq: " << cseq << "\r\n";
++}
++
++void MythRAOPConnection::FinishResponse(NetStream *stream, QTcpSocket *socket,
++ QByteArray &option, QByteArray &cseq)
++{
+ *stream << "\r\n";
+ stream->flush();
+- LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Send: %1")
+- .arg(socket->flush()));
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Finished %1 %2 , Send: %3")
++ .arg(option.data()).arg(cseq.data()).arg(socket->flush()));
+ }
+
+ RSA* MythRAOPConnection::LoadKey(void)
+@@ -797,7 +836,7 @@ bool MythRAOPConnection::CreateDecoder(void)
+ extradata[13] = (fs >> 16) & 0xff;
+ extradata[14] = (fs >> 8) & 0xff;
+ extradata[15] = fs & 0xff;
+- extradata[16] = 2; // channels
++ extradata[16] = m_channels; // channels
+ extradata[17] = m_audioFormat[3]; // sample size
+ extradata[18] = m_audioFormat[4]; // rice_historymult
+ extradata[19] = m_audioFormat[5]; // rice_initialhistory
+@@ -805,7 +844,7 @@ bool MythRAOPConnection::CreateDecoder(void)
+ }
+ m_codeccontext->extradata = extradata;
+ m_codeccontext->extradata_size = 36;
+- m_codeccontext->channels = 2;
++ m_codeccontext->channels = m_channels;
+ if (avcodec_open(m_codeccontext, m_codec) < 0)
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to open ALAC decoder - going silent...");
+@@ -834,6 +873,7 @@ bool MythRAOPConnection::OpenAudioDevice(void)
+ CloseAudioDevice();
+
+ m_sampleRate = m_audioFormat.size() >= 12 ? m_audioFormat[11] : DEFAULT_SAMPLE_RATE;
++ m_channels = m_audioFormat[7] > 0 ? m_audioFormat[7] : 2;
+ if (m_sampleRate < 1)
+ m_sampleRate = DEFAULT_SAMPLE_RATE;
+
+@@ -841,7 +881,7 @@ bool MythRAOPConnection::OpenAudioDevice(void)
+ ? gCoreContext->GetSetting("PassThruOutputDevice") : QString::null;
+ QString device = gCoreContext->GetSetting("AudioOutputDevice");
+
+- m_audio = AudioOutput::OpenAudio(device, passthru, FORMAT_S16, 2,
++ m_audio = AudioOutput::OpenAudio(device, passthru, FORMAT_S16, m_channels,
+ 0, m_sampleRate, AUDIOOUTPUT_MUSIC,
+ m_allowVolumeControl, false);
+ if (!m_audio)
+diff --git a/mythtv/libs/libmythtv/mythraopconnection.h b/mythtv/libs/libmythtv/mythraopconnection.h
+index 9d56d4e..e229f83 100644
+--- a/mythtv/libs/libmythtv/mythraopconnection.h
++++ b/mythtv/libs/libmythtv/mythraopconnection.h
+@@ -15,12 +15,12 @@ extern "C" {
+ #include "libavformat/avformat.h"
+ }
+
+-class QTextStream;
+ class QTcpSocket;
+ class QUdpSocket;
+ class QTimer;
+ class AudioOutput;
+ class ServerPool;
++class NetStream;
+
+ typedef QHash<QByteArray,QByteArray> RawHash;
+
+@@ -42,6 +42,7 @@ class MythRAOPConnection : public QObject
+ public slots:
+ void readClient(void);
+ void udpDataReady(QByteArray buf, QHostAddress peer, quint16 port);
++ void udpDataReady(void);
+ void timeout(void);
+ void audioRetry(void);
+
+@@ -58,8 +59,9 @@ class MythRAOPConnection : public QObject
+ void ProcessAudio(uint64_t timenow);
+ void ResetAudio(void);
+ void ProcessRequest(const QList<QByteArray> &lines);
+- void StartResponse(QTextStream *stream);
+- void FinishResponse(QTextStream *stream, QTcpSocket *socket,
++ void StartResponse(NetStream *stream,
++ QByteArray &option, QByteArray &cseq);
++ void FinishResponse(NetStream *stream, QTcpSocket *socket,
+ QByteArray &option, QByteArray &cseq);
+ RawHash FindTags(const QList<QByteArray> &lines);
+ bool CreateDecoder(void);
+@@ -72,13 +74,13 @@ class MythRAOPConnection : public QObject
+ QTimer *m_watchdogTimer;
+ // comms socket
+ QTcpSocket *m_socket;
+- QTextStream *m_textStream;
++ NetStream *m_textStream;
+ QByteArray m_hardwareId;
+ // incoming audio
+ QHostAddress m_peerAddress;
+ int m_dataPort;
+ ServerPool *m_dataSocket;
+- ServerPool *m_clientControlSocket;
++ QUdpSocket *m_clientControlSocket;
+ int m_clientControlPort;
+ QMap<uint16_t,uint64_t> m_resends;
+ // crypto
+@@ -91,6 +93,7 @@ class MythRAOPConnection : public QObject
+ AVCodecContext *m_codeccontext;
+ QList<int> m_audioFormat;
+ int m_sampleRate;
++ int m_channels;
+ typedef struct
+ {
+ int16_t *samples;
diff --git a/mythtv/libs/libmythtv/mythraopdevice.cpp b/mythtv/libs/libmythtv/mythraopdevice.cpp
-index 82a6a61..f27f166 100644
+index 82a6a61..bad4932 100644
--- a/mythtv/libs/libmythtv/mythraopdevice.cpp
+++ b/mythtv/libs/libmythtv/mythraopdevice.cpp
-@@ -1,6 +1,7 @@
+@@ -1,6 +1,6 @@
#include <QTimer>
#include <QtEndian>
- #include <QTcpSocket>
+-#include <QTcpSocket>
+#include <QNetworkInterface>
#include "mthread.h"
#include "mythlogging.h"
-@@ -131,7 +132,7 @@ void MythRAOPDevice::Start(void)
+@@ -131,7 +131,7 @@ void MythRAOPDevice::Start(void)
int baseport = m_setupPort;
while (m_setupPort < baseport + RAOP_PORT_RANGE)
{
@@ -12888,7 +13628,28 @@
{
LOG(VB_GENERAL, LOG_INFO, LOC +
QString("Listening for connections on port %1").arg(m_setupPort));
-@@ -242,8 +243,8 @@ void MythRAOPDevice::deleteClient(void)
+@@ -145,11 +145,6 @@ void MythRAOPDevice::Start(void)
+
+ // announce service
+ m_bonjour = new BonjourRegister(this);
+- if (!m_bonjour)
+- {
+- LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to create Bonjour object.");
+- return;
+- }
+
+ // give each frontend a unique name
+ int multiple = m_setupPort - baseport;
+@@ -176,6 +171,8 @@ void MythRAOPDevice::Start(void)
+ txt.append(4); txt.append("vn=3");
+ txt.append(9); txt.append("txtvers=1");
+
++ LOG(VB_GENERAL, LOG_INFO, QString("Registering service %1.%2 port %3 TXT %4")
++ .arg(QString(name)).arg(QString(type)).arg(m_setupPort).arg(QString(txt)));
+ if (!m_bonjour->Register(m_setupPort, type, name, txt))
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to register service.");
+@@ -242,8 +239,8 @@ void MythRAOPDevice::deleteClient(void)
if ((*it)->GetSocket()->state() == QTcpSocket::UnconnectedState)
{
LOG(VB_GENERAL, LOG_INFO, LOC + "Removing client connection.");
@@ -12898,6 +13659,19 @@
return;
}
}
+diff --git a/mythtv/libs/libmythtv/osd.cpp b/mythtv/libs/libmythtv/osd.cpp
+index 207ecef..d0860db 100644
+--- a/mythtv/libs/libmythtv/osd.cpp
++++ b/mythtv/libs/libmythtv/osd.cpp
+@@ -428,7 +428,7 @@ void OSD::SetText(const QString &window, QHash<QString,QString> &map,
+ if (!iconpath.isEmpty())
+ {
+ QString iconurl =
+- gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ iconpath);
+
+ icon->SetFilename(iconurl);
diff --git a/mythtv/libs/libmythtv/playercontext.h b/mythtv/libs/libmythtv/playercontext.h
index 5854de4..a4ce9f1 100644
--- a/mythtv/libs/libmythtv/playercontext.h
@@ -12922,39 +13696,59 @@
PlayerContext(const QString &inUseID = QString("Unknown"));
~PlayerContext();
diff --git a/mythtv/libs/libmythtv/ringbuffer.cpp b/mythtv/libs/libmythtv/ringbuffer.cpp
-index e3f0a5a..3883de2 100644
+index e3f0a5a..5e720c2 100644
--- a/mythtv/libs/libmythtv/ringbuffer.cpp
+++ b/mythtv/libs/libmythtv/ringbuffer.cpp
-@@ -724,6 +724,7 @@ void RingBuffer::run(void)
- struct timeval lastread, now;
- int readtimeavg = 300;
- bool ignore_for_read_timing = true;
-+ bool did_set_oldfile = false;
+@@ -553,6 +553,7 @@ void RingBuffer::KillReadAheadThread(void)
+ */
+ void RingBuffer::StopReads(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "StopReads()");
+ stopreads = true;
+ generalWait.wakeAll();
+ }
+@@ -563,6 +564,7 @@ void RingBuffer::StopReads(void)
+ */
+ void RingBuffer::StartReads(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "StartReads()");
+ stopreads = false;
+ generalWait.wakeAll();
+ }
+@@ -573,6 +575,7 @@ void RingBuffer::StartReads(void)
+ */
+ void RingBuffer::Pause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "Pause()");
+ StopReads();
- gettimeofday(&lastread, NULL); // this is just to keep gcc happy
+ rwlock.lockForWrite();
+@@ -586,6 +589,7 @@ void RingBuffer::Pause(void)
+ */
+ void RingBuffer::Unpause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "Unpause()");
+ StartReads();
-@@ -842,8 +843,12 @@ void RingBuffer::run(void)
+ rwlock.lockForWrite();
+@@ -842,9 +846,6 @@ void RingBuffer::run(void)
"Reading enough data to start playback");
}
- if (remotefile && livetvchain && livetvchain->HasNext())
-+ if (!did_set_oldfile && remotefile && livetvchain &&
-+ livetvchain->HasNext())
-+ {
- remotefile->SetTimeout(true);
-+ did_set_oldfile = true;
-+ }
-
+- remotefile->SetTimeout(true);
+-
LOG(VB_FILE, LOG_DEBUG, LOC +
QString("safe_read(...@%1, %2) -- begin")
-@@ -917,6 +922,7 @@ void RingBuffer::run(void)
- {
- livetvchain->SwitchToNext(true);
- setswitchtonext = true;
-+ did_set_oldfile = false;
- }
- }
- else
+ .arg(rbwpos).arg(totfree));
+@@ -1551,6 +1552,7 @@ void RingBuffer::SetWriteBufferMinWriteSize(int newMinSize)
+ */
+ void RingBuffer::SetOldFile(bool is_old)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + QString("SetOldFile(%1)").arg(is_old));
+ rwlock.lockForWrite();
+ oldfile = is_old;
+ rwlock.unlock();
diff --git a/mythtv/libs/libmythtv/teletextscreen.cpp b/mythtv/libs/libmythtv/teletextscreen.cpp
index 5490672..6bb0e13 100644
--- a/mythtv/libs/libmythtv/teletextscreen.cpp
@@ -13056,6 +13850,21 @@
vector<uint> interesting = CardUtil::GetCardIDs(sourceid);
// filter disconnected cards
+diff --git a/mythtv/libs/libmythtv/tv_rec.cpp b/mythtv/libs/libmythtv/tv_rec.cpp
+index bf15151..3311360 100644
+--- a/mythtv/libs/libmythtv/tv_rec.cpp
++++ b/mythtv/libs/libmythtv/tv_rec.cpp
+@@ -1080,7 +1080,10 @@ void TVRec::TeardownRecorder(uint request_flags)
+ }
+
+ if (ringBuffer)
++ {
++ LOG(VB_FILE, LOG_INFO, LOC + "calling StopReads()");
+ ringBuffer->StopReads();
++ }
+
+ if (curRecording)
+ {
diff --git a/mythtv/libs/libmythtv/tvremoteutil.cpp b/mythtv/libs/libmythtv/tvremoteutil.cpp
index d348d64..a73cc52 100644
--- a/mythtv/libs/libmythtv/tvremoteutil.cpp
@@ -13362,6 +14171,42 @@
{ "pdf" , "application/pdf" },
{ "avi" , "video/avi" },
{ "css" , "text/css" },
+diff --git a/mythtv/programs/mythbackend/filetransfer.cpp b/mythtv/programs/mythbackend/filetransfer.cpp
+index c339dc2..7c9d173 100644
+--- a/mythtv/programs/mythbackend/filetransfer.cpp
++++ b/mythtv/programs/mythbackend/filetransfer.cpp
+@@ -7,6 +7,7 @@
+ #include "mythmiscutil.h"
+ #include "mythsocket.h"
+ #include "programinfo.h"
++#include "mythlogging.h"
+
+ FileTransfer::FileTransfer(QString &filename, MythSocket *remote,
+ bool usereadahead, int timeout_ms) :
+@@ -94,6 +95,7 @@ void FileTransfer::Stop(void)
+ if (readthreadlive)
+ {
+ readthreadlive = false;
++ LOG(VB_FILE, LOG_INFO, "calling StopReads()");
+ rbuffer->StopReads();
+ QMutexLocker locker(&lock);
+ readsLocked = true;
+@@ -108,6 +110,7 @@ void FileTransfer::Stop(void)
+
+ void FileTransfer::Pause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, "calling StopReads()");
+ rbuffer->StopReads();
+ QMutexLocker locker(&lock);
+ readsLocked = true;
+@@ -118,6 +121,7 @@ void FileTransfer::Pause(void)
+
+ void FileTransfer::Unpause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, "calling StartReads()");
+ rbuffer->StartReads();
+ {
+ QMutexLocker locker(&lock);
diff --git a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp b/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
index 7a676fd..7d40e09 100644
--- a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
@@ -13399,7 +14244,7 @@
!profiles.contains("OpenGL High Quality") &&
!profiles.contains("OpenGL Slim"))
diff --git a/mythtv/programs/mythfrontend/guidegrid.cpp b/mythtv/programs/mythfrontend/guidegrid.cpp
-index 6dbf1aa..17d5fad 100644
+index 6dbf1aa..4ddac0e 100644
--- a/mythtv/programs/mythfrontend/guidegrid.cpp
+++ b/mythtv/programs/mythfrontend/guidegrid.cpp
@@ -1390,11 +1390,11 @@ void GuideGrid::customEvent(QEvent *event)
@@ -13416,6 +14261,24 @@
{
enter();
}
+@@ -1578,7 +1578,7 @@ void GuideGrid::updateChannels(void)
+ if (!chinfo->icon.isEmpty())
+ {
+ QString iconurl =
+- gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ chinfo->icon);
+ item->SetImage(iconurl, "channelicon");
+ }
+@@ -1612,7 +1612,7 @@ void GuideGrid::updateInfo(void)
+ m_channelImage->Reset();
+ if (!chinfo->icon.isEmpty())
+ {
+- QString iconurl = gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ QString iconurl = gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ chinfo->icon);
+
+ m_channelImage->SetFilename(iconurl);
diff --git a/mythtv/programs/mythfrontend/scheduleeditor.cpp b/mythtv/programs/mythfrontend/scheduleeditor.cpp
index 4f85c70..877371a 100644
--- a/mythtv/programs/mythfrontend/scheduleeditor.cpp
@@ -13474,3 +14337,16 @@
return GENERIC_EXIT_OK;
}
+diff --git a/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py b/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
+index 2f2ad3b..4abbf69 100644
+--- a/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
++++ b/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
+@@ -187,7 +187,7 @@ class Videos(object):
+ self.config[u'urls'] = {}
+
+ # v2 api calls - An example that must be customized for each target site
+- self.config[u'urls'][u'video.search'] = "http://www.blip.tv/search?q=%s;&page=%s;&pagelen=%s;&language_code=%s;&sk..."
++ self.config[u'urls'][u'video.search'] = "http://www.blip.tv/?search=%s;&page=%s;&pagelen=%s;&language_code=%s;&ski..."
+ self.config[u'urls'][u'categories'] = "http://www.blip.tv/?section=categories&cmd=view&skin=api"
+
+ self.config[u'image_extentions'] = ["png", "jpg", "bmp"] # Acceptable image extentions
Index: mythtv.spec
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-15/mythtv.spec,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -r1.91 -r1.92
--- mythtv.spec 23 Apr 2012 15:29:20 -0000 1.91
+++ mythtv.spec 30 Apr 2012 13:36:12 -0000 1.92
@@ -86,7 +86,7 @@
Release: 0.1.git.%{_gitrev}%{?dist}
#Release: 0.1.rc1%{?dist}
%else
-Release: 3%{?dist}
+Release: 5%{?dist}
%endif
# The primary license is GPLv2+, but bits are borrowed from a number of
@@ -150,7 +150,7 @@
Source101: mythbackend.sysconfig
Source102: mythbackend.init
Source103: mythbackend.logrotate
-#Source104: mythbackend.service
+Source104: mythbackend.service
Source106: mythfrontend.png
Source107: mythfrontend.desktop
Source108: mythtv-setup.png
@@ -683,6 +683,7 @@
Requires: python-imaging
Requires: transcode >= 1.0.2
Requires: m2vrequantiser
+Requires: pmount
%description -n mytharchive
MythArchive is a new plugin for MythTV that lets you create DVDs from
@@ -1480,6 +1481,11 @@
################################################################################
%changelog
+* Sun Apr 29 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-5
+- Update to latest 0.25/fixes.
+- Really fix logrotate this time.
+- Add pmount to mytharchive requirements.
+
* Sat Apr 21 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-3
- Removed obsolete build requirement for arts-devel.
- Re-add %%clean since it's still needed for mythweb.
12 years, 7 months
rpms/mythtv/F-16 mythbackend.logrotate, 1.1, 1.2 mythtv-0.25-fixes.patch, 1.3, 1.4 mythtv.spec, 1.91, 1.92
by Richard Shaw
Author: hobbes1069
Update of /cvs/free/rpms/mythtv/F-16
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv5455
Modified Files:
mythbackend.logrotate mythtv-0.25-fixes.patch mythtv.spec
Log Message:
* Sun Apr 29 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-5
- Update to latest 0.25/fixes.
- Really fix logrotate this time.
- Add pmount to mytharchive requirements.
Index: mythbackend.logrotate
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-16/mythbackend.logrotate,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- mythbackend.logrotate 3 Mar 2011 02:45:10 -0000 1.1
+++ mythbackend.logrotate 30 Apr 2012 13:31:29 -0000 1.2
@@ -1,4 +1,4 @@
-/var/log/mythtv/mythbackend.log {
+/var/log/mythtv/mythbackend.log /var/log/mythtv/myth*.*.*.log {
notifempty
missingok
compress
@@ -9,6 +9,6 @@
rotate 4
size 10M
postrotate
- /bin/kill -HUP `cat /var/run/mythbackend.pid 2>/dev/null` 2> /dev/null || true
+ /bin/systemctl kill mythbackend.service --signal=HUP --kill-who=main 2>/dev/null || true
endscript
}
mythtv-0.25-fixes.patch:
mythplugins/mytharchive/i18n/mytharchive_fi.qm |binary
mythplugins/mytharchive/i18n/mytharchive_fi.ts | 238
mythplugins/mythbrowser/i18n/mythbrowser_fi.qm |binary
mythplugins/mythbrowser/i18n/mythbrowser_fi.ts | 44
mythplugins/mythgallery/i18n/mythgallery_fi.qm |binary
mythplugins/mythgallery/i18n/mythgallery_fi.ts | 264
mythplugins/mythgame/i18n/mythgame_fi.qm |binary
mythplugins/mythgame/i18n/mythgame_fi.ts | 178
mythplugins/mythmusic/i18n/mythmusic_fi.qm |binary
mythplugins/mythmusic/i18n/mythmusic_fi.ts | 2219 +++++-
mythplugins/mythmusic/mythmusic/visualize.cpp | 60
mythplugins/mythnetvision/i18n/mythnetvision_fi.qm |binary
mythplugins/mythnetvision/i18n/mythnetvision_fi.ts | 96
mythplugins/mythnetvision/mythnetvision/nettree.cpp | 8
mythplugins/mythnetvision/mythnetvision/rsseditor.cpp | 6
mythplugins/mythnews/i18n/mythnews_fi.qm |binary
mythplugins/mythnews/i18n/mythnews_fi.ts | 44
mythplugins/mythweather/i18n/mythweather_fi.qm |binary
mythplugins/mythweather/i18n/mythweather_fi.ts | 60
mythplugins/mythzoneminder/i18n/mythzoneminder_fi.qm |binary
mythplugins/mythzoneminder/i18n/mythzoneminder_fi.ts | 84
mythplugins/mythzoneminder/mythzmserver/zmserver.cpp | 3
mythtv/VERSION | 2
mythtv/bindings/python/MythTV/mythproto.py | 4
mythtv/bindings/python/MythTV/static.py | 2
mythtv/configure | 15
mythtv/docs/doxygen-create-developer-docs.cfg | 2
mythtv/filters/yadif/filter_yadif.c | 2
mythtv/i18n/mythfrontend_fi.qm |binary
mythtv/i18n/mythfrontend_fi.ts | 3662 ++++++----
mythtv/i18n/mythfrontend_nb.qm |binary
mythtv/i18n/mythfrontend_nb.ts | 2
mythtv/libs/libmyth/audio/audiooutputalsa.cpp | 2
mythtv/libs/libmyth/audio/audiooutputbase.cpp | 55
mythtv/libs/libmyth/audio/audiooutputbase.h | 4
mythtv/libs/libmyth/audio/audiooutputca.cpp | 2
mythtv/libs/libmyth/audio/audiooutputdigitalencoder.cpp | 27
mythtv/libs/libmyth/remoteutil.cpp | 16
mythtv/libs/libmyth/remoteutil.h | 1
mythtv/libs/libmyth/rssparse.h | 1
mythtv/libs/libmythbase/bonjourregister.cpp | 5
mythtv/libs/libmythbase/compat.h | 2
mythtv/libs/libmythbase/logging.cpp | 3
mythtv/libs/libmythbase/serverpool.cpp | 46
mythtv/libs/libmythprotoserver/requesthandler/deletethread.cpp | 6
mythtv/libs/libmythsoundtouch/STTypes.h | 2
mythtv/libs/libmythsoundtouch/libmythsoundtouch.pro | 1
mythtv/libs/libmythtv/audioinput.h | 1
mythtv/libs/libmythtv/avformatdecoder.cpp | 10
mythtv/libs/libmythtv/dvdringbuffer.cpp | 49
mythtv/libs/libmythtv/fileringbuffer.cpp | 6
mythtv/libs/libmythtv/libmythtv.pro | 1
mythtv/libs/libmythtv/mythairplayserver.cpp | 2
mythtv/libs/libmythtv/mythplayer.cpp | 30
mythtv/libs/libmythtv/mythplayer.h | 3
mythtv/libs/libmythtv/mythraopconnection.cpp | 262
mythtv/libs/libmythtv/mythraopconnection.h | 13
mythtv/libs/libmythtv/mythraopdevice.cpp | 13
mythtv/libs/libmythtv/osd.cpp | 2
mythtv/libs/libmythtv/playercontext.h | 4
mythtv/libs/libmythtv/ringbuffer.cpp | 8
mythtv/libs/libmythtv/teletextscreen.cpp | 8
mythtv/libs/libmythtv/tv_play.cpp | 26
mythtv/libs/libmythtv/tv_rec.cpp | 3
mythtv/libs/libmythtv/tvremoteutil.cpp | 55
mythtv/libs/libmythtv/tvremoteutil.h | 7
mythtv/libs/libmythtv/videodisplayprofile.cpp | 3
mythtv/libs/libmythtv/videodisplayprofile.h | 2
mythtv/libs/libmythtv/videoout_xv.cpp | 7
mythtv/libs/libmythtv/videoout_xv.h | 1
mythtv/libs/libmythtv/videooutbase.cpp | 48
mythtv/libs/libmythui/mythmainwindow.cpp | 2
mythtv/libs/libmythupnp/httprequest.cpp | 1
mythtv/programs/mythbackend/filetransfer.cpp | 4
mythtv/programs/mythfrontend/audiogeneralsettings.cpp | 5
mythtv/programs/mythfrontend/globalsettings.cpp | 2
mythtv/programs/mythfrontend/guidegrid.cpp | 8
mythtv/programs/mythfrontend/scheduleeditor.cpp | 7
mythtv/programs/mythtranscode/transcode.h | 5
mythtv/programs/mythutil/markuputils.cpp | 4
mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py | 2
81 files changed, 5628 insertions(+), 2144 deletions(-)
Index: mythtv-0.25-fixes.patch
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-16/mythtv-0.25-fixes.patch,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- mythtv-0.25-fixes.patch 23 Apr 2012 15:13:07 -0000 1.3
+++ mythtv-0.25-fixes.patch 30 Apr 2012 13:31:29 -0000 1.4
@@ -8,6 +8,7 @@
mythplugins/mythgame/i18n/mythgame_fi.ts | 178 +-
mythplugins/mythmusic/i18n/mythmusic_fi.qm | Bin 56677 -> 56868 bytes
mythplugins/mythmusic/i18n/mythmusic_fi.ts | 2219 ++++++++++--
+ mythplugins/mythmusic/mythmusic/visualize.cpp | 60 +-
mythplugins/mythnetvision/i18n/mythnetvision_fi.qm | Bin 10270 -> 11758 bytes
mythplugins/mythnetvision/i18n/mythnetvision_fi.ts | 96 +-
.../mythnetvision/mythnetvision/nettree.cpp | 8 +-
@@ -20,7 +21,7 @@
.../mythzoneminder/i18n/mythzoneminder_fi.ts | 84 +-
.../mythzoneminder/mythzmserver/zmserver.cpp | 3 -
mythtv/VERSION | 2 +-
- mythtv/bindings/python/MythTV/mythproto.py | 2 +-
+ mythtv/bindings/python/MythTV/mythproto.py | 4 +-
mythtv/bindings/python/MythTV/static.py | 2 +-
mythtv/configure | 15 +-
mythtv/docs/doxygen-create-developer-docs.cfg | 2 +-
@@ -37,6 +38,7 @@
mythtv/libs/libmyth/remoteutil.cpp | 16 -
mythtv/libs/libmyth/remoteutil.h | 1 -
mythtv/libs/libmyth/rssparse.h | 1 +
+ mythtv/libs/libmythbase/bonjourregister.cpp | 5 +-
mythtv/libs/libmythbase/compat.h | 2 +
mythtv/libs/libmythbase/logging.cpp | 3 +-
mythtv/libs/libmythbase/serverpool.cpp | 46 +-
@@ -46,15 +48,20 @@
mythtv/libs/libmythtv/audioinput.h | 1 +
mythtv/libs/libmythtv/avformatdecoder.cpp | 10 +-
mythtv/libs/libmythtv/dvdringbuffer.cpp | 49 +-
+ mythtv/libs/libmythtv/fileringbuffer.cpp | 6 +-
mythtv/libs/libmythtv/libmythtv.pro | 1 +
mythtv/libs/libmythtv/mythairplayserver.cpp | 2 +-
mythtv/libs/libmythtv/mythplayer.cpp | 30 +-
mythtv/libs/libmythtv/mythplayer.h | 3 +
- mythtv/libs/libmythtv/mythraopdevice.cpp | 5 +-
+ mythtv/libs/libmythtv/mythraopconnection.cpp | 262 +-
+ mythtv/libs/libmythtv/mythraopconnection.h | 13 +-
+ mythtv/libs/libmythtv/mythraopdevice.cpp | 13 +-
+ mythtv/libs/libmythtv/osd.cpp | 2 +-
mythtv/libs/libmythtv/playercontext.h | 4 +-
mythtv/libs/libmythtv/ringbuffer.cpp | 8 +-
mythtv/libs/libmythtv/teletextscreen.cpp | 8 +-
mythtv/libs/libmythtv/tv_play.cpp | 26 +-
+ mythtv/libs/libmythtv/tv_rec.cpp | 3 +
mythtv/libs/libmythtv/tvremoteutil.cpp | 55 +-
mythtv/libs/libmythtv/tvremoteutil.h | 7 +-
mythtv/libs/libmythtv/videodisplayprofile.cpp | 3 -
@@ -64,13 +71,15 @@
mythtv/libs/libmythtv/videooutbase.cpp | 48 +-
mythtv/libs/libmythui/mythmainwindow.cpp | 2 +
mythtv/libs/libmythupnp/httprequest.cpp | 1 +
+ mythtv/programs/mythbackend/filetransfer.cpp | 4 +
.../programs/mythfrontend/audiogeneralsettings.cpp | 5 +-
mythtv/programs/mythfrontend/globalsettings.cpp | 2 +-
- mythtv/programs/mythfrontend/guidegrid.cpp | 4 +-
+ mythtv/programs/mythfrontend/guidegrid.cpp | 8 +-
mythtv/programs/mythfrontend/scheduleeditor.cpp | 7 +-
mythtv/programs/mythtranscode/transcode.h | 5 +-
mythtv/programs/mythutil/markuputils.cpp | 4 +-
- 72 files changed, 5420 insertions(+), 1981 deletions(-)
+ .../nv_python_libs/bliptv/bliptv_api.py | 2 +-
+ 81 files changed, 5628 insertions(+), 2144 deletions(-)
diff --git a/mythplugins/mytharchive/i18n/mytharchive_fi.qm b/mythplugins/mytharchive/i18n/mytharchive_fi.qm
index 2fc0f91..8e2d841 100644
@@ -4872,6 +4881,195 @@
</message>
</context>
</TS>
+diff --git a/mythplugins/mythmusic/mythmusic/visualize.cpp b/mythplugins/mythmusic/mythmusic/visualize.cpp
+index 66b050c..fac7989 100644
+--- a/mythplugins/mythmusic/mythmusic/visualize.cpp
++++ b/mythplugins/mythmusic/mythmusic/visualize.cpp
+@@ -168,11 +168,11 @@ bool StereoScope::process( VisualNode *node )
+ bool allZero = true;
+
+
+- if (node)
++ if (node)
+ {
+ double index = 0;
+ double const step = (double)SAMPLES_DEFAULT_SIZE / size.width();
+- for ( int i = 0; i < size.width(); i++)
++ for ( int i = 0; i < size.width(); i++)
+ {
+ unsigned long indexTo = (unsigned long)(index + step);
+ if (indexTo == (unsigned long)(index))
+@@ -194,13 +194,13 @@ bool StereoScope::process( VisualNode *node )
+ if ( valL < 0. )
+ valL = 0.;
+ }
+- if (valR < 0.)
++ if (valR < 0.)
+ {
+ valR += falloff;
+ if ( valR > 0. )
+ valR = 0.;
+- }
+- else
++ }
++ else
+ {
+ valR -= falloff;
+ if ( valR < 0. )
+@@ -208,7 +208,7 @@ bool StereoScope::process( VisualNode *node )
+ }
+ }
+ #endif
+- for (unsigned long s = (unsigned long)index; s < indexTo && s < node->length; s++)
++ for (unsigned long s = (unsigned long)index; s < indexTo && s < node->length; s++)
+ {
+ double tmpL = ( ( node->left ?
+ double( node->left[s] ) : 0.) *
+@@ -235,10 +235,10 @@ bool StereoScope::process( VisualNode *node )
+ index = index + step;
+ }
+ #if RUBBERBAND
+- }
+- else if (rubberband)
++ }
++ else if (rubberband)
+ {
+- for ( int i = 0; i < size.width(); i++)
++ for ( int i = 0; i < size.width(); i++)
+ {
+ double valL = magnitudes[ i ];
+ if (valL < 0) {
+@@ -271,8 +271,8 @@ bool StereoScope::process( VisualNode *node )
+ magnitudes[ i + size.width() ] = valR;
+ }
+ #endif
+- }
+- else
++ }
++ else
+ {
+ for ( int i = 0; (unsigned) i < magnitudes.size(); i++ )
+ magnitudes[ i ] = 0.;
+@@ -284,7 +284,7 @@ bool StereoScope::process( VisualNode *node )
+ bool StereoScope::draw( QPainter *p, const QColor &back )
+ {
+ p->fillRect(0, 0, size.width(), size.height(), back);
+- for ( int i = 1; i < size.width(); i++ )
++ for ( int i = 1; i < size.width(); i++ )
+ {
+ #if TWOCOLOUR
+ double r, g, b, per;
+@@ -611,7 +611,7 @@ Spectrum::Spectrum()
+ rplan = fftw_plan_dft_r2c_1d(FFTW_N, rin, (myth_fftw_complex_cast*)rout, FFTW_MEASURE);
+
+ startColor = QColor(0,0,255);
+- targetColor = QColor(255,0,0);
++ targetColor = QColor(255,0,0);
+ }
+
+ Spectrum::~Spectrum()
+@@ -679,7 +679,7 @@ bool Spectrum::process(VisualNode *node)
+ double *magnitudesp = magnitudes.data();
+ double magL, magR, tmp;
+
+- if (node)
++ if (node)
+ {
+ i = node->length;
+ if (i > FFTW_N)
+@@ -700,9 +700,9 @@ bool Spectrum::process(VisualNode *node)
+
+ for (i = 0; (int)i < rects.size(); i++, w += analyzerBarWidth)
+ {
+- magL = (log(sq(real(lout[index])) + sq(real(lout[FFTW_N - index]))) - 22.0) *
++ magL = (log(sq(real(lout[index])) + sq(real(lout[FFTW_N - index]))) - 22.0) *
+ scaleFactor;
+- magR = (log(sq(real(rout[index])) + sq(real(rout[FFTW_N - index]))) - 22.0) *
++ magR = (log(sq(real(rout[index])) + sq(real(rout[FFTW_N - index]))) - 22.0) *
+ scaleFactor;
+
+ if (magL > size.height() / 2)
+@@ -784,11 +784,11 @@ bool Spectrum::draw(QPainter *p, const QColor &back)
+
+ per = clamp(per, 1.0, 0.0);
+
+- r = startColor.red() +
++ r = startColor.red() +
+ (targetColor.red() - startColor.red()) * (per * per);
+- g = startColor.green() +
++ g = startColor.green() +
+ (targetColor.green() - startColor.green()) * (per * per);
+- b = startColor.blue() +
++ b = startColor.blue() +
+ (targetColor.blue() - startColor.blue()) * (per * per);
+
+ r = clamp(r, 255.0, 0.0);
+@@ -848,14 +848,14 @@ void Squares::resize (const QSize &newsize) {
+ size = newsize;
+ }
+
+-void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
++void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
+ {
+ double r, g, b, per;
+ int correction = (size.width() % rects.size ()) / 2;
+ int x = ((i / 2) * w) + correction;
+ int y;
+
+- if (i % 2 == 0)
++ if (i % 2 == 0)
+ {
+ y = c - h;
+ per = double(fake_height - rect->top()) / double(fake_height);
+@@ -866,15 +866,15 @@ void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
+ per = double(rect->bottom()) / double(fake_height);
+ }
+
+- per = clamp(per, 1.0, 0.0);
+-
+- r = startColor.red() +
++ per = clamp(per, 1.0, 0.0);
++
++ r = startColor.red() +
+ (targetColor.red() - startColor.red()) * (per * per);
+- g = startColor.green() +
++ g = startColor.green() +
+ (targetColor.green() - startColor.green()) * (per * per);
+- b = startColor.blue() +
++ b = startColor.blue() +
+ (targetColor.blue() - startColor.blue()) * (per * per);
+-
++
+ r = clamp(r, 255.0, 0.0);
+ g = clamp(g, 255.0, 0.0);
+ b = clamp(b, 255.0, 0.0);
+@@ -1496,7 +1496,7 @@ void AlbumArt::handleKeyPress(const QString &action)
+ /// this is the time an image is shown in the albumart visualizer
+ #define ALBUMARTCYCLETIME 10
+
+-bool AlbumArt::needsUpdate()
++bool AlbumArt::needsUpdate()
+ {
+ // if the track has changed we need to update the image
+ if (gPlayer->getCurrentMetadata() && m_currentMetadata != gPlayer->getCurrentMetadata())
+@@ -1536,7 +1536,7 @@ bool AlbumArt::draw(QPainter *p, const QColor &back)
+ }
+ }
+
+- if (m_image.isNull())
++ if (m_image.isNull())
+ {
+ drawWarning(p, back, m_size, QObject::tr("?"), 100);
+ return true;
+@@ -1581,7 +1581,7 @@ static class AlbumArtFactory : public VisFactory
+ Blank::Blank()
+ : VisualBase(true)
+ {
+- m_fps = 20;
++ m_fps = 1;
+ }
+
+ Blank::~Blank()
diff --git a/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm b/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm
index 38f9ca4..e8d8d66 100644
Binary files a/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm and b/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm differ
@@ -5552,7 +5750,7 @@
\ No newline at end of file
+SOURCE_VERSION="v0.25"
diff --git a/mythtv/bindings/python/MythTV/mythproto.py b/mythtv/bindings/python/MythTV/mythproto.py
-index 41a39e8..9a891cb 100644
+index 41a39e8..f7ae3e6 100644
--- a/mythtv/bindings/python/MythTV/mythproto.py
+++ b/mythtv/bindings/python/MythTV/mythproto.py
@@ -657,7 +657,7 @@ class FileOps( BECache ):
@@ -5564,6 +5762,15 @@
if host:
m.append(host)
return self.backendCommand(BACKEND_SEP.join(m))
+@@ -784,7 +784,7 @@ class FreeSpace( DictData ):
+ _field_order = [ 'host', 'path', 'islocal',
+ 'disknumber', 'sgroupid', 'blocksize',
+ 'totalspace', 'usedspace']
+- _field_type = [3, 3, 2, 0, 0, 0, 0, 0, 0, 0]
++ _field_type = [3, 3, 2, 0, 0, 0, 0, 0]
+ def __str__(self):
+ return "<FreeSpace '%s@%s' at %s>"\
+ % (self.path, self.host, hex(id(self)))
diff --git a/mythtv/bindings/python/MythTV/static.py b/mythtv/bindings/python/MythTV/static.py
index 6b587b2..f539706 100644
--- a/mythtv/bindings/python/MythTV/static.py
@@ -12494,6 +12701,33 @@
#include "mythexp.h"
+diff --git a/mythtv/libs/libmythbase/bonjourregister.cpp b/mythtv/libs/libmythbase/bonjourregister.cpp
+index 017ee6d..7f98732 100644
+--- a/mythtv/libs/libmythbase/bonjourregister.cpp
++++ b/mythtv/libs/libmythbase/bonjourregister.cpp
+@@ -5,6 +5,7 @@
+
+ #include "mythlogging.h"
+ #include "bonjourregister.h"
++#include "mythcorecontext.h"
+
+ #define LOC QString("Bonjour: ")
+
+@@ -41,11 +42,13 @@ bool BonjourRegister::Register(uint16_t port, const QByteArray &type,
+ return true;
+ }
+
++ QByteArray host(gCoreContext->GetSetting("BonjourHostname", "").toUtf8());
++ const char *host_ptr = host.size() > 0 ? host.constData() : NULL;
+ uint16_t qport = qToBigEndian(port);
+ DNSServiceErrorType res =
+ DNSServiceRegister(&m_dnssref, 0, 0, (const char*)name.data(),
+ (const char*)type.data(),
+- NULL, 0, qport, txt.size(), (void*)txt.data(),
++ NULL, host_ptr, qport, txt.size(), (void*)txt.data(),
+ BonjourCallback, this);
+
+ if (kDNSServiceErr_NoError != res)
diff --git a/mythtv/libs/libmythbase/compat.h b/mythtv/libs/libmythbase/compat.h
index ff2890f..425624a 100644
--- a/mythtv/libs/libmythbase/compat.h
@@ -12766,6 +13000,30 @@
LOG(VB_PLAYBACK, LOG_INFO, LOC +
QString("DVD Serial Number %1").arg(m_serialnumber));
+diff --git a/mythtv/libs/libmythtv/fileringbuffer.cpp b/mythtv/libs/libmythtv/fileringbuffer.cpp
+index f917416..2985f57 100644
+--- a/mythtv/libs/libmythtv/fileringbuffer.cpp
++++ b/mythtv/libs/libmythtv/fileringbuffer.cpp
+@@ -453,8 +453,8 @@ int FileRingBuffer::safe_read(int fd, void *data, uint sz)
+ tot += ret;
+ }
+
+- //if (oldfile)
+- //break;
++ if (oldfile)
++ break;
+
+ if (ret == 0) // EOF returns 0
+ {
+@@ -465,7 +465,7 @@ int FileRingBuffer::safe_read(int fd, void *data, uint sz)
+
+ // 0.36 second timeout for livetvchain with usleep(60000),
+ // or 2.4 seconds if it's a new file less than 30 minutes old.
+- if (zerocnt >= (oldfile ? 4 : (livetvchain ? 6 : 40)))
++ if (zerocnt >= (livetvchain ? 6 : 40))
+ {
+ break;
+ }
diff --git a/mythtv/libs/libmythtv/libmythtv.pro b/mythtv/libs/libmythtv/libmythtv.pro
index f50d2cb..6df71d0 100644
--- a/mythtv/libs/libmythtv/libmythtv.pro
@@ -12867,19 +13125,501 @@
};
#endif
+diff --git a/mythtv/libs/libmythtv/mythraopconnection.cpp b/mythtv/libs/libmythtv/mythraopconnection.cpp
+index 962c142..df0b3a9 100644
+--- a/mythtv/libs/libmythtv/mythraopconnection.cpp
++++ b/mythtv/libs/libmythtv/mythraopconnection.cpp
+@@ -1,6 +1,3 @@
+-// TODO
+-// remove hardcoded frames per packet
+-
+ #include <QTimer>
+ #include <QTcpSocket>
+ #include <QUdpSocket>
+@@ -23,6 +20,22 @@
+
+ RSA* MythRAOPConnection::g_rsa = NULL;
+
++class NetStream : public QTextStream
++{
++public:
++ NetStream(QIODevice *device) : QTextStream(device)
++ {
++ };
++ NetStream &operator<<(const QString &str)
++ {
++ LOG(VB_GENERAL, LOG_DEBUG,
++ LOC + QString("Sending(%1): ").arg(str.length()) + str);
++ QTextStream *q = this;
++ *q << str;
++ return *this;
++ };
++};
++
+ MythRAOPConnection::MythRAOPConnection(QObject *parent, QTcpSocket *socket,
+ QByteArray id, int port)
+ : QObject(parent), m_watchdogTimer(NULL), m_socket(socket),
+@@ -87,7 +100,7 @@ MythRAOPConnection::~MythRAOPConnection()
+ bool MythRAOPConnection::Init(void)
+ {
+ // connect up the request socket
+- m_textStream = new QTextStream(m_socket);
++ m_textStream = new NetStream(m_socket);
+ m_textStream->setCodec("UTF-8");
+ if (!connect(m_socket, SIGNAL(readyRead()), this, SLOT(readClient())))
+ {
+@@ -138,6 +151,24 @@ bool MythRAOPConnection::Init(void)
+ return true;
+ }
+
++void MythRAOPConnection::udpDataReady(void)
++{
++ QUdpSocket *socket = dynamic_cast<QUdpSocket*>(sender());
++
++ while (socket->state() == QAbstractSocket::BoundState &&
++ socket->hasPendingDatagrams())
++ {
++ QByteArray buffer;
++ buffer.resize(socket->pendingDatagramSize());
++ QHostAddress sender;
++ quint16 senderPort;
++
++ socket->readDatagram(buffer.data(), buffer.size(),
++ &sender, &senderPort);
++ udpDataReady(buffer, sender, senderPort);
++ }
++}
++
+ void MythRAOPConnection::udpDataReady(QByteArray buf, QHostAddress peer,
+ quint16 port)
+ {
+@@ -191,7 +222,8 @@ void MythRAOPConnection::udpDataReady(QByteArray buf, QHostAddress peer,
+ m_resends.remove(this_sequence);
+ }
+ else
+- LOG(VB_GENERAL, LOG_WARNING, LOC + "Received unexpected resent packet.");
++ LOG(VB_GENERAL, LOG_WARNING, LOC + QString("Received unexpected resent packet %1")
++ .arg(this_sequence));
+ }
+
+ ExpireResendRequests(timenow);
+@@ -332,12 +364,13 @@ void MythRAOPConnection::ProcessSyncPacket(const QByteArray &buf, uint64_t timen
+
+ if (m_audio)
+ {
++ uint64_t total = averageaudio + averagequeue;
+ LOG(VB_GENERAL, LOG_DEBUG, LOC +
+ QString("Sync packet: Timestamp: %1 Current Audio ts: %2 (avsync %3ms) "
+ "Latency: audio %4 queue %5 total %6ms <-> target %7ms")
+ .arg(m_lastSyncTimestamp).arg(m_audio->GetAudiotime()).arg(averageav, 0)
+ .arg(averageaudio).arg(averagequeue)
+- .arg(averageaudio + averagequeue).arg(m_lastLatency));
++ .arg(total).arg(m_lastLatency));
+ }
+ m_latencyAudio = m_latencyQueued = m_latencyCounter = m_avSync = 0;
+ }
+@@ -463,78 +496,82 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ return;
+ }
+
+- QByteArray option = lines[0].left(lines[0].indexOf(" "));
++ *m_textStream << "RTSP/1.0 200 OK\r\n";
+
+- if (option == "OPTIONS")
++ if (tags.contains("Apple-Challenge"))
+ {
+- StartResponse(m_textStream);
+- if (tags.contains("Apple-Challenge"))
+- {
+- *m_textStream << "Apple-Response: ";
+- if (!LoadKey())
+- return;
+- int tosize = RSA_size(LoadKey());
+- unsigned char to[tosize];
+-
+- QByteArray challenge = QByteArray::fromBase64(tags["Apple-Challenge"].data());
+- int challenge_size = challenge.size();
+- if (challenge_size != 16)
+- {
+- LOG(VB_GENERAL, LOG_ERR, LOC +
+- QString("Decoded challenge size %1, expected 16").arg(challenge_size));
+- if (challenge_size > 16)
+- challenge_size = 16;
+- }
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Received Apple-Challenge"));
+
+- int i = 0;
+- unsigned char from[38];
+- memcpy(from, challenge.data(), challenge_size);
+- i += challenge_size;
+- if (m_socket->localAddress().protocol() == QAbstractSocket::IPv4Protocol)
+- {
+- uint32_t ip = m_socket->localAddress().toIPv4Address();
+- ip = qToBigEndian(ip);
+- memcpy(from + i, &ip, 4);
+- i += 4;
+- }
+- else if (m_socket->localAddress().protocol() == QAbstractSocket::IPv6Protocol)
+- {
+- // NB IPv6 untested
+- Q_IPV6ADDR ip = m_socket->localAddress().toIPv6Address();
+- //ip = qToBigEndian(ip);
+- memcpy(from + i, &ip, 16);
+- i += 16;
+- }
+- memcpy(from + i, m_hardwareId.data(), RAOP_HARDWARE_ID_SIZE);
+- i += RAOP_HARDWARE_ID_SIZE;
++ *m_textStream << "Apple-Response: ";
++ if (!LoadKey())
++ return;
++ int tosize = RSA_size(LoadKey());
++ unsigned char to[tosize];
+
+- int pad = 32 - i;
+- if (pad > 0)
+- {
+- memset(from + i, 0, pad);
+- i += pad;
+- }
++ QByteArray challenge = QByteArray::fromBase64(tags["Apple-Challenge"].data());
++ int challenge_size = challenge.size();
++ if (challenge_size != 16)
++ {
++ LOG(VB_GENERAL, LOG_ERR, LOC +
++ QString("Decoded challenge size %1, expected 16").arg(challenge_size));
++ if (challenge_size > 16)
++ challenge_size = 16;
++ }
++
++ int i = 0;
++ unsigned char from[38];
++ memcpy(from, challenge.data(), challenge_size);
++ i += challenge_size;
++ if (m_socket->localAddress().protocol() == QAbstractSocket::IPv4Protocol)
++ {
++ uint32_t ip = m_socket->localAddress().toIPv4Address();
++ ip = qToBigEndian(ip);
++ memcpy(from + i, &ip, 4);
++ i += 4;
++ }
++ else if (m_socket->localAddress().protocol() == QAbstractSocket::IPv6Protocol)
++ {
++ // NB IPv6 untested
++ Q_IPV6ADDR ip = m_socket->localAddress().toIPv6Address();
++ //ip = qToBigEndian(ip);
++ memcpy(from + i, &ip, 16);
++ i += 16;
++ }
++ memcpy(from + i, m_hardwareId.data(), RAOP_HARDWARE_ID_SIZE);
++ i += RAOP_HARDWARE_ID_SIZE;
+
+- LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Full base64 response: '%1' size %2")
+- .arg(QByteArray((const char*)from, i).toBase64().data()).arg(i));
++ int pad = 32 - i;
++ if (pad > 0)
++ {
++ memset(from + i, 0, pad);
++ i += pad;
++ }
+
+- RSA_private_encrypt(i, from, to, LoadKey(), RSA_PKCS1_PADDING);
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Full base64 response: '%1' size %2")
++ .arg(QByteArray((const char*)from, i).toBase64().data()).arg(i));
+
+- QByteArray base64 = QByteArray((const char*)to, tosize).toBase64();
++ RSA_private_encrypt(i, from, to, LoadKey(), RSA_PKCS1_PADDING);
+
+- for (int pos = base64.size() - 1; pos > 0; pos--)
+- {
+- if (base64[pos] == '=')
+- base64[pos] = ' ';
+- else
+- break;
+- }
++ QByteArray base64 = QByteArray((const char*)to, tosize).toBase64();
+
+- *m_textStream << base64.trimmed() << "\r\n";
++ for (int pos = base64.size() - 1; pos > 0; pos--)
++ {
++ if (base64[pos] == '=')
++ base64[pos] = ' ';
++ else
++ break;
+ }
++ LOG(VB_GENERAL, LOG_DEBUG, QString("tSize=%1 tLen=%2 tResponse=%3")
++ .arg(tosize).arg(base64.size()).arg(base64.data()));
++ *m_textStream << base64.trimmed() << "\r\n";
++ }
+
++ QByteArray option = lines[0].left(lines[0].indexOf(" "));
++
++ if (option == "OPTIONS")
++ {
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ *m_textStream << "Public: ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, TEARDOWN, OPTIONS, GET_PARAMETER, SET_PARAMETER\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+ }
+ else if (option == "ANNOUNCE")
+ {
+@@ -589,9 +626,7 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Audio parameter: %1").arg(fmt));
+ }
+ }
+-
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+ else if (option == "SETUP")
+ {
+@@ -617,14 +652,6 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ QString("control port: %1 timing port: %2")
+ .arg(control_port).arg(timing_port));
+
+- StartResponse(m_textStream);
+- *m_textStream << "Transport: " << tags["Transport"];
+- *m_textStream << ";server_port=" << QString::number(m_dataPort) << "\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+-
+- if (OpenAudioDevice())
+- CreateDecoder();
+-
+ if (m_clientControlSocket)
+ {
+ m_clientControlSocket->disconnect();
+@@ -632,21 +659,31 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ delete m_clientControlSocket;
+ }
+
+- m_clientControlSocket = new ServerPool(this);
++ m_clientControlSocket = new QUdpSocket(this);
+ if (!m_clientControlSocket->bind(control_port))
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC +
+- QString("Failed to bind to client control port %1").arg(control_port));
++ QString("Failed to bind to client control port %1. "
++ "Control of audio stream may fail")
++ .arg(control_port));
+ }
+ else
+ {
+ LOG(VB_GENERAL, LOG_INFO, LOC +
+ QString("Bound to client control port %1").arg(control_port));
+- m_peerAddress = m_socket->peerAddress();
+- m_clientControlPort = control_port;
+- connect(m_clientControlSocket, SIGNAL(newDatagram(QByteArray, QHostAddress, quint16)),
+- this, SLOT(udpDataReady(QByteArray, QHostAddress, quint16)));
+ }
++
++ if (OpenAudioDevice())
++ CreateDecoder();
++
++ m_peerAddress = m_socket->peerAddress();
++ m_clientControlPort = control_port;
++ connect(m_clientControlSocket, SIGNAL(readyRead()), this, SLOT(udpDataReady()));
++
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ *m_textStream << "Transport: " << tags["Transport"].data();
++ *m_textStream << ";server_port=" << QString::number(m_dataPort);
++ *m_textStream << "\r\nSession: MYTHTV\r\n";
+ }
+ else
+ {
+@@ -656,13 +693,24 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ }
+ else if (option == "RECORD")
+ {
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ }
++ else if (option == "TEARDOWN")
++ {
++ *m_textStream << "Connection: close\r\n";
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ }
++ else if (option == "FLUSH")
++ {
++ ResetAudio();
++ *m_textStream << "flush\r\n";
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+ else if (option == "SET_PARAMETER")
+ {
+ foreach (QByteArray line, lines)
+ {
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ if (line.startsWith("volume:") && m_allowVolumeControl && m_audio)
+ {
+ QByteArray rawvol = line.mid(7).trimmed();
+@@ -674,43 +722,34 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ m_audio->SetCurrentVolume((int)volume);
+ }
+ }
+-
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+- }
+- else if (option == "FLUSH")
+- {
+- ResetAudio();
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+ }
+- else if (option == "TEARDOWN")
++ else
+ {
+- StartResponse(m_textStream);
+- *m_textStream << "Connection: close\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Command not handled: %1")
++ .arg(option.data()));
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+-
++ FinishResponse(m_textStream, m_socket, option, tags["CSeq"]);
+ }
+
+-void MythRAOPConnection::StartResponse(QTextStream *stream)
++void MythRAOPConnection::StartResponse(NetStream *stream,
++ QByteArray &option, QByteArray &cseq)
+ {
+ if (!stream)
+ return;
+- *stream << "RTSP/1.0 200 OK\r\n";
+-}
+-
+-void MythRAOPConnection::FinishResponse(QTextStream *stream, QTcpSocket *socket,
+- QByteArray &option, QByteArray &cseq)
+-{
+ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("%1 sequence %2")
+ .arg(option.data()).arg(cseq.data()));
+ *stream << "Audio-Jack-Status: connected; type=analog\r\n";
+ *stream << "CSeq: " << cseq << "\r\n";
++}
++
++void MythRAOPConnection::FinishResponse(NetStream *stream, QTcpSocket *socket,
++ QByteArray &option, QByteArray &cseq)
++{
+ *stream << "\r\n";
+ stream->flush();
+- LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Send: %1")
+- .arg(socket->flush()));
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Finished %1 %2 , Send: %3")
++ .arg(option.data()).arg(cseq.data()).arg(socket->flush()));
+ }
+
+ RSA* MythRAOPConnection::LoadKey(void)
+@@ -797,7 +836,7 @@ bool MythRAOPConnection::CreateDecoder(void)
+ extradata[13] = (fs >> 16) & 0xff;
+ extradata[14] = (fs >> 8) & 0xff;
+ extradata[15] = fs & 0xff;
+- extradata[16] = 2; // channels
++ extradata[16] = m_channels; // channels
+ extradata[17] = m_audioFormat[3]; // sample size
+ extradata[18] = m_audioFormat[4]; // rice_historymult
+ extradata[19] = m_audioFormat[5]; // rice_initialhistory
+@@ -805,7 +844,7 @@ bool MythRAOPConnection::CreateDecoder(void)
+ }
+ m_codeccontext->extradata = extradata;
+ m_codeccontext->extradata_size = 36;
+- m_codeccontext->channels = 2;
++ m_codeccontext->channels = m_channels;
+ if (avcodec_open(m_codeccontext, m_codec) < 0)
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to open ALAC decoder - going silent...");
+@@ -834,6 +873,7 @@ bool MythRAOPConnection::OpenAudioDevice(void)
+ CloseAudioDevice();
+
+ m_sampleRate = m_audioFormat.size() >= 12 ? m_audioFormat[11] : DEFAULT_SAMPLE_RATE;
++ m_channels = m_audioFormat[7] > 0 ? m_audioFormat[7] : 2;
+ if (m_sampleRate < 1)
+ m_sampleRate = DEFAULT_SAMPLE_RATE;
+
+@@ -841,7 +881,7 @@ bool MythRAOPConnection::OpenAudioDevice(void)
+ ? gCoreContext->GetSetting("PassThruOutputDevice") : QString::null;
+ QString device = gCoreContext->GetSetting("AudioOutputDevice");
+
+- m_audio = AudioOutput::OpenAudio(device, passthru, FORMAT_S16, 2,
++ m_audio = AudioOutput::OpenAudio(device, passthru, FORMAT_S16, m_channels,
+ 0, m_sampleRate, AUDIOOUTPUT_MUSIC,
+ m_allowVolumeControl, false);
+ if (!m_audio)
+diff --git a/mythtv/libs/libmythtv/mythraopconnection.h b/mythtv/libs/libmythtv/mythraopconnection.h
+index 9d56d4e..e229f83 100644
+--- a/mythtv/libs/libmythtv/mythraopconnection.h
++++ b/mythtv/libs/libmythtv/mythraopconnection.h
+@@ -15,12 +15,12 @@ extern "C" {
+ #include "libavformat/avformat.h"
+ }
+
+-class QTextStream;
+ class QTcpSocket;
+ class QUdpSocket;
+ class QTimer;
+ class AudioOutput;
+ class ServerPool;
++class NetStream;
+
+ typedef QHash<QByteArray,QByteArray> RawHash;
+
+@@ -42,6 +42,7 @@ class MythRAOPConnection : public QObject
+ public slots:
+ void readClient(void);
+ void udpDataReady(QByteArray buf, QHostAddress peer, quint16 port);
++ void udpDataReady(void);
+ void timeout(void);
+ void audioRetry(void);
+
+@@ -58,8 +59,9 @@ class MythRAOPConnection : public QObject
+ void ProcessAudio(uint64_t timenow);
+ void ResetAudio(void);
+ void ProcessRequest(const QList<QByteArray> &lines);
+- void StartResponse(QTextStream *stream);
+- void FinishResponse(QTextStream *stream, QTcpSocket *socket,
++ void StartResponse(NetStream *stream,
++ QByteArray &option, QByteArray &cseq);
++ void FinishResponse(NetStream *stream, QTcpSocket *socket,
+ QByteArray &option, QByteArray &cseq);
+ RawHash FindTags(const QList<QByteArray> &lines);
+ bool CreateDecoder(void);
+@@ -72,13 +74,13 @@ class MythRAOPConnection : public QObject
+ QTimer *m_watchdogTimer;
+ // comms socket
+ QTcpSocket *m_socket;
+- QTextStream *m_textStream;
++ NetStream *m_textStream;
+ QByteArray m_hardwareId;
+ // incoming audio
+ QHostAddress m_peerAddress;
+ int m_dataPort;
+ ServerPool *m_dataSocket;
+- ServerPool *m_clientControlSocket;
++ QUdpSocket *m_clientControlSocket;
+ int m_clientControlPort;
+ QMap<uint16_t,uint64_t> m_resends;
+ // crypto
+@@ -91,6 +93,7 @@ class MythRAOPConnection : public QObject
+ AVCodecContext *m_codeccontext;
+ QList<int> m_audioFormat;
+ int m_sampleRate;
++ int m_channels;
+ typedef struct
+ {
+ int16_t *samples;
diff --git a/mythtv/libs/libmythtv/mythraopdevice.cpp b/mythtv/libs/libmythtv/mythraopdevice.cpp
-index 82a6a61..f27f166 100644
+index 82a6a61..bad4932 100644
--- a/mythtv/libs/libmythtv/mythraopdevice.cpp
+++ b/mythtv/libs/libmythtv/mythraopdevice.cpp
-@@ -1,6 +1,7 @@
+@@ -1,6 +1,6 @@
#include <QTimer>
#include <QtEndian>
- #include <QTcpSocket>
+-#include <QTcpSocket>
+#include <QNetworkInterface>
#include "mthread.h"
#include "mythlogging.h"
-@@ -131,7 +132,7 @@ void MythRAOPDevice::Start(void)
+@@ -131,7 +131,7 @@ void MythRAOPDevice::Start(void)
int baseport = m_setupPort;
while (m_setupPort < baseport + RAOP_PORT_RANGE)
{
@@ -12888,7 +13628,28 @@
{
LOG(VB_GENERAL, LOG_INFO, LOC +
QString("Listening for connections on port %1").arg(m_setupPort));
-@@ -242,8 +243,8 @@ void MythRAOPDevice::deleteClient(void)
+@@ -145,11 +145,6 @@ void MythRAOPDevice::Start(void)
+
+ // announce service
+ m_bonjour = new BonjourRegister(this);
+- if (!m_bonjour)
+- {
+- LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to create Bonjour object.");
+- return;
+- }
+
+ // give each frontend a unique name
+ int multiple = m_setupPort - baseport;
+@@ -176,6 +171,8 @@ void MythRAOPDevice::Start(void)
+ txt.append(4); txt.append("vn=3");
+ txt.append(9); txt.append("txtvers=1");
+
++ LOG(VB_GENERAL, LOG_INFO, QString("Registering service %1.%2 port %3 TXT %4")
++ .arg(QString(name)).arg(QString(type)).arg(m_setupPort).arg(QString(txt)));
+ if (!m_bonjour->Register(m_setupPort, type, name, txt))
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to register service.");
+@@ -242,8 +239,8 @@ void MythRAOPDevice::deleteClient(void)
if ((*it)->GetSocket()->state() == QTcpSocket::UnconnectedState)
{
LOG(VB_GENERAL, LOG_INFO, LOC + "Removing client connection.");
@@ -12898,6 +13659,19 @@
return;
}
}
+diff --git a/mythtv/libs/libmythtv/osd.cpp b/mythtv/libs/libmythtv/osd.cpp
+index 207ecef..d0860db 100644
+--- a/mythtv/libs/libmythtv/osd.cpp
++++ b/mythtv/libs/libmythtv/osd.cpp
+@@ -428,7 +428,7 @@ void OSD::SetText(const QString &window, QHash<QString,QString> &map,
+ if (!iconpath.isEmpty())
+ {
+ QString iconurl =
+- gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ iconpath);
+
+ icon->SetFilename(iconurl);
diff --git a/mythtv/libs/libmythtv/playercontext.h b/mythtv/libs/libmythtv/playercontext.h
index 5854de4..a4ce9f1 100644
--- a/mythtv/libs/libmythtv/playercontext.h
@@ -12922,39 +13696,59 @@
PlayerContext(const QString &inUseID = QString("Unknown"));
~PlayerContext();
diff --git a/mythtv/libs/libmythtv/ringbuffer.cpp b/mythtv/libs/libmythtv/ringbuffer.cpp
-index e3f0a5a..3883de2 100644
+index e3f0a5a..5e720c2 100644
--- a/mythtv/libs/libmythtv/ringbuffer.cpp
+++ b/mythtv/libs/libmythtv/ringbuffer.cpp
-@@ -724,6 +724,7 @@ void RingBuffer::run(void)
- struct timeval lastread, now;
- int readtimeavg = 300;
- bool ignore_for_read_timing = true;
-+ bool did_set_oldfile = false;
+@@ -553,6 +553,7 @@ void RingBuffer::KillReadAheadThread(void)
+ */
+ void RingBuffer::StopReads(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "StopReads()");
+ stopreads = true;
+ generalWait.wakeAll();
+ }
+@@ -563,6 +564,7 @@ void RingBuffer::StopReads(void)
+ */
+ void RingBuffer::StartReads(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "StartReads()");
+ stopreads = false;
+ generalWait.wakeAll();
+ }
+@@ -573,6 +575,7 @@ void RingBuffer::StartReads(void)
+ */
+ void RingBuffer::Pause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "Pause()");
+ StopReads();
- gettimeofday(&lastread, NULL); // this is just to keep gcc happy
+ rwlock.lockForWrite();
+@@ -586,6 +589,7 @@ void RingBuffer::Pause(void)
+ */
+ void RingBuffer::Unpause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "Unpause()");
+ StartReads();
-@@ -842,8 +843,12 @@ void RingBuffer::run(void)
+ rwlock.lockForWrite();
+@@ -842,9 +846,6 @@ void RingBuffer::run(void)
"Reading enough data to start playback");
}
- if (remotefile && livetvchain && livetvchain->HasNext())
-+ if (!did_set_oldfile && remotefile && livetvchain &&
-+ livetvchain->HasNext())
-+ {
- remotefile->SetTimeout(true);
-+ did_set_oldfile = true;
-+ }
-
+- remotefile->SetTimeout(true);
+-
LOG(VB_FILE, LOG_DEBUG, LOC +
QString("safe_read(...@%1, %2) -- begin")
-@@ -917,6 +922,7 @@ void RingBuffer::run(void)
- {
- livetvchain->SwitchToNext(true);
- setswitchtonext = true;
-+ did_set_oldfile = false;
- }
- }
- else
+ .arg(rbwpos).arg(totfree));
+@@ -1551,6 +1552,7 @@ void RingBuffer::SetWriteBufferMinWriteSize(int newMinSize)
+ */
+ void RingBuffer::SetOldFile(bool is_old)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + QString("SetOldFile(%1)").arg(is_old));
+ rwlock.lockForWrite();
+ oldfile = is_old;
+ rwlock.unlock();
diff --git a/mythtv/libs/libmythtv/teletextscreen.cpp b/mythtv/libs/libmythtv/teletextscreen.cpp
index 5490672..6bb0e13 100644
--- a/mythtv/libs/libmythtv/teletextscreen.cpp
@@ -13056,6 +13850,21 @@
vector<uint> interesting = CardUtil::GetCardIDs(sourceid);
// filter disconnected cards
+diff --git a/mythtv/libs/libmythtv/tv_rec.cpp b/mythtv/libs/libmythtv/tv_rec.cpp
+index bf15151..3311360 100644
+--- a/mythtv/libs/libmythtv/tv_rec.cpp
++++ b/mythtv/libs/libmythtv/tv_rec.cpp
+@@ -1080,7 +1080,10 @@ void TVRec::TeardownRecorder(uint request_flags)
+ }
+
+ if (ringBuffer)
++ {
++ LOG(VB_FILE, LOG_INFO, LOC + "calling StopReads()");
+ ringBuffer->StopReads();
++ }
+
+ if (curRecording)
+ {
diff --git a/mythtv/libs/libmythtv/tvremoteutil.cpp b/mythtv/libs/libmythtv/tvremoteutil.cpp
index d348d64..a73cc52 100644
--- a/mythtv/libs/libmythtv/tvremoteutil.cpp
@@ -13362,6 +14171,42 @@
{ "pdf" , "application/pdf" },
{ "avi" , "video/avi" },
{ "css" , "text/css" },
+diff --git a/mythtv/programs/mythbackend/filetransfer.cpp b/mythtv/programs/mythbackend/filetransfer.cpp
+index c339dc2..7c9d173 100644
+--- a/mythtv/programs/mythbackend/filetransfer.cpp
++++ b/mythtv/programs/mythbackend/filetransfer.cpp
+@@ -7,6 +7,7 @@
+ #include "mythmiscutil.h"
+ #include "mythsocket.h"
+ #include "programinfo.h"
++#include "mythlogging.h"
+
+ FileTransfer::FileTransfer(QString &filename, MythSocket *remote,
+ bool usereadahead, int timeout_ms) :
+@@ -94,6 +95,7 @@ void FileTransfer::Stop(void)
+ if (readthreadlive)
+ {
+ readthreadlive = false;
++ LOG(VB_FILE, LOG_INFO, "calling StopReads()");
+ rbuffer->StopReads();
+ QMutexLocker locker(&lock);
+ readsLocked = true;
+@@ -108,6 +110,7 @@ void FileTransfer::Stop(void)
+
+ void FileTransfer::Pause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, "calling StopReads()");
+ rbuffer->StopReads();
+ QMutexLocker locker(&lock);
+ readsLocked = true;
+@@ -118,6 +121,7 @@ void FileTransfer::Pause(void)
+
+ void FileTransfer::Unpause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, "calling StartReads()");
+ rbuffer->StartReads();
+ {
+ QMutexLocker locker(&lock);
diff --git a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp b/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
index 7a676fd..7d40e09 100644
--- a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
@@ -13399,7 +14244,7 @@
!profiles.contains("OpenGL High Quality") &&
!profiles.contains("OpenGL Slim"))
diff --git a/mythtv/programs/mythfrontend/guidegrid.cpp b/mythtv/programs/mythfrontend/guidegrid.cpp
-index 6dbf1aa..17d5fad 100644
+index 6dbf1aa..4ddac0e 100644
--- a/mythtv/programs/mythfrontend/guidegrid.cpp
+++ b/mythtv/programs/mythfrontend/guidegrid.cpp
@@ -1390,11 +1390,11 @@ void GuideGrid::customEvent(QEvent *event)
@@ -13416,6 +14261,24 @@
{
enter();
}
+@@ -1578,7 +1578,7 @@ void GuideGrid::updateChannels(void)
+ if (!chinfo->icon.isEmpty())
+ {
+ QString iconurl =
+- gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ chinfo->icon);
+ item->SetImage(iconurl, "channelicon");
+ }
+@@ -1612,7 +1612,7 @@ void GuideGrid::updateInfo(void)
+ m_channelImage->Reset();
+ if (!chinfo->icon.isEmpty())
+ {
+- QString iconurl = gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ QString iconurl = gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ chinfo->icon);
+
+ m_channelImage->SetFilename(iconurl);
diff --git a/mythtv/programs/mythfrontend/scheduleeditor.cpp b/mythtv/programs/mythfrontend/scheduleeditor.cpp
index 4f85c70..877371a 100644
--- a/mythtv/programs/mythfrontend/scheduleeditor.cpp
@@ -13474,3 +14337,16 @@
return GENERIC_EXIT_OK;
}
+diff --git a/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py b/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
+index 2f2ad3b..4abbf69 100644
+--- a/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
++++ b/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
+@@ -187,7 +187,7 @@ class Videos(object):
+ self.config[u'urls'] = {}
+
+ # v2 api calls - An example that must be customized for each target site
+- self.config[u'urls'][u'video.search'] = "http://www.blip.tv/search?q=%s;&page=%s;&pagelen=%s;&language_code=%s;&sk..."
++ self.config[u'urls'][u'video.search'] = "http://www.blip.tv/?search=%s;&page=%s;&pagelen=%s;&language_code=%s;&ski..."
+ self.config[u'urls'][u'categories'] = "http://www.blip.tv/?section=categories&cmd=view&skin=api"
+
+ self.config[u'image_extentions'] = ["png", "jpg", "bmp"] # Acceptable image extentions
Index: mythtv.spec
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-16/mythtv.spec,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -r1.91 -r1.92
--- mythtv.spec 23 Apr 2012 15:13:07 -0000 1.91
+++ mythtv.spec 30 Apr 2012 13:31:29 -0000 1.92
@@ -86,7 +86,7 @@
Release: 0.1.git.%{_gitrev}%{?dist}
#Release: 0.1.rc1%{?dist}
%else
-Release: 3%{?dist}
+Release: 5%{?dist}
%endif
# The primary license is GPLv2+, but bits are borrowed from a number of
@@ -683,6 +683,7 @@
Requires: python-imaging
Requires: transcode >= 1.0.2
Requires: m2vrequantiser
+Requires: pmount
%description -n mytharchive
MythArchive is a new plugin for MythTV that lets you create DVDs from
@@ -1480,6 +1481,11 @@
################################################################################
%changelog
+* Sun Apr 29 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-5
+- Update to latest 0.25/fixes.
+- Really fix logrotate this time.
+- Add pmount to mytharchive requirements.
+
* Sat Apr 21 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-3
- Removed obsolete build requirement for arts-devel.
- Re-add %%clean since it's still needed for mythweb.
12 years, 7 months
rpms/mythtv/F-17 mythbackend.logrotate, 1.1, 1.2 mythtv-0.25-fixes.patch, 1.3, 1.4 mythtv.spec, 1.93, 1.94
by Richard Shaw
Author: hobbes1069
Update of /cvs/free/rpms/mythtv/F-17
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv5299
Modified Files:
mythbackend.logrotate mythtv-0.25-fixes.patch mythtv.spec
Log Message:
* Sun Apr 29 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-5
- Update to latest 0.25/fixes.
- Really fix logrotate this time.
- Add pmount to mytharchive requirements.
Index: mythbackend.logrotate
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-17/mythbackend.logrotate,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- mythbackend.logrotate 3 Mar 2011 02:45:10 -0000 1.1
+++ mythbackend.logrotate 30 Apr 2012 13:30:12 -0000 1.2
@@ -1,4 +1,4 @@
-/var/log/mythtv/mythbackend.log {
+/var/log/mythtv/mythbackend.log /var/log/mythtv/myth*.*.*.log {
notifempty
missingok
compress
@@ -9,6 +9,6 @@
rotate 4
size 10M
postrotate
- /bin/kill -HUP `cat /var/run/mythbackend.pid 2>/dev/null` 2> /dev/null || true
+ /bin/systemctl kill mythbackend.service --signal=HUP --kill-who=main 2>/dev/null || true
endscript
}
mythtv-0.25-fixes.patch:
mythplugins/mytharchive/i18n/mytharchive_fi.qm |binary
mythplugins/mytharchive/i18n/mytharchive_fi.ts | 238
mythplugins/mythbrowser/i18n/mythbrowser_fi.qm |binary
mythplugins/mythbrowser/i18n/mythbrowser_fi.ts | 44
mythplugins/mythgallery/i18n/mythgallery_fi.qm |binary
mythplugins/mythgallery/i18n/mythgallery_fi.ts | 264
mythplugins/mythgame/i18n/mythgame_fi.qm |binary
mythplugins/mythgame/i18n/mythgame_fi.ts | 178
mythplugins/mythmusic/i18n/mythmusic_fi.qm |binary
mythplugins/mythmusic/i18n/mythmusic_fi.ts | 2219 +++++-
mythplugins/mythmusic/mythmusic/visualize.cpp | 60
mythplugins/mythnetvision/i18n/mythnetvision_fi.qm |binary
mythplugins/mythnetvision/i18n/mythnetvision_fi.ts | 96
mythplugins/mythnetvision/mythnetvision/nettree.cpp | 8
mythplugins/mythnetvision/mythnetvision/rsseditor.cpp | 6
mythplugins/mythnews/i18n/mythnews_fi.qm |binary
mythplugins/mythnews/i18n/mythnews_fi.ts | 44
mythplugins/mythweather/i18n/mythweather_fi.qm |binary
mythplugins/mythweather/i18n/mythweather_fi.ts | 60
mythplugins/mythzoneminder/i18n/mythzoneminder_fi.qm |binary
mythplugins/mythzoneminder/i18n/mythzoneminder_fi.ts | 84
mythplugins/mythzoneminder/mythzmserver/zmserver.cpp | 3
mythtv/VERSION | 2
mythtv/bindings/python/MythTV/mythproto.py | 4
mythtv/bindings/python/MythTV/static.py | 2
mythtv/configure | 15
mythtv/docs/doxygen-create-developer-docs.cfg | 2
mythtv/filters/yadif/filter_yadif.c | 2
mythtv/i18n/mythfrontend_fi.qm |binary
mythtv/i18n/mythfrontend_fi.ts | 3662 ++++++----
mythtv/i18n/mythfrontend_nb.qm |binary
mythtv/i18n/mythfrontend_nb.ts | 2
mythtv/libs/libmyth/audio/audiooutputalsa.cpp | 2
mythtv/libs/libmyth/audio/audiooutputbase.cpp | 55
mythtv/libs/libmyth/audio/audiooutputbase.h | 4
mythtv/libs/libmyth/audio/audiooutputca.cpp | 2
mythtv/libs/libmyth/audio/audiooutputdigitalencoder.cpp | 27
mythtv/libs/libmyth/remoteutil.cpp | 16
mythtv/libs/libmyth/remoteutil.h | 1
mythtv/libs/libmyth/rssparse.h | 1
mythtv/libs/libmythbase/bonjourregister.cpp | 5
mythtv/libs/libmythbase/compat.h | 2
mythtv/libs/libmythbase/logging.cpp | 3
mythtv/libs/libmythbase/serverpool.cpp | 46
mythtv/libs/libmythprotoserver/requesthandler/deletethread.cpp | 6
mythtv/libs/libmythsoundtouch/STTypes.h | 2
mythtv/libs/libmythsoundtouch/libmythsoundtouch.pro | 1
mythtv/libs/libmythtv/audioinput.h | 1
mythtv/libs/libmythtv/avformatdecoder.cpp | 10
mythtv/libs/libmythtv/dvdringbuffer.cpp | 49
mythtv/libs/libmythtv/fileringbuffer.cpp | 6
mythtv/libs/libmythtv/libmythtv.pro | 1
mythtv/libs/libmythtv/mythairplayserver.cpp | 2
mythtv/libs/libmythtv/mythplayer.cpp | 30
mythtv/libs/libmythtv/mythplayer.h | 3
mythtv/libs/libmythtv/mythraopconnection.cpp | 262
mythtv/libs/libmythtv/mythraopconnection.h | 13
mythtv/libs/libmythtv/mythraopdevice.cpp | 13
mythtv/libs/libmythtv/osd.cpp | 2
mythtv/libs/libmythtv/playercontext.h | 4
mythtv/libs/libmythtv/ringbuffer.cpp | 8
mythtv/libs/libmythtv/teletextscreen.cpp | 8
mythtv/libs/libmythtv/tv_play.cpp | 26
mythtv/libs/libmythtv/tv_rec.cpp | 3
mythtv/libs/libmythtv/tvremoteutil.cpp | 55
mythtv/libs/libmythtv/tvremoteutil.h | 7
mythtv/libs/libmythtv/videodisplayprofile.cpp | 3
mythtv/libs/libmythtv/videodisplayprofile.h | 2
mythtv/libs/libmythtv/videoout_xv.cpp | 7
mythtv/libs/libmythtv/videoout_xv.h | 1
mythtv/libs/libmythtv/videooutbase.cpp | 48
mythtv/libs/libmythui/mythmainwindow.cpp | 2
mythtv/libs/libmythupnp/httprequest.cpp | 1
mythtv/programs/mythbackend/filetransfer.cpp | 4
mythtv/programs/mythfrontend/audiogeneralsettings.cpp | 5
mythtv/programs/mythfrontend/globalsettings.cpp | 2
mythtv/programs/mythfrontend/guidegrid.cpp | 8
mythtv/programs/mythfrontend/scheduleeditor.cpp | 7
mythtv/programs/mythtranscode/transcode.h | 5
mythtv/programs/mythutil/markuputils.cpp | 4
mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py | 2
81 files changed, 5628 insertions(+), 2144 deletions(-)
Index: mythtv-0.25-fixes.patch
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-17/mythtv-0.25-fixes.patch,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- mythtv-0.25-fixes.patch 23 Apr 2012 15:11:18 -0000 1.3
+++ mythtv-0.25-fixes.patch 30 Apr 2012 13:30:12 -0000 1.4
@@ -8,6 +8,7 @@
mythplugins/mythgame/i18n/mythgame_fi.ts | 178 +-
mythplugins/mythmusic/i18n/mythmusic_fi.qm | Bin 56677 -> 56868 bytes
mythplugins/mythmusic/i18n/mythmusic_fi.ts | 2219 ++++++++++--
+ mythplugins/mythmusic/mythmusic/visualize.cpp | 60 +-
mythplugins/mythnetvision/i18n/mythnetvision_fi.qm | Bin 10270 -> 11758 bytes
mythplugins/mythnetvision/i18n/mythnetvision_fi.ts | 96 +-
.../mythnetvision/mythnetvision/nettree.cpp | 8 +-
@@ -20,7 +21,7 @@
.../mythzoneminder/i18n/mythzoneminder_fi.ts | 84 +-
.../mythzoneminder/mythzmserver/zmserver.cpp | 3 -
mythtv/VERSION | 2 +-
- mythtv/bindings/python/MythTV/mythproto.py | 2 +-
+ mythtv/bindings/python/MythTV/mythproto.py | 4 +-
mythtv/bindings/python/MythTV/static.py | 2 +-
mythtv/configure | 15 +-
mythtv/docs/doxygen-create-developer-docs.cfg | 2 +-
@@ -37,6 +38,7 @@
mythtv/libs/libmyth/remoteutil.cpp | 16 -
mythtv/libs/libmyth/remoteutil.h | 1 -
mythtv/libs/libmyth/rssparse.h | 1 +
+ mythtv/libs/libmythbase/bonjourregister.cpp | 5 +-
mythtv/libs/libmythbase/compat.h | 2 +
mythtv/libs/libmythbase/logging.cpp | 3 +-
mythtv/libs/libmythbase/serverpool.cpp | 46 +-
@@ -46,15 +48,20 @@
mythtv/libs/libmythtv/audioinput.h | 1 +
mythtv/libs/libmythtv/avformatdecoder.cpp | 10 +-
mythtv/libs/libmythtv/dvdringbuffer.cpp | 49 +-
+ mythtv/libs/libmythtv/fileringbuffer.cpp | 6 +-
mythtv/libs/libmythtv/libmythtv.pro | 1 +
mythtv/libs/libmythtv/mythairplayserver.cpp | 2 +-
mythtv/libs/libmythtv/mythplayer.cpp | 30 +-
mythtv/libs/libmythtv/mythplayer.h | 3 +
- mythtv/libs/libmythtv/mythraopdevice.cpp | 5 +-
+ mythtv/libs/libmythtv/mythraopconnection.cpp | 262 +-
+ mythtv/libs/libmythtv/mythraopconnection.h | 13 +-
+ mythtv/libs/libmythtv/mythraopdevice.cpp | 13 +-
+ mythtv/libs/libmythtv/osd.cpp | 2 +-
mythtv/libs/libmythtv/playercontext.h | 4 +-
mythtv/libs/libmythtv/ringbuffer.cpp | 8 +-
mythtv/libs/libmythtv/teletextscreen.cpp | 8 +-
mythtv/libs/libmythtv/tv_play.cpp | 26 +-
+ mythtv/libs/libmythtv/tv_rec.cpp | 3 +
mythtv/libs/libmythtv/tvremoteutil.cpp | 55 +-
mythtv/libs/libmythtv/tvremoteutil.h | 7 +-
mythtv/libs/libmythtv/videodisplayprofile.cpp | 3 -
@@ -64,13 +71,15 @@
mythtv/libs/libmythtv/videooutbase.cpp | 48 +-
mythtv/libs/libmythui/mythmainwindow.cpp | 2 +
mythtv/libs/libmythupnp/httprequest.cpp | 1 +
+ mythtv/programs/mythbackend/filetransfer.cpp | 4 +
.../programs/mythfrontend/audiogeneralsettings.cpp | 5 +-
mythtv/programs/mythfrontend/globalsettings.cpp | 2 +-
- mythtv/programs/mythfrontend/guidegrid.cpp | 4 +-
+ mythtv/programs/mythfrontend/guidegrid.cpp | 8 +-
mythtv/programs/mythfrontend/scheduleeditor.cpp | 7 +-
mythtv/programs/mythtranscode/transcode.h | 5 +-
mythtv/programs/mythutil/markuputils.cpp | 4 +-
- 72 files changed, 5420 insertions(+), 1981 deletions(-)
+ .../nv_python_libs/bliptv/bliptv_api.py | 2 +-
+ 81 files changed, 5628 insertions(+), 2144 deletions(-)
diff --git a/mythplugins/mytharchive/i18n/mytharchive_fi.qm b/mythplugins/mytharchive/i18n/mytharchive_fi.qm
index 2fc0f91..8e2d841 100644
@@ -4872,6 +4881,195 @@
</message>
</context>
</TS>
+diff --git a/mythplugins/mythmusic/mythmusic/visualize.cpp b/mythplugins/mythmusic/mythmusic/visualize.cpp
+index 66b050c..fac7989 100644
+--- a/mythplugins/mythmusic/mythmusic/visualize.cpp
++++ b/mythplugins/mythmusic/mythmusic/visualize.cpp
+@@ -168,11 +168,11 @@ bool StereoScope::process( VisualNode *node )
+ bool allZero = true;
+
+
+- if (node)
++ if (node)
+ {
+ double index = 0;
+ double const step = (double)SAMPLES_DEFAULT_SIZE / size.width();
+- for ( int i = 0; i < size.width(); i++)
++ for ( int i = 0; i < size.width(); i++)
+ {
+ unsigned long indexTo = (unsigned long)(index + step);
+ if (indexTo == (unsigned long)(index))
+@@ -194,13 +194,13 @@ bool StereoScope::process( VisualNode *node )
+ if ( valL < 0. )
+ valL = 0.;
+ }
+- if (valR < 0.)
++ if (valR < 0.)
+ {
+ valR += falloff;
+ if ( valR > 0. )
+ valR = 0.;
+- }
+- else
++ }
++ else
+ {
+ valR -= falloff;
+ if ( valR < 0. )
+@@ -208,7 +208,7 @@ bool StereoScope::process( VisualNode *node )
+ }
+ }
+ #endif
+- for (unsigned long s = (unsigned long)index; s < indexTo && s < node->length; s++)
++ for (unsigned long s = (unsigned long)index; s < indexTo && s < node->length; s++)
+ {
+ double tmpL = ( ( node->left ?
+ double( node->left[s] ) : 0.) *
+@@ -235,10 +235,10 @@ bool StereoScope::process( VisualNode *node )
+ index = index + step;
+ }
+ #if RUBBERBAND
+- }
+- else if (rubberband)
++ }
++ else if (rubberband)
+ {
+- for ( int i = 0; i < size.width(); i++)
++ for ( int i = 0; i < size.width(); i++)
+ {
+ double valL = magnitudes[ i ];
+ if (valL < 0) {
+@@ -271,8 +271,8 @@ bool StereoScope::process( VisualNode *node )
+ magnitudes[ i + size.width() ] = valR;
+ }
+ #endif
+- }
+- else
++ }
++ else
+ {
+ for ( int i = 0; (unsigned) i < magnitudes.size(); i++ )
+ magnitudes[ i ] = 0.;
+@@ -284,7 +284,7 @@ bool StereoScope::process( VisualNode *node )
+ bool StereoScope::draw( QPainter *p, const QColor &back )
+ {
+ p->fillRect(0, 0, size.width(), size.height(), back);
+- for ( int i = 1; i < size.width(); i++ )
++ for ( int i = 1; i < size.width(); i++ )
+ {
+ #if TWOCOLOUR
+ double r, g, b, per;
+@@ -611,7 +611,7 @@ Spectrum::Spectrum()
+ rplan = fftw_plan_dft_r2c_1d(FFTW_N, rin, (myth_fftw_complex_cast*)rout, FFTW_MEASURE);
+
+ startColor = QColor(0,0,255);
+- targetColor = QColor(255,0,0);
++ targetColor = QColor(255,0,0);
+ }
+
+ Spectrum::~Spectrum()
+@@ -679,7 +679,7 @@ bool Spectrum::process(VisualNode *node)
+ double *magnitudesp = magnitudes.data();
+ double magL, magR, tmp;
+
+- if (node)
++ if (node)
+ {
+ i = node->length;
+ if (i > FFTW_N)
+@@ -700,9 +700,9 @@ bool Spectrum::process(VisualNode *node)
+
+ for (i = 0; (int)i < rects.size(); i++, w += analyzerBarWidth)
+ {
+- magL = (log(sq(real(lout[index])) + sq(real(lout[FFTW_N - index]))) - 22.0) *
++ magL = (log(sq(real(lout[index])) + sq(real(lout[FFTW_N - index]))) - 22.0) *
+ scaleFactor;
+- magR = (log(sq(real(rout[index])) + sq(real(rout[FFTW_N - index]))) - 22.0) *
++ magR = (log(sq(real(rout[index])) + sq(real(rout[FFTW_N - index]))) - 22.0) *
+ scaleFactor;
+
+ if (magL > size.height() / 2)
+@@ -784,11 +784,11 @@ bool Spectrum::draw(QPainter *p, const QColor &back)
+
+ per = clamp(per, 1.0, 0.0);
+
+- r = startColor.red() +
++ r = startColor.red() +
+ (targetColor.red() - startColor.red()) * (per * per);
+- g = startColor.green() +
++ g = startColor.green() +
+ (targetColor.green() - startColor.green()) * (per * per);
+- b = startColor.blue() +
++ b = startColor.blue() +
+ (targetColor.blue() - startColor.blue()) * (per * per);
+
+ r = clamp(r, 255.0, 0.0);
+@@ -848,14 +848,14 @@ void Squares::resize (const QSize &newsize) {
+ size = newsize;
+ }
+
+-void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
++void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
+ {
+ double r, g, b, per;
+ int correction = (size.width() % rects.size ()) / 2;
+ int x = ((i / 2) * w) + correction;
+ int y;
+
+- if (i % 2 == 0)
++ if (i % 2 == 0)
+ {
+ y = c - h;
+ per = double(fake_height - rect->top()) / double(fake_height);
+@@ -866,15 +866,15 @@ void Squares::drawRect(QPainter *p, QRect *rect, int i, int c, int w, int h)
+ per = double(rect->bottom()) / double(fake_height);
+ }
+
+- per = clamp(per, 1.0, 0.0);
+-
+- r = startColor.red() +
++ per = clamp(per, 1.0, 0.0);
++
++ r = startColor.red() +
+ (targetColor.red() - startColor.red()) * (per * per);
+- g = startColor.green() +
++ g = startColor.green() +
+ (targetColor.green() - startColor.green()) * (per * per);
+- b = startColor.blue() +
++ b = startColor.blue() +
+ (targetColor.blue() - startColor.blue()) * (per * per);
+-
++
+ r = clamp(r, 255.0, 0.0);
+ g = clamp(g, 255.0, 0.0);
+ b = clamp(b, 255.0, 0.0);
+@@ -1496,7 +1496,7 @@ void AlbumArt::handleKeyPress(const QString &action)
+ /// this is the time an image is shown in the albumart visualizer
+ #define ALBUMARTCYCLETIME 10
+
+-bool AlbumArt::needsUpdate()
++bool AlbumArt::needsUpdate()
+ {
+ // if the track has changed we need to update the image
+ if (gPlayer->getCurrentMetadata() && m_currentMetadata != gPlayer->getCurrentMetadata())
+@@ -1536,7 +1536,7 @@ bool AlbumArt::draw(QPainter *p, const QColor &back)
+ }
+ }
+
+- if (m_image.isNull())
++ if (m_image.isNull())
+ {
+ drawWarning(p, back, m_size, QObject::tr("?"), 100);
+ return true;
+@@ -1581,7 +1581,7 @@ static class AlbumArtFactory : public VisFactory
+ Blank::Blank()
+ : VisualBase(true)
+ {
+- m_fps = 20;
++ m_fps = 1;
+ }
+
+ Blank::~Blank()
diff --git a/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm b/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm
index 38f9ca4..e8d8d66 100644
Binary files a/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm and b/mythplugins/mythnetvision/i18n/mythnetvision_fi.qm differ
@@ -5552,7 +5750,7 @@
\ No newline at end of file
+SOURCE_VERSION="v0.25"
diff --git a/mythtv/bindings/python/MythTV/mythproto.py b/mythtv/bindings/python/MythTV/mythproto.py
-index 41a39e8..9a891cb 100644
+index 41a39e8..f7ae3e6 100644
--- a/mythtv/bindings/python/MythTV/mythproto.py
+++ b/mythtv/bindings/python/MythTV/mythproto.py
@@ -657,7 +657,7 @@ class FileOps( BECache ):
@@ -5564,6 +5762,15 @@
if host:
m.append(host)
return self.backendCommand(BACKEND_SEP.join(m))
+@@ -784,7 +784,7 @@ class FreeSpace( DictData ):
+ _field_order = [ 'host', 'path', 'islocal',
+ 'disknumber', 'sgroupid', 'blocksize',
+ 'totalspace', 'usedspace']
+- _field_type = [3, 3, 2, 0, 0, 0, 0, 0, 0, 0]
++ _field_type = [3, 3, 2, 0, 0, 0, 0, 0]
+ def __str__(self):
+ return "<FreeSpace '%s@%s' at %s>"\
+ % (self.path, self.host, hex(id(self)))
diff --git a/mythtv/bindings/python/MythTV/static.py b/mythtv/bindings/python/MythTV/static.py
index 6b587b2..f539706 100644
--- a/mythtv/bindings/python/MythTV/static.py
@@ -12494,6 +12701,33 @@
#include "mythexp.h"
+diff --git a/mythtv/libs/libmythbase/bonjourregister.cpp b/mythtv/libs/libmythbase/bonjourregister.cpp
+index 017ee6d..7f98732 100644
+--- a/mythtv/libs/libmythbase/bonjourregister.cpp
++++ b/mythtv/libs/libmythbase/bonjourregister.cpp
+@@ -5,6 +5,7 @@
+
+ #include "mythlogging.h"
+ #include "bonjourregister.h"
++#include "mythcorecontext.h"
+
+ #define LOC QString("Bonjour: ")
+
+@@ -41,11 +42,13 @@ bool BonjourRegister::Register(uint16_t port, const QByteArray &type,
+ return true;
+ }
+
++ QByteArray host(gCoreContext->GetSetting("BonjourHostname", "").toUtf8());
++ const char *host_ptr = host.size() > 0 ? host.constData() : NULL;
+ uint16_t qport = qToBigEndian(port);
+ DNSServiceErrorType res =
+ DNSServiceRegister(&m_dnssref, 0, 0, (const char*)name.data(),
+ (const char*)type.data(),
+- NULL, 0, qport, txt.size(), (void*)txt.data(),
++ NULL, host_ptr, qport, txt.size(), (void*)txt.data(),
+ BonjourCallback, this);
+
+ if (kDNSServiceErr_NoError != res)
diff --git a/mythtv/libs/libmythbase/compat.h b/mythtv/libs/libmythbase/compat.h
index ff2890f..425624a 100644
--- a/mythtv/libs/libmythbase/compat.h
@@ -12766,6 +13000,30 @@
LOG(VB_PLAYBACK, LOG_INFO, LOC +
QString("DVD Serial Number %1").arg(m_serialnumber));
+diff --git a/mythtv/libs/libmythtv/fileringbuffer.cpp b/mythtv/libs/libmythtv/fileringbuffer.cpp
+index f917416..2985f57 100644
+--- a/mythtv/libs/libmythtv/fileringbuffer.cpp
++++ b/mythtv/libs/libmythtv/fileringbuffer.cpp
+@@ -453,8 +453,8 @@ int FileRingBuffer::safe_read(int fd, void *data, uint sz)
+ tot += ret;
+ }
+
+- //if (oldfile)
+- //break;
++ if (oldfile)
++ break;
+
+ if (ret == 0) // EOF returns 0
+ {
+@@ -465,7 +465,7 @@ int FileRingBuffer::safe_read(int fd, void *data, uint sz)
+
+ // 0.36 second timeout for livetvchain with usleep(60000),
+ // or 2.4 seconds if it's a new file less than 30 minutes old.
+- if (zerocnt >= (oldfile ? 4 : (livetvchain ? 6 : 40)))
++ if (zerocnt >= (livetvchain ? 6 : 40))
+ {
+ break;
+ }
diff --git a/mythtv/libs/libmythtv/libmythtv.pro b/mythtv/libs/libmythtv/libmythtv.pro
index f50d2cb..6df71d0 100644
--- a/mythtv/libs/libmythtv/libmythtv.pro
@@ -12867,19 +13125,501 @@
};
#endif
+diff --git a/mythtv/libs/libmythtv/mythraopconnection.cpp b/mythtv/libs/libmythtv/mythraopconnection.cpp
+index 962c142..df0b3a9 100644
+--- a/mythtv/libs/libmythtv/mythraopconnection.cpp
++++ b/mythtv/libs/libmythtv/mythraopconnection.cpp
+@@ -1,6 +1,3 @@
+-// TODO
+-// remove hardcoded frames per packet
+-
+ #include <QTimer>
+ #include <QTcpSocket>
+ #include <QUdpSocket>
+@@ -23,6 +20,22 @@
+
+ RSA* MythRAOPConnection::g_rsa = NULL;
+
++class NetStream : public QTextStream
++{
++public:
++ NetStream(QIODevice *device) : QTextStream(device)
++ {
++ };
++ NetStream &operator<<(const QString &str)
++ {
++ LOG(VB_GENERAL, LOG_DEBUG,
++ LOC + QString("Sending(%1): ").arg(str.length()) + str);
++ QTextStream *q = this;
++ *q << str;
++ return *this;
++ };
++};
++
+ MythRAOPConnection::MythRAOPConnection(QObject *parent, QTcpSocket *socket,
+ QByteArray id, int port)
+ : QObject(parent), m_watchdogTimer(NULL), m_socket(socket),
+@@ -87,7 +100,7 @@ MythRAOPConnection::~MythRAOPConnection()
+ bool MythRAOPConnection::Init(void)
+ {
+ // connect up the request socket
+- m_textStream = new QTextStream(m_socket);
++ m_textStream = new NetStream(m_socket);
+ m_textStream->setCodec("UTF-8");
+ if (!connect(m_socket, SIGNAL(readyRead()), this, SLOT(readClient())))
+ {
+@@ -138,6 +151,24 @@ bool MythRAOPConnection::Init(void)
+ return true;
+ }
+
++void MythRAOPConnection::udpDataReady(void)
++{
++ QUdpSocket *socket = dynamic_cast<QUdpSocket*>(sender());
++
++ while (socket->state() == QAbstractSocket::BoundState &&
++ socket->hasPendingDatagrams())
++ {
++ QByteArray buffer;
++ buffer.resize(socket->pendingDatagramSize());
++ QHostAddress sender;
++ quint16 senderPort;
++
++ socket->readDatagram(buffer.data(), buffer.size(),
++ &sender, &senderPort);
++ udpDataReady(buffer, sender, senderPort);
++ }
++}
++
+ void MythRAOPConnection::udpDataReady(QByteArray buf, QHostAddress peer,
+ quint16 port)
+ {
+@@ -191,7 +222,8 @@ void MythRAOPConnection::udpDataReady(QByteArray buf, QHostAddress peer,
+ m_resends.remove(this_sequence);
+ }
+ else
+- LOG(VB_GENERAL, LOG_WARNING, LOC + "Received unexpected resent packet.");
++ LOG(VB_GENERAL, LOG_WARNING, LOC + QString("Received unexpected resent packet %1")
++ .arg(this_sequence));
+ }
+
+ ExpireResendRequests(timenow);
+@@ -332,12 +364,13 @@ void MythRAOPConnection::ProcessSyncPacket(const QByteArray &buf, uint64_t timen
+
+ if (m_audio)
+ {
++ uint64_t total = averageaudio + averagequeue;
+ LOG(VB_GENERAL, LOG_DEBUG, LOC +
+ QString("Sync packet: Timestamp: %1 Current Audio ts: %2 (avsync %3ms) "
+ "Latency: audio %4 queue %5 total %6ms <-> target %7ms")
+ .arg(m_lastSyncTimestamp).arg(m_audio->GetAudiotime()).arg(averageav, 0)
+ .arg(averageaudio).arg(averagequeue)
+- .arg(averageaudio + averagequeue).arg(m_lastLatency));
++ .arg(total).arg(m_lastLatency));
+ }
+ m_latencyAudio = m_latencyQueued = m_latencyCounter = m_avSync = 0;
+ }
+@@ -463,78 +496,82 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ return;
+ }
+
+- QByteArray option = lines[0].left(lines[0].indexOf(" "));
++ *m_textStream << "RTSP/1.0 200 OK\r\n";
+
+- if (option == "OPTIONS")
++ if (tags.contains("Apple-Challenge"))
+ {
+- StartResponse(m_textStream);
+- if (tags.contains("Apple-Challenge"))
+- {
+- *m_textStream << "Apple-Response: ";
+- if (!LoadKey())
+- return;
+- int tosize = RSA_size(LoadKey());
+- unsigned char to[tosize];
+-
+- QByteArray challenge = QByteArray::fromBase64(tags["Apple-Challenge"].data());
+- int challenge_size = challenge.size();
+- if (challenge_size != 16)
+- {
+- LOG(VB_GENERAL, LOG_ERR, LOC +
+- QString("Decoded challenge size %1, expected 16").arg(challenge_size));
+- if (challenge_size > 16)
+- challenge_size = 16;
+- }
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Received Apple-Challenge"));
+
+- int i = 0;
+- unsigned char from[38];
+- memcpy(from, challenge.data(), challenge_size);
+- i += challenge_size;
+- if (m_socket->localAddress().protocol() == QAbstractSocket::IPv4Protocol)
+- {
+- uint32_t ip = m_socket->localAddress().toIPv4Address();
+- ip = qToBigEndian(ip);
+- memcpy(from + i, &ip, 4);
+- i += 4;
+- }
+- else if (m_socket->localAddress().protocol() == QAbstractSocket::IPv6Protocol)
+- {
+- // NB IPv6 untested
+- Q_IPV6ADDR ip = m_socket->localAddress().toIPv6Address();
+- //ip = qToBigEndian(ip);
+- memcpy(from + i, &ip, 16);
+- i += 16;
+- }
+- memcpy(from + i, m_hardwareId.data(), RAOP_HARDWARE_ID_SIZE);
+- i += RAOP_HARDWARE_ID_SIZE;
++ *m_textStream << "Apple-Response: ";
++ if (!LoadKey())
++ return;
++ int tosize = RSA_size(LoadKey());
++ unsigned char to[tosize];
+
+- int pad = 32 - i;
+- if (pad > 0)
+- {
+- memset(from + i, 0, pad);
+- i += pad;
+- }
++ QByteArray challenge = QByteArray::fromBase64(tags["Apple-Challenge"].data());
++ int challenge_size = challenge.size();
++ if (challenge_size != 16)
++ {
++ LOG(VB_GENERAL, LOG_ERR, LOC +
++ QString("Decoded challenge size %1, expected 16").arg(challenge_size));
++ if (challenge_size > 16)
++ challenge_size = 16;
++ }
++
++ int i = 0;
++ unsigned char from[38];
++ memcpy(from, challenge.data(), challenge_size);
++ i += challenge_size;
++ if (m_socket->localAddress().protocol() == QAbstractSocket::IPv4Protocol)
++ {
++ uint32_t ip = m_socket->localAddress().toIPv4Address();
++ ip = qToBigEndian(ip);
++ memcpy(from + i, &ip, 4);
++ i += 4;
++ }
++ else if (m_socket->localAddress().protocol() == QAbstractSocket::IPv6Protocol)
++ {
++ // NB IPv6 untested
++ Q_IPV6ADDR ip = m_socket->localAddress().toIPv6Address();
++ //ip = qToBigEndian(ip);
++ memcpy(from + i, &ip, 16);
++ i += 16;
++ }
++ memcpy(from + i, m_hardwareId.data(), RAOP_HARDWARE_ID_SIZE);
++ i += RAOP_HARDWARE_ID_SIZE;
+
+- LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Full base64 response: '%1' size %2")
+- .arg(QByteArray((const char*)from, i).toBase64().data()).arg(i));
++ int pad = 32 - i;
++ if (pad > 0)
++ {
++ memset(from + i, 0, pad);
++ i += pad;
++ }
+
+- RSA_private_encrypt(i, from, to, LoadKey(), RSA_PKCS1_PADDING);
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Full base64 response: '%1' size %2")
++ .arg(QByteArray((const char*)from, i).toBase64().data()).arg(i));
+
+- QByteArray base64 = QByteArray((const char*)to, tosize).toBase64();
++ RSA_private_encrypt(i, from, to, LoadKey(), RSA_PKCS1_PADDING);
+
+- for (int pos = base64.size() - 1; pos > 0; pos--)
+- {
+- if (base64[pos] == '=')
+- base64[pos] = ' ';
+- else
+- break;
+- }
++ QByteArray base64 = QByteArray((const char*)to, tosize).toBase64();
+
+- *m_textStream << base64.trimmed() << "\r\n";
++ for (int pos = base64.size() - 1; pos > 0; pos--)
++ {
++ if (base64[pos] == '=')
++ base64[pos] = ' ';
++ else
++ break;
+ }
++ LOG(VB_GENERAL, LOG_DEBUG, QString("tSize=%1 tLen=%2 tResponse=%3")
++ .arg(tosize).arg(base64.size()).arg(base64.data()));
++ *m_textStream << base64.trimmed() << "\r\n";
++ }
+
++ QByteArray option = lines[0].left(lines[0].indexOf(" "));
++
++ if (option == "OPTIONS")
++ {
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ *m_textStream << "Public: ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, TEARDOWN, OPTIONS, GET_PARAMETER, SET_PARAMETER\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+ }
+ else if (option == "ANNOUNCE")
+ {
+@@ -589,9 +626,7 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Audio parameter: %1").arg(fmt));
+ }
+ }
+-
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+ else if (option == "SETUP")
+ {
+@@ -617,14 +652,6 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ QString("control port: %1 timing port: %2")
+ .arg(control_port).arg(timing_port));
+
+- StartResponse(m_textStream);
+- *m_textStream << "Transport: " << tags["Transport"];
+- *m_textStream << ";server_port=" << QString::number(m_dataPort) << "\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+-
+- if (OpenAudioDevice())
+- CreateDecoder();
+-
+ if (m_clientControlSocket)
+ {
+ m_clientControlSocket->disconnect();
+@@ -632,21 +659,31 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ delete m_clientControlSocket;
+ }
+
+- m_clientControlSocket = new ServerPool(this);
++ m_clientControlSocket = new QUdpSocket(this);
+ if (!m_clientControlSocket->bind(control_port))
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC +
+- QString("Failed to bind to client control port %1").arg(control_port));
++ QString("Failed to bind to client control port %1. "
++ "Control of audio stream may fail")
++ .arg(control_port));
+ }
+ else
+ {
+ LOG(VB_GENERAL, LOG_INFO, LOC +
+ QString("Bound to client control port %1").arg(control_port));
+- m_peerAddress = m_socket->peerAddress();
+- m_clientControlPort = control_port;
+- connect(m_clientControlSocket, SIGNAL(newDatagram(QByteArray, QHostAddress, quint16)),
+- this, SLOT(udpDataReady(QByteArray, QHostAddress, quint16)));
+ }
++
++ if (OpenAudioDevice())
++ CreateDecoder();
++
++ m_peerAddress = m_socket->peerAddress();
++ m_clientControlPort = control_port;
++ connect(m_clientControlSocket, SIGNAL(readyRead()), this, SLOT(udpDataReady()));
++
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ *m_textStream << "Transport: " << tags["Transport"].data();
++ *m_textStream << ";server_port=" << QString::number(m_dataPort);
++ *m_textStream << "\r\nSession: MYTHTV\r\n";
+ }
+ else
+ {
+@@ -656,13 +693,24 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ }
+ else if (option == "RECORD")
+ {
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ }
++ else if (option == "TEARDOWN")
++ {
++ *m_textStream << "Connection: close\r\n";
++ StartResponse(m_textStream, option, tags["CSeq"]);
++ }
++ else if (option == "FLUSH")
++ {
++ ResetAudio();
++ *m_textStream << "flush\r\n";
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+ else if (option == "SET_PARAMETER")
+ {
+ foreach (QByteArray line, lines)
+ {
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ if (line.startsWith("volume:") && m_allowVolumeControl && m_audio)
+ {
+ QByteArray rawvol = line.mid(7).trimmed();
+@@ -674,43 +722,34 @@ void MythRAOPConnection::ProcessRequest(const QList<QByteArray> &lines)
+ m_audio->SetCurrentVolume((int)volume);
+ }
+ }
+-
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+- }
+- else if (option == "FLUSH")
+- {
+- ResetAudio();
+- StartResponse(m_textStream);
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
+ }
+- else if (option == "TEARDOWN")
++ else
+ {
+- StartResponse(m_textStream);
+- *m_textStream << "Connection: close\r\n";
+- FinishResponse(m_textStream, m_socket, option, tags["Cseq"]);
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Command not handled: %1")
++ .arg(option.data()));
++ StartResponse(m_textStream, option, tags["CSeq"]);
+ }
+-
++ FinishResponse(m_textStream, m_socket, option, tags["CSeq"]);
+ }
+
+-void MythRAOPConnection::StartResponse(QTextStream *stream)
++void MythRAOPConnection::StartResponse(NetStream *stream,
++ QByteArray &option, QByteArray &cseq)
+ {
+ if (!stream)
+ return;
+- *stream << "RTSP/1.0 200 OK\r\n";
+-}
+-
+-void MythRAOPConnection::FinishResponse(QTextStream *stream, QTcpSocket *socket,
+- QByteArray &option, QByteArray &cseq)
+-{
+ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("%1 sequence %2")
+ .arg(option.data()).arg(cseq.data()));
+ *stream << "Audio-Jack-Status: connected; type=analog\r\n";
+ *stream << "CSeq: " << cseq << "\r\n";
++}
++
++void MythRAOPConnection::FinishResponse(NetStream *stream, QTcpSocket *socket,
++ QByteArray &option, QByteArray &cseq)
++{
+ *stream << "\r\n";
+ stream->flush();
+- LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Send: %1")
+- .arg(socket->flush()));
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Finished %1 %2 , Send: %3")
++ .arg(option.data()).arg(cseq.data()).arg(socket->flush()));
+ }
+
+ RSA* MythRAOPConnection::LoadKey(void)
+@@ -797,7 +836,7 @@ bool MythRAOPConnection::CreateDecoder(void)
+ extradata[13] = (fs >> 16) & 0xff;
+ extradata[14] = (fs >> 8) & 0xff;
+ extradata[15] = fs & 0xff;
+- extradata[16] = 2; // channels
++ extradata[16] = m_channels; // channels
+ extradata[17] = m_audioFormat[3]; // sample size
+ extradata[18] = m_audioFormat[4]; // rice_historymult
+ extradata[19] = m_audioFormat[5]; // rice_initialhistory
+@@ -805,7 +844,7 @@ bool MythRAOPConnection::CreateDecoder(void)
+ }
+ m_codeccontext->extradata = extradata;
+ m_codeccontext->extradata_size = 36;
+- m_codeccontext->channels = 2;
++ m_codeccontext->channels = m_channels;
+ if (avcodec_open(m_codeccontext, m_codec) < 0)
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to open ALAC decoder - going silent...");
+@@ -834,6 +873,7 @@ bool MythRAOPConnection::OpenAudioDevice(void)
+ CloseAudioDevice();
+
+ m_sampleRate = m_audioFormat.size() >= 12 ? m_audioFormat[11] : DEFAULT_SAMPLE_RATE;
++ m_channels = m_audioFormat[7] > 0 ? m_audioFormat[7] : 2;
+ if (m_sampleRate < 1)
+ m_sampleRate = DEFAULT_SAMPLE_RATE;
+
+@@ -841,7 +881,7 @@ bool MythRAOPConnection::OpenAudioDevice(void)
+ ? gCoreContext->GetSetting("PassThruOutputDevice") : QString::null;
+ QString device = gCoreContext->GetSetting("AudioOutputDevice");
+
+- m_audio = AudioOutput::OpenAudio(device, passthru, FORMAT_S16, 2,
++ m_audio = AudioOutput::OpenAudio(device, passthru, FORMAT_S16, m_channels,
+ 0, m_sampleRate, AUDIOOUTPUT_MUSIC,
+ m_allowVolumeControl, false);
+ if (!m_audio)
+diff --git a/mythtv/libs/libmythtv/mythraopconnection.h b/mythtv/libs/libmythtv/mythraopconnection.h
+index 9d56d4e..e229f83 100644
+--- a/mythtv/libs/libmythtv/mythraopconnection.h
++++ b/mythtv/libs/libmythtv/mythraopconnection.h
+@@ -15,12 +15,12 @@ extern "C" {
+ #include "libavformat/avformat.h"
+ }
+
+-class QTextStream;
+ class QTcpSocket;
+ class QUdpSocket;
+ class QTimer;
+ class AudioOutput;
+ class ServerPool;
++class NetStream;
+
+ typedef QHash<QByteArray,QByteArray> RawHash;
+
+@@ -42,6 +42,7 @@ class MythRAOPConnection : public QObject
+ public slots:
+ void readClient(void);
+ void udpDataReady(QByteArray buf, QHostAddress peer, quint16 port);
++ void udpDataReady(void);
+ void timeout(void);
+ void audioRetry(void);
+
+@@ -58,8 +59,9 @@ class MythRAOPConnection : public QObject
+ void ProcessAudio(uint64_t timenow);
+ void ResetAudio(void);
+ void ProcessRequest(const QList<QByteArray> &lines);
+- void StartResponse(QTextStream *stream);
+- void FinishResponse(QTextStream *stream, QTcpSocket *socket,
++ void StartResponse(NetStream *stream,
++ QByteArray &option, QByteArray &cseq);
++ void FinishResponse(NetStream *stream, QTcpSocket *socket,
+ QByteArray &option, QByteArray &cseq);
+ RawHash FindTags(const QList<QByteArray> &lines);
+ bool CreateDecoder(void);
+@@ -72,13 +74,13 @@ class MythRAOPConnection : public QObject
+ QTimer *m_watchdogTimer;
+ // comms socket
+ QTcpSocket *m_socket;
+- QTextStream *m_textStream;
++ NetStream *m_textStream;
+ QByteArray m_hardwareId;
+ // incoming audio
+ QHostAddress m_peerAddress;
+ int m_dataPort;
+ ServerPool *m_dataSocket;
+- ServerPool *m_clientControlSocket;
++ QUdpSocket *m_clientControlSocket;
+ int m_clientControlPort;
+ QMap<uint16_t,uint64_t> m_resends;
+ // crypto
+@@ -91,6 +93,7 @@ class MythRAOPConnection : public QObject
+ AVCodecContext *m_codeccontext;
+ QList<int> m_audioFormat;
+ int m_sampleRate;
++ int m_channels;
+ typedef struct
+ {
+ int16_t *samples;
diff --git a/mythtv/libs/libmythtv/mythraopdevice.cpp b/mythtv/libs/libmythtv/mythraopdevice.cpp
-index 82a6a61..f27f166 100644
+index 82a6a61..bad4932 100644
--- a/mythtv/libs/libmythtv/mythraopdevice.cpp
+++ b/mythtv/libs/libmythtv/mythraopdevice.cpp
-@@ -1,6 +1,7 @@
+@@ -1,6 +1,6 @@
#include <QTimer>
#include <QtEndian>
- #include <QTcpSocket>
+-#include <QTcpSocket>
+#include <QNetworkInterface>
#include "mthread.h"
#include "mythlogging.h"
-@@ -131,7 +132,7 @@ void MythRAOPDevice::Start(void)
+@@ -131,7 +131,7 @@ void MythRAOPDevice::Start(void)
int baseport = m_setupPort;
while (m_setupPort < baseport + RAOP_PORT_RANGE)
{
@@ -12888,7 +13628,28 @@
{
LOG(VB_GENERAL, LOG_INFO, LOC +
QString("Listening for connections on port %1").arg(m_setupPort));
-@@ -242,8 +243,8 @@ void MythRAOPDevice::deleteClient(void)
+@@ -145,11 +145,6 @@ void MythRAOPDevice::Start(void)
+
+ // announce service
+ m_bonjour = new BonjourRegister(this);
+- if (!m_bonjour)
+- {
+- LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to create Bonjour object.");
+- return;
+- }
+
+ // give each frontend a unique name
+ int multiple = m_setupPort - baseport;
+@@ -176,6 +171,8 @@ void MythRAOPDevice::Start(void)
+ txt.append(4); txt.append("vn=3");
+ txt.append(9); txt.append("txtvers=1");
+
++ LOG(VB_GENERAL, LOG_INFO, QString("Registering service %1.%2 port %3 TXT %4")
++ .arg(QString(name)).arg(QString(type)).arg(m_setupPort).arg(QString(txt)));
+ if (!m_bonjour->Register(m_setupPort, type, name, txt))
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to register service.");
+@@ -242,8 +239,8 @@ void MythRAOPDevice::deleteClient(void)
if ((*it)->GetSocket()->state() == QTcpSocket::UnconnectedState)
{
LOG(VB_GENERAL, LOG_INFO, LOC + "Removing client connection.");
@@ -12898,6 +13659,19 @@
return;
}
}
+diff --git a/mythtv/libs/libmythtv/osd.cpp b/mythtv/libs/libmythtv/osd.cpp
+index 207ecef..d0860db 100644
+--- a/mythtv/libs/libmythtv/osd.cpp
++++ b/mythtv/libs/libmythtv/osd.cpp
+@@ -428,7 +428,7 @@ void OSD::SetText(const QString &window, QHash<QString,QString> &map,
+ if (!iconpath.isEmpty())
+ {
+ QString iconurl =
+- gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ iconpath);
+
+ icon->SetFilename(iconurl);
diff --git a/mythtv/libs/libmythtv/playercontext.h b/mythtv/libs/libmythtv/playercontext.h
index 5854de4..a4ce9f1 100644
--- a/mythtv/libs/libmythtv/playercontext.h
@@ -12922,39 +13696,59 @@
PlayerContext(const QString &inUseID = QString("Unknown"));
~PlayerContext();
diff --git a/mythtv/libs/libmythtv/ringbuffer.cpp b/mythtv/libs/libmythtv/ringbuffer.cpp
-index e3f0a5a..3883de2 100644
+index e3f0a5a..5e720c2 100644
--- a/mythtv/libs/libmythtv/ringbuffer.cpp
+++ b/mythtv/libs/libmythtv/ringbuffer.cpp
-@@ -724,6 +724,7 @@ void RingBuffer::run(void)
- struct timeval lastread, now;
- int readtimeavg = 300;
- bool ignore_for_read_timing = true;
-+ bool did_set_oldfile = false;
+@@ -553,6 +553,7 @@ void RingBuffer::KillReadAheadThread(void)
+ */
+ void RingBuffer::StopReads(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "StopReads()");
+ stopreads = true;
+ generalWait.wakeAll();
+ }
+@@ -563,6 +564,7 @@ void RingBuffer::StopReads(void)
+ */
+ void RingBuffer::StartReads(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "StartReads()");
+ stopreads = false;
+ generalWait.wakeAll();
+ }
+@@ -573,6 +575,7 @@ void RingBuffer::StartReads(void)
+ */
+ void RingBuffer::Pause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "Pause()");
+ StopReads();
- gettimeofday(&lastread, NULL); // this is just to keep gcc happy
+ rwlock.lockForWrite();
+@@ -586,6 +589,7 @@ void RingBuffer::Pause(void)
+ */
+ void RingBuffer::Unpause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + "Unpause()");
+ StartReads();
-@@ -842,8 +843,12 @@ void RingBuffer::run(void)
+ rwlock.lockForWrite();
+@@ -842,9 +846,6 @@ void RingBuffer::run(void)
"Reading enough data to start playback");
}
- if (remotefile && livetvchain && livetvchain->HasNext())
-+ if (!did_set_oldfile && remotefile && livetvchain &&
-+ livetvchain->HasNext())
-+ {
- remotefile->SetTimeout(true);
-+ did_set_oldfile = true;
-+ }
-
+- remotefile->SetTimeout(true);
+-
LOG(VB_FILE, LOG_DEBUG, LOC +
QString("safe_read(...@%1, %2) -- begin")
-@@ -917,6 +922,7 @@ void RingBuffer::run(void)
- {
- livetvchain->SwitchToNext(true);
- setswitchtonext = true;
-+ did_set_oldfile = false;
- }
- }
- else
+ .arg(rbwpos).arg(totfree));
+@@ -1551,6 +1552,7 @@ void RingBuffer::SetWriteBufferMinWriteSize(int newMinSize)
+ */
+ void RingBuffer::SetOldFile(bool is_old)
+ {
++ LOG(VB_FILE, LOG_INFO, LOC + QString("SetOldFile(%1)").arg(is_old));
+ rwlock.lockForWrite();
+ oldfile = is_old;
+ rwlock.unlock();
diff --git a/mythtv/libs/libmythtv/teletextscreen.cpp b/mythtv/libs/libmythtv/teletextscreen.cpp
index 5490672..6bb0e13 100644
--- a/mythtv/libs/libmythtv/teletextscreen.cpp
@@ -13056,6 +13850,21 @@
vector<uint> interesting = CardUtil::GetCardIDs(sourceid);
// filter disconnected cards
+diff --git a/mythtv/libs/libmythtv/tv_rec.cpp b/mythtv/libs/libmythtv/tv_rec.cpp
+index bf15151..3311360 100644
+--- a/mythtv/libs/libmythtv/tv_rec.cpp
++++ b/mythtv/libs/libmythtv/tv_rec.cpp
+@@ -1080,7 +1080,10 @@ void TVRec::TeardownRecorder(uint request_flags)
+ }
+
+ if (ringBuffer)
++ {
++ LOG(VB_FILE, LOG_INFO, LOC + "calling StopReads()");
+ ringBuffer->StopReads();
++ }
+
+ if (curRecording)
+ {
diff --git a/mythtv/libs/libmythtv/tvremoteutil.cpp b/mythtv/libs/libmythtv/tvremoteutil.cpp
index d348d64..a73cc52 100644
--- a/mythtv/libs/libmythtv/tvremoteutil.cpp
@@ -13362,6 +14171,42 @@
{ "pdf" , "application/pdf" },
{ "avi" , "video/avi" },
{ "css" , "text/css" },
+diff --git a/mythtv/programs/mythbackend/filetransfer.cpp b/mythtv/programs/mythbackend/filetransfer.cpp
+index c339dc2..7c9d173 100644
+--- a/mythtv/programs/mythbackend/filetransfer.cpp
++++ b/mythtv/programs/mythbackend/filetransfer.cpp
+@@ -7,6 +7,7 @@
+ #include "mythmiscutil.h"
+ #include "mythsocket.h"
+ #include "programinfo.h"
++#include "mythlogging.h"
+
+ FileTransfer::FileTransfer(QString &filename, MythSocket *remote,
+ bool usereadahead, int timeout_ms) :
+@@ -94,6 +95,7 @@ void FileTransfer::Stop(void)
+ if (readthreadlive)
+ {
+ readthreadlive = false;
++ LOG(VB_FILE, LOG_INFO, "calling StopReads()");
+ rbuffer->StopReads();
+ QMutexLocker locker(&lock);
+ readsLocked = true;
+@@ -108,6 +110,7 @@ void FileTransfer::Stop(void)
+
+ void FileTransfer::Pause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, "calling StopReads()");
+ rbuffer->StopReads();
+ QMutexLocker locker(&lock);
+ readsLocked = true;
+@@ -118,6 +121,7 @@ void FileTransfer::Pause(void)
+
+ void FileTransfer::Unpause(void)
+ {
++ LOG(VB_FILE, LOG_INFO, "calling StartReads()");
+ rbuffer->StartReads();
+ {
+ QMutexLocker locker(&lock);
diff --git a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp b/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
index 7a676fd..7d40e09 100644
--- a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
@@ -13399,7 +14244,7 @@
!profiles.contains("OpenGL High Quality") &&
!profiles.contains("OpenGL Slim"))
diff --git a/mythtv/programs/mythfrontend/guidegrid.cpp b/mythtv/programs/mythfrontend/guidegrid.cpp
-index 6dbf1aa..17d5fad 100644
+index 6dbf1aa..4ddac0e 100644
--- a/mythtv/programs/mythfrontend/guidegrid.cpp
+++ b/mythtv/programs/mythfrontend/guidegrid.cpp
@@ -1390,11 +1390,11 @@ void GuideGrid::customEvent(QEvent *event)
@@ -13416,6 +14261,24 @@
{
enter();
}
+@@ -1578,7 +1578,7 @@ void GuideGrid::updateChannels(void)
+ if (!chinfo->icon.isEmpty())
+ {
+ QString iconurl =
+- gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ chinfo->icon);
+ item->SetImage(iconurl, "channelicon");
+ }
+@@ -1612,7 +1612,7 @@ void GuideGrid::updateInfo(void)
+ m_channelImage->Reset();
+ if (!chinfo->icon.isEmpty())
+ {
+- QString iconurl = gCoreContext->GetMasterHostPrefix("ChannelIcon",
++ QString iconurl = gCoreContext->GetMasterHostPrefix("ChannelIcons",
+ chinfo->icon);
+
+ m_channelImage->SetFilename(iconurl);
diff --git a/mythtv/programs/mythfrontend/scheduleeditor.cpp b/mythtv/programs/mythfrontend/scheduleeditor.cpp
index 4f85c70..877371a 100644
--- a/mythtv/programs/mythfrontend/scheduleeditor.cpp
@@ -13474,3 +14337,16 @@
return GENERIC_EXIT_OK;
}
+diff --git a/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py b/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
+index 2f2ad3b..4abbf69 100644
+--- a/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
++++ b/mythtv/programs/scripts/internetcontent/nv_python_libs/bliptv/bliptv_api.py
+@@ -187,7 +187,7 @@ class Videos(object):
+ self.config[u'urls'] = {}
+
+ # v2 api calls - An example that must be customized for each target site
+- self.config[u'urls'][u'video.search'] = "http://www.blip.tv/search?q=%s;&page=%s;&pagelen=%s;&language_code=%s;&sk..."
++ self.config[u'urls'][u'video.search'] = "http://www.blip.tv/?search=%s;&page=%s;&pagelen=%s;&language_code=%s;&ski..."
+ self.config[u'urls'][u'categories'] = "http://www.blip.tv/?section=categories&cmd=view&skin=api"
+
+ self.config[u'image_extentions'] = ["png", "jpg", "bmp"] # Acceptable image extentions
Index: mythtv.spec
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-17/mythtv.spec,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -r1.93 -r1.94
--- mythtv.spec 23 Apr 2012 15:11:18 -0000 1.93
+++ mythtv.spec 30 Apr 2012 13:30:12 -0000 1.94
@@ -86,7 +86,7 @@
Release: 0.1.git.%{_gitrev}%{?dist}
#Release: 0.1.rc1%{?dist}
%else
-Release: 3%{?dist}
+Release: 5%{?dist}
%endif
# The primary license is GPLv2+, but bits are borrowed from a number of
@@ -683,6 +683,7 @@
Requires: python-imaging
Requires: transcode >= 1.0.2
Requires: m2vrequantiser
+Requires: pmount
%description -n mytharchive
MythArchive is a new plugin for MythTV that lets you create DVDs from
@@ -1480,6 +1481,11 @@
################################################################################
%changelog
+* Sun Apr 29 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-5
+- Update to latest 0.25/fixes.
+- Really fix logrotate this time.
+- Add pmount to mytharchive requirements.
+
* Sat Apr 21 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-3
- Removed obsolete build requirement for arts-devel.
- Re-add %%clean since it's still needed for mythweb.
12 years, 7 months
rpms/nvidia-173xx-kmod/devel dead.package, 1.2, 1.3 nvidia-173xx-kmod.spec, 1.42, NONE sources, 1.9, NONE
by Leigh Scott
Author: leigh123linux
Update of /cvs/nonfree/rpms/nvidia-173xx-kmod/devel
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv29132
Added Files:
dead.package
Removed Files:
nvidia-173xx-kmod.spec sources
Log Message:
Not compatible with xorg-server in F-18
Index: dead.package
===================================================================
RCS file: dead.package
diff -N dead.package
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dead.package 30 Apr 2012 08:24:55 -0000 1.3
@@ -0,0 +1 @@
+Not compatible with xorg-server in F-18
--- nvidia-173xx-kmod.spec DELETED ---
--- sources DELETED ---
12 years, 7 months
rpms/nvidia-173xx-kmod/F-17 dead.package, 1.2, 1.3 nvidia-173xx-kmod.spec, 1.46, NONE sources, 1.9, NONE
by Leigh Scott
Author: leigh123linux
Update of /cvs/nonfree/rpms/nvidia-173xx-kmod/F-17
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv28915
Added Files:
dead.package
Removed Files:
nvidia-173xx-kmod.spec sources
Log Message:
Not compatible with xorg-server in F-17
Index: dead.package
===================================================================
RCS file: dead.package
diff -N dead.package
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dead.package 30 Apr 2012 08:20:30 -0000 1.3
@@ -0,0 +1 @@
+Not compatible with xorg-server in F-17
--- nvidia-173xx-kmod.spec DELETED ---
--- sources DELETED ---
12 years, 7 months
rpms/VirtualBox-OSE/F-17 vboxservice.service, NONE, 1.1 vboxweb.service, NONE, 1.1 VirtualBox-OSE.spec, 1.91, 1.92 vboxweb-service, 1.1, NONE
by Sérgio M. Basto
Author: sergiomb
Update of /cvs/free/rpms/VirtualBox-OSE/F-17
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv20308
Modified Files:
VirtualBox-OSE.spec
Added Files:
vboxservice.service vboxweb.service
Removed Files:
vboxweb-service
Log Message:
* Sun Apr 29 2012 Sérgio Basto <sergio(a)serjux.com> - 4.1.14-2
- Migrating vboxweb-service to a systemd unit file from a SysV initscript
- Add vboxservice.service systemd unit file in guest package, rfbz #2274.
--- NEW FILE vboxservice.service ---
[Unit]
Description=VirtualBox guest services
ConditionVirtualization=oracle
[Service]
ExecStart=/usr/bin/VBoxService -f
[Install]
WantedBy=multi-user.target
--- NEW FILE vboxweb.service ---
[Unit]
Description=VirtualBox OSE Web Service
After=network.target
[Service]
Type=forking
PIDFile=/run/vboxweb.pid
ExecStart=/usr/bin/vboxwebsrv --pidfile /run/vboxweb.pid --background
[Install]
WantedBy=multi-user.target
Index: VirtualBox-OSE.spec
===================================================================
RCS file: /cvs/free/rpms/VirtualBox-OSE/F-17/VirtualBox-OSE.spec,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -r1.91 -r1.92
--- VirtualBox-OSE.spec 26 Apr 2012 22:19:40 -0000 1.91
+++ VirtualBox-OSE.spec 29 Apr 2012 17:02:50 -0000 1.92
@@ -1,5 +1,7 @@
%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+%global systemd_dir /lib/systemd/system
+
# Standard compiler flags, without:
# -Wall -- VirtualBox-OSE takes care of reasonable warnings very well
# -m32, -m64 -- 32bit code is built besides 64bit on x86_64
@@ -15,7 +17,7 @@
Name: VirtualBox-OSE
Version: 4.1.14
-Release: 1%{?prerel:.%{prerel}}%{?dist}
+Release: 2%{?prerel:.%{prerel}}%{?dist}
Summary: A general-purpose full virtualizer for PC hardware
Group: Development/Tools
@@ -28,7 +30,8 @@
Source7: VirtualBox-OSE-guest.modules
Source8: VirtualBox-OSE-vboxresize.desktop
Source9: VirtualBox-OSE-00-vboxvideo.conf
-Source10: vboxweb-service
+Source10: vboxweb.service
+Source11: vboxservice.service
Patch1: VirtualBox-OSE-4.1.4-noupdate.patch
Patch2: VirtualBox-OSE-4.1.6-strings.patch
Patch3: VirtualBox-OSE-4.1.2-libcxx.patch
@@ -92,6 +95,8 @@
%endif
Requires(post): systemd-units
+Requires(preun): systemd-units
+Requires(postun): systemd-units
Requires: %{name}-kmod = %{version}%{?prereltag}
Provides: %{name}-kmod-common = %{version}%{?prereltag}
@@ -142,6 +147,7 @@
%description guest
+This is the same that Guest Additions, therefore should only be installed on a guest system.
Tools that utilize kernel modules for supporting integration
with the Host, including file sharing and tracking of mouse pointer
movement and X.org X11 video and mouse driver.
@@ -337,7 +343,10 @@
$RPM_BUILD_ROOT%{_sysconfdir}/X11/xorg.conf.d/00-vboxvideo.conf
install -m 0755 -D %{SOURCE10} \
- $RPM_BUILD_ROOT%{_initrddir}/vboxweb-service
+ $RPM_BUILD_ROOT%{systemd_dir}/vboxweb.service
+
+install -m 0755 -D %{SOURCE11} \
+ $RPM_BUILD_ROOT%{systemd_dir}/vboxservice.service
install -m 0755 -D src/VBox/Additions/x11/Installer/98vboxadd-xclient \
$RPM_BUILD_ROOT%{_sysconfdir}/X11/xinit/xinitrc.d/98vboxadd-xclient.sh
@@ -393,7 +402,9 @@
/usr/bin/update-mime-database %{_datadir}/mime &>/dev/null || :
# Web service
-/sbin/chkconfig --add vboxweb-service >/dev/null 2>&1 || :
+# Run these because the SysV package being removed won't do them
+/sbin/chkconfig --del vboxweb-service >/dev/null 2>&1 || :
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
# Assign USB devices
if /sbin/udevadm control --reload-rules >/dev/null 2>&1
@@ -406,21 +417,44 @@
%preun
-[ $1 = 0 ] && /sbin/chkconfig --del vboxweb-service >/dev/null 2>&1 || :
+if [ $1 -eq 0 ] ; then
+ # Package removal, not upgrade
+ /bin/systemctl --no-reload disable vboxweb.service > /dev/null 2>&1 || :
+ /bin/systemctl stop vboxweb.service > /dev/null 2>&1 || :
+fi
%postun
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
+
/usr/bin/update-desktop-database &>/dev/null || :
/usr/bin/update-mime-database %{_datadir}/mime &>/dev/null || :
-
%posttrans
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
# Guest additions install the OGL libraries
-%post guest -p /sbin/ldconfig
-%postun guest -p /sbin/ldconfig
+%post guest
+/sbin/ldconfig
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
+/bin/systemctl enable vboxservice.service >/dev/null 2>&1 || :
+/bin/systemctl start vboxservice.service >/dev/null 2>&1 || :
+
+%preun guest
+if [ $1 -eq 0 ] ; then
+ # Package removal, not upgrade
+ /bin/systemctl --no-reload disable vboxservice.service > /dev/null 2>&1 || :
+ /bin/systemctl stop vboxservice.service > /dev/null 2>&1 || :
+fi
+
+%postun guest
+/sbin/ldconfig
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
+if [ $1 -ge 1 ] ; then
+ # Package upgrade, not uninstall
+ /bin/systemctl try-restart vboxservice.service >/dev/null 2>&1 || :
+fi
%files
@@ -470,7 +504,7 @@
%config %{_sysconfdir}/udev/rules.d/90-vboxdrv.rules
%config %{_sysconfdir}/sysconfig/modules/%{name}.modules
%doc COPYING
-%attr(755,root,root) %{_initrddir}/vboxweb-service
+%attr(755,root,root) %{systemd_dir}/vboxweb.service
%files devel
@@ -501,6 +535,7 @@
%config %{_sysconfdir}/udev/rules.d/60-vboxguest.rules
%config %{_sysconfdir}/sysconfig/modules/%{name}-guest.modules
%doc COPYING
+%attr(755,root,root) %{systemd_dir}/vboxservice.service
%files kmodsrc
@@ -509,6 +544,10 @@
%changelog
+* Sun Apr 29 2012 Sérgio Basto <sergio(a)serjux.com> - 4.1.14-2
+- Migrating vboxweb-service to a systemd unit file from a SysV initscript
+- Add vboxservice.service systemd unit file in guest package, rfbz #2274.
+
* Thu Apr 26 2012 Sérgio Basto <sergio(a)serjux.com> - 4.1.14-1
- new release
- mesa patch only for F17 or higher
--- vboxweb-service DELETED ---
12 years, 7 months
rpms/VirtualBox-OSE/devel VirtualBox-OSE.spec,1.92,1.93
by Sérgio M. Basto
Author: sergiomb
Update of /cvs/free/rpms/VirtualBox-OSE/devel
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv19108
Modified Files:
VirtualBox-OSE.spec
Log Message:
minor improvement of scriptlet and text.
Index: VirtualBox-OSE.spec
===================================================================
RCS file: /cvs/free/rpms/VirtualBox-OSE/devel/VirtualBox-OSE.spec,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -r1.92 -r1.93
--- VirtualBox-OSE.spec 29 Apr 2012 16:11:11 -0000 1.92
+++ VirtualBox-OSE.spec 29 Apr 2012 16:26:12 -0000 1.93
@@ -1,6 +1,7 @@
%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
%global systemd_dir /lib/systemd/system
+
# Standard compiler flags, without:
# -Wall -- VirtualBox-OSE takes care of reasonable warnings very well
# -m32, -m64 -- 32bit code is built besides 64bit on x86_64
@@ -146,7 +147,7 @@
%description guest
-This is the same as Guest Additions, therefore should only be installed on a guest system.
+This is the same that Guest Additions, therefore should only be installed on a guest system.
Tools that utilize kernel modules for supporting integration
with the Host, including file sharing and tracking of mouse pointer
movement and X.org X11 video and mouse driver.
12 years, 7 months
rpms/VirtualBox-OSE/devel vboxservice.service, NONE, 1.1 vboxweb.service, NONE, 1.1 VirtualBox-OSE.spec, 1.91, 1.92 vboxweb-service, 1.1, NONE
by Sérgio M. Basto
Author: sergiomb
Update of /cvs/free/rpms/VirtualBox-OSE/devel
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv18636
Modified Files:
VirtualBox-OSE.spec
Added Files:
vboxservice.service vboxweb.service
Removed Files:
vboxweb-service
Log Message:
* Sun Apr 29 2012 Sérgio Basto <sergio(a)serjux.com> - 4.1.14-2
- Migrating vboxweb-service to a systemd unit file from a SysV initscript
- Add vboxservice.service systemd unit file in guest package, rfbz #2274.
--- NEW FILE vboxservice.service ---
[Unit]
Description=VirtualBox guest services
ConditionVirtualization=oracle
[Service]
ExecStart=/usr/bin/VBoxService -f
[Install]
WantedBy=multi-user.target
--- NEW FILE vboxweb.service ---
[Unit]
Description=VirtualBox OSE Web Service
After=network.target
[Service]
Type=forking
PIDFile=/run/vboxweb.pid
ExecStart=/usr/bin/vboxwebsrv --pidfile /run/vboxweb.pid --background
[Install]
WantedBy=multi-user.target
Index: VirtualBox-OSE.spec
===================================================================
RCS file: /cvs/free/rpms/VirtualBox-OSE/devel/VirtualBox-OSE.spec,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -r1.91 -r1.92
--- VirtualBox-OSE.spec 26 Apr 2012 22:17:11 -0000 1.91
+++ VirtualBox-OSE.spec 29 Apr 2012 16:11:11 -0000 1.92
@@ -1,5 +1,6 @@
%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+%global systemd_dir /lib/systemd/system
# Standard compiler flags, without:
# -Wall -- VirtualBox-OSE takes care of reasonable warnings very well
# -m32, -m64 -- 32bit code is built besides 64bit on x86_64
@@ -15,7 +16,7 @@
Name: VirtualBox-OSE
Version: 4.1.14
-Release: 1%{?prerel:.%{prerel}}%{?dist}
+Release: 2%{?prerel:.%{prerel}}%{?dist}
Summary: A general-purpose full virtualizer for PC hardware
Group: Development/Tools
@@ -28,7 +29,8 @@
Source7: VirtualBox-OSE-guest.modules
Source8: VirtualBox-OSE-vboxresize.desktop
Source9: VirtualBox-OSE-00-vboxvideo.conf
-Source10: vboxweb-service
+Source10: vboxweb.service
+Source11: vboxservice.service
Patch1: VirtualBox-OSE-4.1.4-noupdate.patch
Patch2: VirtualBox-OSE-4.1.6-strings.patch
Patch3: VirtualBox-OSE-4.1.2-libcxx.patch
@@ -92,6 +94,8 @@
%endif
Requires(post): systemd-units
+Requires(preun): systemd-units
+Requires(postun): systemd-units
Requires: %{name}-kmod = %{version}%{?prereltag}
Provides: %{name}-kmod-common = %{version}%{?prereltag}
@@ -142,6 +146,7 @@
%description guest
+This is the same as Guest Additions, therefore should only be installed on a guest system.
Tools that utilize kernel modules for supporting integration
with the Host, including file sharing and tracking of mouse pointer
movement and X.org X11 video and mouse driver.
@@ -337,7 +342,10 @@
$RPM_BUILD_ROOT%{_sysconfdir}/X11/xorg.conf.d/00-vboxvideo.conf
install -m 0755 -D %{SOURCE10} \
- $RPM_BUILD_ROOT%{_initrddir}/vboxweb-service
+ $RPM_BUILD_ROOT%{systemd_dir}/vboxweb.service
+
+install -m 0755 -D %{SOURCE11} \
+ $RPM_BUILD_ROOT%{systemd_dir}/vboxservice.service
install -m 0755 -D src/VBox/Additions/x11/Installer/98vboxadd-xclient \
$RPM_BUILD_ROOT%{_sysconfdir}/X11/xinit/xinitrc.d/98vboxadd-xclient.sh
@@ -393,7 +401,9 @@
/usr/bin/update-mime-database %{_datadir}/mime &>/dev/null || :
# Web service
-/sbin/chkconfig --add vboxweb-service >/dev/null 2>&1 || :
+# Run these because the SysV package being removed won't do them
+/sbin/chkconfig --del vboxweb-service >/dev/null 2>&1 || :
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
# Assign USB devices
if /sbin/udevadm control --reload-rules >/dev/null 2>&1
@@ -406,21 +416,44 @@
%preun
-[ $1 = 0 ] && /sbin/chkconfig --del vboxweb-service >/dev/null 2>&1 || :
+if [ $1 -eq 0 ] ; then
+ # Package removal, not upgrade
+ /bin/systemctl --no-reload disable vboxweb.service > /dev/null 2>&1 || :
+ /bin/systemctl stop vboxweb.service > /dev/null 2>&1 || :
+fi
%postun
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
+
/usr/bin/update-desktop-database &>/dev/null || :
/usr/bin/update-mime-database %{_datadir}/mime &>/dev/null || :
-
%posttrans
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
# Guest additions install the OGL libraries
-%post guest -p /sbin/ldconfig
-%postun guest -p /sbin/ldconfig
+%post guest
+/sbin/ldconfig
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
+/bin/systemctl enable vboxservice.service >/dev/null 2>&1 || :
+/bin/systemctl start vboxservice.service >/dev/null 2>&1 || :
+
+%preun guest
+if [ $1 -eq 0 ] ; then
+ # Package removal, not upgrade
+ /bin/systemctl --no-reload disable vboxservice.service > /dev/null 2>&1 || :
+ /bin/systemctl stop vboxservice.service > /dev/null 2>&1 || :
+fi
+
+%postun guest
+/sbin/ldconfig
+/bin/systemctl daemon-reload >/dev/null 2>&1 || :
+if [ $1 -ge 1 ] ; then
+ # Package upgrade, not uninstall
+ /bin/systemctl try-restart vboxservice.service >/dev/null 2>&1 || :
+fi
%files
@@ -470,7 +503,7 @@
%config %{_sysconfdir}/udev/rules.d/90-vboxdrv.rules
%config %{_sysconfdir}/sysconfig/modules/%{name}.modules
%doc COPYING
-%attr(755,root,root) %{_initrddir}/vboxweb-service
+%attr(755,root,root) %{systemd_dir}/vboxweb.service
%files devel
@@ -501,6 +534,7 @@
%config %{_sysconfdir}/udev/rules.d/60-vboxguest.rules
%config %{_sysconfdir}/sysconfig/modules/%{name}-guest.modules
%doc COPYING
+%attr(755,root,root) %{systemd_dir}/vboxservice.service
%files kmodsrc
@@ -509,6 +543,10 @@
%changelog
+* Sun Apr 29 2012 Sérgio Basto <sergio(a)serjux.com> - 4.1.14-2
+- Migrating vboxweb-service to a systemd unit file from a SysV initscript
+- Add vboxservice.service systemd unit file in guest package, rfbz #2274.
+
* Thu Apr 26 2012 Sérgio Basto <sergio(a)serjux.com> - 4.1.14-1
- new release
- mesa patch only for F17 or higher
--- vboxweb-service DELETED ---
12 years, 7 months
rpms/mythtv/devel mythtv.spec,1.94,1.95
by Richard Shaw
Author: hobbes1069
Update of /cvs/free/rpms/mythtv/devel
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv12413
Modified Files:
mythtv.spec
Log Message:
* Sun Apr 29 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-5
- Update to latest 0.25/fixes.
- Really fix logrotate this time.
- Add pmount to mytharchive requirements.
Index: mythtv.spec
===================================================================
RCS file: /cvs/free/rpms/mythtv/devel/mythtv.spec,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -r1.94 -r1.95
--- mythtv.spec 28 Apr 2012 20:33:29 -0000 1.94
+++ mythtv.spec 29 Apr 2012 12:27:13 -0000 1.95
@@ -86,7 +86,7 @@
Release: 0.1.git.%{_gitrev}%{?dist}
#Release: 0.1.rc1%{?dist}
%else
-Release: 4%{?dist}
+Release: 5%{?dist}
%endif
# The primary license is GPLv2+, but bits are borrowed from a number of
@@ -683,6 +683,7 @@
Requires: python-imaging
Requires: transcode >= 1.0.2
Requires: m2vrequantiser
+Requires: pmount
%description -n mytharchive
MythArchive is a new plugin for MythTV that lets you create DVDs from
@@ -1480,9 +1481,10 @@
################################################################################
%changelog
-* Sat Apr 28 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-3
+* Sun Apr 29 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-5
- Update to latest 0.25/fixes.
- Really fix logrotate this time.
+- Add pmount to mytharchive requirements.
* Sat Apr 21 2012 Richard Shaw <hobbes1069(a)gmail.com> - 0.25-3
- Removed obsolete build requirement for arts-devel.
12 years, 7 months