rpms/dhewm3/devel dhewm3-README.txt, NONE, 1.1 dhewm3-carmack.patch, NONE, 1.1 dhewm3-def-eax-on.patch, NONE, 1.1 dhewm3-def-fixedtic.patch, NONE, 1.1 dhewm3-no-cdkey.patch, NONE, 1.1 dhewm3.spec, NONE, 1.1 .cvsignore, 1.1, 1.2 sources, 1.1, 1.2
by Simone Caronni
Author: slaanesh
Update of /cvs/free/rpms/dhewm3/devel
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv9942
Modified Files:
.cvsignore sources
Added Files:
dhewm3-README.txt dhewm3-carmack.patch dhewm3-def-eax-on.patch
dhewm3-def-fixedtic.patch dhewm3-no-cdkey.patch dhewm3.spec
Log Message:
* Mon Dec 02 2013 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-21.git6d8108c
- Review fixes.
--- NEW FILE dhewm3-README.txt ---
____ ____ ____ _____ ____ _____ ____
| _ \| __ )| _ \ ___ ___ _ __ ___ |___ /| __ )| ___/ ___|
| |_) | _ \| | | |/ _ \ / _ \| '_ ` _ \ |_ \| _ \| |_ | | _
| _ <| |_) | |_| | (_) | (_) | | | | | |___) | |_) | _|| |_| |
|_| \_\____/|____/ \___/ \___/|_| |_| |_|____/|____/|_| \____|
** Doom 3 BFG Edition GPL source modification
For the additional features and fixes introduced by this great modification,
please see the original page at:
https://github.com/RobertBeckebans/RBDOOM-3-BFG
======== Game data
It DOES NOT include game data required to run the game, you have to get the data
yourself buying the game.
To launch the engine pointing at your data files you can use the following
command:
doom3bfg-engine +set fs_basepath "/path/to/game/content" "$@"
A sample nosrc rpm that can be used to build a binary rpm using the DVD data
files is at: http://slaanesh.fedorapeople.org/
To rebuild it, add the required files to your SOURCES directory and remove the
"NoSource" lines in the spec file.
A high resolution icon has been generated from the game assets, to have a look
at how the resulting menu entries look like see:
http://slaanesh.fedorapeople.org/doom3bfg-menus.png
You should end up with something like this:
$ rpm -qa dhewm3* doom3*
dhewm3-1.3.1.1304-19.gitfa231898.fc19.x86_64
doom3-1.3.1.1304-4.fc18.noarch
doom3-roe-1.3.1.1304-4.fc18.noarch
======== Options defined at compile time
- Uses unbundled Fedora libraries for the following components:
OpenAL
Curl
Ogg Vorbis
SDL
zlib
- Uses SDL2 on Fedora 19+ and RHEL/CentOS 7+.
- Provides a doom3bfg-engine symlink through the alternatives system to easily
switch between additional variations.
- Removes the bundled libraries and tools required for compiling Doom Classic
(not working in the current source code).
======== Notes
- The Doom Classic icons in the main menu do not work; they are not selectable.
This is by design.
- Bink Videos do not work, the code is patented and not present in the current
source code.
dhewm3-carmack.patch:
CMakeLists.txt | 4 ++++
renderer/draw_common.cpp | 12 ++++++++++++
2 files changed, 16 insertions(+)
--- NEW FILE dhewm3-carmack.patch ---
diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt
index 57d27d4..7ed0ab0 100644
--- a/neo/CMakeLists.txt
+++ b/neo/CMakeLists.txt
@@ -30,6 +30,7 @@ option(D3XP "Build the d3xp game code" ON)
option(DEDICATED "Build the dedicated server" OFF)
option(ONATIVE "Optimize for the host CPU" OFF)
option(SDL2 "Use SDL2 instead of SDL1.2" OFF)
+option(ZFAIL "Use Carmack's reverse" OFF)
if(NOT CMAKE_SYSTEM_PROCESSOR)
message(FATAL_ERROR "No target CPU architecture set")
@@ -738,6 +739,9 @@ if(CORE)
${src_sys_base}
${src_sys_core}
)
+ if(ZFAIL)
+ add_definitions( -DDEFY_PATENTS )
+ endif()
set_target_properties(dhewm3 PROPERTIES COMPILE_DEFINITIONS "__DOOM_DLL__")
set_target_properties(dhewm3 PROPERTIES LINK_FLAGS "${ldflags}")
diff --git a/neo/renderer/draw_common.cpp b/neo/renderer/draw_common.cpp
index 70bcc1d..ce48ea1 100644
--- a/neo/renderer/draw_common.cpp
+++ b/neo/renderer/draw_common.cpp
@@ -1140,6 +1140,7 @@ static void RB_T_Shadow( const drawSurf_t *surf ) {
return;
}
+#ifndef DEFY_PATENTS
// patent-free work around
if ( !external ) {
// "preload" the stencil buffer with the number of volumes
@@ -1151,6 +1152,17 @@ static void RB_T_Shadow( const drawSurf_t *surf ) {
GL_Cull( CT_BACK_SIDED );
RB_DrawShadowElementsWithCounters( tri, numIndexes );
}
+#else
+ // Z-fail, uses stuff described in US6384822 held by Creative Labs in the United States
+ if ( !external ) {
+ qglStencilOp( GL_KEEP, tr.stencilDecr, GL_KEEP );
+ GL_Cull( CT_FRONT_SIDED );
+ RB_DrawShadowElementsWithCounters( tri, numIndexes );
+ qglStencilOp( GL_KEEP, tr.stencilIncr, GL_KEEP );
+ GL_Cull( CT_BACK_SIDED );
+ RB_DrawShadowElementsWithCounters( tri, numIndexes );
+ }
+#endif
// traditional depth-pass stencil shadows
qglStencilOp( GL_KEEP, GL_KEEP, tr.stencilIncr );
dhewm3-def-eax-on.patch:
snd_system.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- NEW FILE dhewm3-def-eax-on.patch ---
diff -Naur dhewm3.old/neo/sound/snd_system.cpp dhewm3/neo/sound/snd_system.cpp
--- dhewm3.old/neo/sound/snd_system.cpp 2012-08-29 15:27:03.920780581 +0200
+++ dhewm3/neo/sound/snd_system.cpp 2012-08-29 15:26:41.279324291 +0200
@@ -70,7 +70,7 @@
idCVar idSoundSystemLocal::s_skipHelltimeFX( "s_skipHelltimeFX", "0", CVAR_SOUND | CVAR_BOOL, "" );
#if !defined(ID_DEDICATED)
-idCVar idSoundSystemLocal::s_useEAXReverb( "s_useEAXReverb", "0", CVAR_SOUND | CVAR_BOOL | CVAR_ARCHIVE, "use EFX reverb" );
+idCVar idSoundSystemLocal::s_useEAXReverb( "s_useEAXReverb", "1", CVAR_SOUND | CVAR_BOOL | CVAR_ARCHIVE, "use EFX reverb" );
idCVar idSoundSystemLocal::s_decompressionLimit( "s_decompressionLimit", "6", CVAR_SOUND | CVAR_INTEGER | CVAR_ARCHIVE, "specifies maximum uncompressed sample length in seconds" );
#else
idCVar idSoundSystemLocal::s_useEAXReverb( "s_useEAXReverb", "0", CVAR_SOUND | CVAR_BOOL | CVAR_ROM, "EFX not available in this build" );
dhewm3-def-fixedtic.patch:
Session.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- NEW FILE dhewm3-def-fixedtic.patch ---
--- dhewm3/neo/framework/Session.cpp 2013-01-03 11:33:59.589307803 +0100
+++ dhewm3.dg/neo/framework/Session.cpp 2013-01-04 01:05:22.303604034 +0100
@@ -40,7 +40,7 @@
idCVar idSessionLocal::com_showAngles( "com_showAngles", "0", CVAR_SYSTEM | CVAR_BOOL, "" );
idCVar idSessionLocal::com_minTics( "com_minTics", "1", CVAR_SYSTEM, "" );
idCVar idSessionLocal::com_showTics( "com_showTics", "0", CVAR_SYSTEM | CVAR_BOOL, "" );
-idCVar idSessionLocal::com_fixedTic( "com_fixedTic", "0", CVAR_SYSTEM | CVAR_INTEGER, "", 0, 10 );
+idCVar idSessionLocal::com_fixedTic( "com_fixedTic", "0", CVAR_SYSTEM | CVAR_INTEGER, "", -1, 10 );
idCVar idSessionLocal::com_showDemo( "com_showDemo", "0", CVAR_SYSTEM | CVAR_BOOL, "" );
idCVar idSessionLocal::com_skipGameDraw( "com_skipGameDraw", "0", CVAR_SYSTEM | CVAR_BOOL, "" );
idCVar idSessionLocal::com_aviDemoSamples( "com_aviDemoSamples", "16", CVAR_SYSTEM, "" );
dhewm3-no-cdkey.patch:
BuildDefines.h | 18
BuildDefines.h.rej | 17
Common.cpp | 5
Common.cpp.orig | 3109 +++++++++++++++++++++++++++++++++++
FileSystem.cpp | 6
FileSystem.cpp.orig | 3914 +++++++++++++++++++++++++++++++++++++++++++++
Licensee.h | 8
Session.cpp | 437 -----
Session.cpp.orig | 3304 +++++++++++++++++++++++++++++++++++++
Session.cpp.rej | 338 +++
Session.h | 28
Session_local.h | 28
Session_menu.cpp | 55
async/AsyncClient.cpp | 122 -
async/AsyncClient.cpp.orig | 2317 ++++++++++++++++++++++++++
async/AsyncClient.h | 4
16 files changed, 13000 insertions(+), 710 deletions(-)
--- NEW FILE dhewm3-no-cdkey.patch ---
diff -Naur dhewm3.old/neo/framework/async/AsyncClient.cpp dhewm3/neo/framework/async/AsyncClient.cpp
--- dhewm3.old/neo/framework/async/AsyncClient.cpp 2013-08-15 23:27:20.000000000 +0200
+++ dhewm3/neo/framework/async/AsyncClient.cpp 2013-08-22 13:23:32.995219604 +0200
@@ -1262,93 +1262,6 @@
/*
==================
-idAsyncClient::ProcessAuthKeyMessage
-==================
-*/
-void idAsyncClient::ProcessAuthKeyMessage( const netadr_t from, const idBitMsg &msg ) {
- authKeyMsg_t authMsg;
- char read_string[ MAX_STRING_CHARS ];
- const char *retkey;
- authBadKeyStatus_t authBadStatus;
- int key_index;
- bool valid[ 2 ];
- idStr auth_msg;
-
- if ( clientState != CS_CONNECTING && !session->WaitingForGameAuth() ) {
- common->Printf( "clientState != CS_CONNECTING, not waiting for game auth, authKey ignored\n" );
- return;
- }
-
- authMsg = (authKeyMsg_t)msg.ReadByte();
- if ( authMsg == AUTHKEY_BADKEY ) {
- valid[ 0 ] = valid[ 1 ] = true;
- key_index = 0;
- authBadStatus = (authBadKeyStatus_t)msg.ReadByte();
- switch ( authBadStatus ) {
- case AUTHKEY_BAD_INVALID:
- valid[ 0 ] = ( msg.ReadByte() == 1 );
- valid[ 1 ] = ( msg.ReadByte() == 1 );
- idAsyncNetwork::BuildInvalidKeyMsg( auth_msg, valid );
- break;
- case AUTHKEY_BAD_BANNED:
- key_index = msg.ReadByte();
- auth_msg = common->GetLanguageDict()->GetString( va( "#str_0719%1d", 6 + key_index ) );
- auth_msg += "\n";
- auth_msg += common->GetLanguageDict()->GetString( "#str_04304" );
- valid[ key_index ] = false;
- break;
- case AUTHKEY_BAD_INUSE:
- key_index = msg.ReadByte();
- auth_msg = common->GetLanguageDict()->GetString( va( "#str_0719%1d", 8 + key_index ) );
- auth_msg += "\n";
- auth_msg += common->GetLanguageDict()->GetString( "#str_04304" );
- valid[ key_index ] = false;
- break;
- case AUTHKEY_BAD_MSG:
- // a general message explaining why this key is denied
- // no specific use for this atm. let's not clear the keys either
- msg.ReadString( read_string, MAX_STRING_CHARS );
- auth_msg = read_string;
- break;
- }
- common->DPrintf( "auth deny: %s\n", auth_msg.c_str() );
-
- // keys to be cleared. applies to both net connect and game auth
- session->ClearCDKey( valid );
-
- // get rid of the bad key - at least that's gonna annoy people who stole a fake key
- if ( clientState == CS_CONNECTING ) {
- while ( 1 ) {
- // here we use the auth status message
- retkey = session->MessageBox( MSG_CDKEY, auth_msg, common->GetLanguageDict()->GetString( "#str_04325" ), true );
- if ( retkey ) {
- if ( session->CheckKey( retkey, true, valid ) ) {
- cmdSystem->BufferCommandText( CMD_EXEC_NOW, "reconnect" );
- } else {
- // build a more precise message about the offline check failure
- idAsyncNetwork::BuildInvalidKeyMsg( auth_msg, valid );
- session->MessageBox( MSG_OK, auth_msg.c_str(), common->GetLanguageDict()->GetString( "#str_04327" ), true );
- continue;
- }
- } else {
- cmdSystem->BufferCommandText( CMD_EXEC_NOW, "disconnect" );
- }
- break;
- }
- } else {
- // forward the auth status information to the session code
- session->CDKeysAuthReply( false, auth_msg );
- }
- } else {
- msg.ReadString( read_string, MAX_STRING_CHARS );
- cvarSystem->SetCVarString( "com_guid", read_string );
- common->Printf( "guid set to %s\n", read_string );
- session->CDKeysAuthReply( true, NULL );
- }
-}
-
-/*
-==================
idAsyncClient::ProcessVersionMessage
==================
*/
@@ -1526,11 +1439,6 @@
return;
}
- if ( idStr::Icmp( string, "authKey" ) == 0 ) {
- ProcessAuthKeyMessage( from, msg );
- return;
- }
-
if ( idStr::Icmp( string, "newVersion" ) == 0 ) {
ProcessVersionMessage( from, msg );
return;
@@ -1677,13 +1585,7 @@
msg.WriteNetadr( serverAddress );
// if we don't have a com_guid, this will request a direct reply from auth with it
msg.WriteByte( cvarSystem->GetCVarString( "com_guid" )[0] ? 1 : 0 );
- // send the main key, and flag an extra byte to add XP key
- msg.WriteString( session->GetCDKey( false ) );
- const char *xpkey = session->GetCDKey( true );
- msg.WriteByte( xpkey ? 1 : 0 );
- if ( xpkey ) {
- msg.WriteString( xpkey );
- }
+
clientPort.SendPacket( idAsyncNetwork::GetMasterAddress(), msg.GetData(), msg.GetSize() );
}
#else
@@ -2133,28 +2035,6 @@
}
/*
-===============
-idAsyncClient::SendAuthCheck
-===============
-*/
-bool idAsyncClient::SendAuthCheck( const char *cdkey, const char *xpkey ) {
- idBitMsg msg;
- byte msgBuf[MAX_MESSAGE_SIZE];
-
- msg.Init( msgBuf, sizeof( msgBuf ) );
- msg.WriteShort( CONNECTIONLESS_MESSAGE_ID );
- msg.WriteString( "gameAuth" );
- msg.WriteInt( ASYNC_PROTOCOL_VERSION );
- msg.WriteByte( cdkey ? 1 : 0 );
- msg.WriteString( cdkey ? cdkey : "" );
- msg.WriteByte( xpkey ? 1 : 0 );
- msg.WriteString( xpkey ? xpkey : "" );
- InitPort();
- clientPort.SendPacket( idAsyncNetwork::GetMasterAddress(), msg.GetData(), msg.GetSize() );
- return true;
-}
-
-/*
===============
idAsyncClient::CheckTimeout
===============
diff -Naur dhewm3.old/neo/framework/async/AsyncClient.cpp.orig dhewm3/neo/framework/async/AsyncClient.cpp.orig
--- dhewm3.old/neo/framework/async/AsyncClient.cpp.orig 1970-01-01 01:00:00.000000000 +0100
+++ dhewm3/neo/framework/async/AsyncClient.cpp.orig 2013-08-22 13:23:32.996219594 +0200
@@ -0,0 +1,2317 @@
+/*
+===========================================================================
+
+Doom 3 GPL Source Code
+Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
+
+This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
+
+Doom 3 Source Code is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Doom 3 Source Code is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
+
+In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
+
+If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
+
+===========================================================================
+*/
+
+#include "sys/platform.h"
+#include "idlib/LangDict.h"
+#include "framework/async/AsyncNetwork.h"
+#include "framework/Licensee.h"
+#include "framework/Game.h"
+#include "framework/Session_local.h"
+#include "sound/sound.h"
+
+#include "framework/async/AsyncClient.h"
+
+const int SETUP_CONNECTION_RESEND_TIME = 1000;
+const int EMPTY_RESEND_TIME = 500;
+const int PREDICTION_FAST_ADJUST = 4;
+
[...13567 lines suppressed...]
--- dhewm3.old/neo/framework/Session.h 2013-08-15 23:27:20.000000000 +0200
+++ dhewm3/neo/framework/Session.h 2013-08-22 13:23:33.003219524 +0200
@@ -60,7 +60,6 @@
MSG_OKCANCEL,
MSG_YESNO,
MSG_PROMPT,
- MSG_CDKEY,
MSG_INFO,
MSG_WAIT
} msgBoxType_t;
@@ -113,7 +112,6 @@
// fires up the optional GUI event, also returns them if you set wait to true
// if MSG_PROMPT and wait, returns the prompt string or NULL if aborted
- // if MSG_CDKEY and want, returns the cd key or NULL if aborted
// network tells wether one should still run the network loop in a wait dialog
virtual const char *MessageBox( msgBoxType_t type, const char *message, const char *title = NULL, bool wait = false, const char *fire_yes = NULL, const char *fire_no = NULL, bool network = false ) = 0;
virtual void StopBox( void ) = 0;
@@ -126,32 +124,6 @@
// doesn't advance and get things out of sync
virtual void TimeHitch( int msec ) = 0;
- // read and write the cd key data to files
- // doesn't perform any validity checks
- virtual void ReadCDKey( void ) = 0;
- virtual void WriteCDKey( void ) = 0;
-
- // returns NULL for if xp is true and xp key is not valid or not present
- virtual const char *GetCDKey( bool xp ) = 0;
-
- // check keys for validity when typed in by the user ( with checksum verification )
- // store the new set of keys if they are found valid
- virtual bool CheckKey( const char *key, bool netConnect, bool offline_valid[ 2 ] ) = 0;
-
- // verify the current set of keys for validity
- // strict -> keys in state CDKEY_CHECKING state are not ok
- virtual bool CDKeysAreValid( bool strict ) = 0;
- // wipe the key on file if the network check finds it invalid
- virtual void ClearCDKey( bool valid[ 2 ] ) = 0;
-
- // configure gui variables for mainmenu.gui and cd key state
- virtual void SetCDKeyGuiVars( void ) = 0;
-
- virtual bool WaitingForGameAuth( void ) = 0;
-
- // got reply from master about the keys. if !valid, auth_msg given
- virtual void CDKeysAuthReply( bool valid, const char *auth_msg ) = 0;
-
virtual const char *GetCurrentMapName( void ) = 0;
virtual int GetSaveGameVersion( void ) = 0;
diff -Naur dhewm3.old/neo/framework/Session_local.h dhewm3/neo/framework/Session_local.h
--- dhewm3.old/neo/framework/Session_local.h 2013-08-15 23:27:20.000000000 +0200
+++ dhewm3/neo/framework/Session_local.h 2013-08-22 13:23:33.004219515 +0200
@@ -124,16 +124,6 @@
virtual void TimeHitch( int msec );
- virtual void ReadCDKey( void );
- virtual void WriteCDKey( void );
- virtual const char *GetCDKey( bool xp );
- virtual bool CheckKey( const char *key, bool netConnect, bool offline_valid[ 2 ] );
- virtual bool CDKeysAreValid( bool strict );
- virtual void ClearCDKey( bool valid[ 2 ] );
- virtual void SetCDKeyGuiVars( void );
- virtual bool WaitingForGameAuth( void );
- virtual void CDKeysAuthReply( bool valid, const char *auth_msg );
-
virtual int GetSaveGameVersion( void );
virtual const char *GetCurrentMapName();
@@ -312,9 +302,6 @@
void ExecuteMapChange( bool noFadeWipe = false );
void UnloadMap();
- // return true if we actually waiting on an auth reply
- bool MaybeWaitOnCDKey( void );
-
//------------------
// Session_menu.cpp
@@ -347,21 +334,6 @@
bool BoxDialogSanityCheck( void );
void EmitGameAuth( void );
- typedef enum {
- CDKEY_UNKNOWN, // need to perform checks on the key
- CDKEY_INVALID, // that key is wrong
- CDKEY_OK, // valid
- CDKEY_CHECKING, // sent a check request ( gameAuth only )
- CDKEY_NA // does not apply, xp key when xp is not present
- } cdKeyState_t;
-
- static const int CDKEY_BUF_LEN = 17;
- static const int CDKEY_AUTH_TIMEOUT = 5000;
-
- char cdkey[ CDKEY_BUF_LEN ];
- cdKeyState_t cdkey_state;
- char xpkey[ CDKEY_BUF_LEN ];
- cdKeyState_t xpkey_state;
int authEmitTimeout;
bool authWaitBox;
diff -Naur dhewm3.old/neo/framework/Session_menu.cpp dhewm3/neo/framework/Session_menu.cpp
--- dhewm3.old/neo/framework/Session_menu.cpp 2013-08-15 23:27:20.000000000 +0200
+++ dhewm3/neo/framework/Session_menu.cpp 2013-08-22 13:23:33.004219515 +0200
@@ -313,7 +313,6 @@
guiMainMenu->SetStateString( "inGame", "0" );
}
- SetCDKeyGuiVars( );
guiMainMenu->SetStateString( "nightmare", cvarSystem->GetCVarBool( "g_nightmare" ) ? "1" : "0" );
guiMainMenu->SetStateString( "browser_levelshot", "guis/assets/splash/pdtempa" );
@@ -1255,7 +1254,6 @@
}
guiMsg->SetStateString( "visible_entry", "0" );
- guiMsg->SetStateString( "visible_cdkey", "0" );
switch ( type ) {
case MSG_INFO:
guiMsg->SetStateString( "mid", "" );
@@ -1298,32 +1296,6 @@
guiMsg->SetStateString( "visible_entry", "1" );
guiMsg->HandleNamedEvent( "Prompt" );
break;
- case MSG_CDKEY:
- guiMsg->SetStateString( "left", common->GetLanguageDict()->GetString( "#str_04339" ) );
- guiMsg->SetStateString( "right", common->GetLanguageDict()->GetString( "#str_04340" ) );
- guiMsg->SetStateString( "visible_msgbox", "0" );
- guiMsg->SetStateString( "visible_cdkey", "1" );
- guiMsg->SetStateString( "visible_hasxp", fileSystem->HasD3XP() ? "1" : "0" );
- // the current cdkey / xpkey values may have bad/random data in them
- // it's best to avoid printing them completely, unless the key is good
- if ( cdkey_state == CDKEY_OK ) {
- guiMsg->SetStateString( "str_cdkey", cdkey );
- guiMsg->SetStateString( "visible_cdchk", "0" );
- } else {
- guiMsg->SetStateString( "str_cdkey", "" );
- guiMsg->SetStateString( "visible_cdchk", "1" );
- }
- guiMsg->SetStateString( "str_cdchk", "" );
- if ( xpkey_state == CDKEY_OK ) {
- guiMsg->SetStateString( "str_xpkey", xpkey );
- guiMsg->SetStateString( "visible_xpchk", "0" );
- } else {
- guiMsg->SetStateString( "str_xpkey", "" );
- guiMsg->SetStateString( "visible_xpchk", "1" );
- }
- guiMsg->SetStateString( "str_xpchk", "" );
- guiMsg->HandleNamedEvent( "CDKey" );
- break;
case MSG_WAIT:
break;
default:
@@ -1357,20 +1329,6 @@
} else {
return NULL;
}
- } else if ( type == MSG_CDKEY ) {
- if ( msgRetIndex == 0 ) {
- // the visible_ values distinguish looking at a valid key, or editing it
- sprintf( msgFireBack[ 0 ], "%1s;%16s;%2s;%1s;%16s;%2s",
- guiMsg->State().GetString( "visible_cdchk" ),
- guiMsg->State().GetString( "str_cdkey" ),
- guiMsg->State().GetString( "str_cdchk" ),
- guiMsg->State().GetString( "visible_xpchk" ),
- guiMsg->State().GetString( "str_xpkey" ),
- guiMsg->State().GetString( "str_xpchk" ) );
- return msgFireBack[ 0 ].c_str();
- } else {
- return NULL;
- }
} else {
return msgFireBack[ msgRetIndex ].c_str();
}
@@ -1397,7 +1355,6 @@
guiMsg->SetStateString( "visible_waitbox", "0" );
guiMsg->SetStateString( "visible_entry", "0" );
- guiMsg->SetStateString( "visible_cdkey", "0" );
guiMsg->SetStateString( "mid", "Cancel" );
guiMsg->SetStateString( "visible_mid", "1" );
@@ -1625,15 +1582,3 @@
}
}
-/*
-===============
-idSessionLocal::SetCDKeyGuiVars
-===============
-*/
-void idSessionLocal::SetCDKeyGuiVars( void ) {
- if ( !guiMainMenu ) {
- return;
- }
- guiMainMenu->SetStateString( "str_d3key_state", common->GetLanguageDict()->GetString( va( "#str_071%d", 86 + cdkey_state ) ) );
- guiMainMenu->SetStateString( "str_xpkey_state", common->GetLanguageDict()->GetString( va( "#str_071%d", 86 + xpkey_state ) ) );
-}
--- NEW FILE dhewm3.spec ---
%global commit 6d8108c508a0bde5c2bea4dec58fa2ca583a16e2
%global shortcommit %(c=%{commit}; echo ${c:0:7})
Name: dhewm3
Version: 1.3.1.1304
Release: 21.git%{shortcommit}%{?dist}
Summary: Dhewm's Doom 3 engine
License: GPLv3+ and BSD
URL: https://github.com/dhewm/%{name}
Source0: https://github.com/dhewm/dhewm3/archive/%{commit}/%{name}-%{version}-%{sh...
Source1: %{name}-README.txt
# Compatibility with stock Doom 3 has been removed long ago and we don't ship
# Doom 3 / Doom 3 Resurrection of Evil content.
Patch0: %{name}-no-cdkey.patch
Patch1: %{name}-def-eax-on.patch
Patch2: %{name}-def-fixedtic.patch
Patch3: %{name}-carmack.patch
# Generic provider for Doom 3 engine based games
Provides: doom3-engine = 1.3.1.1304
Provides: bundled(minizip-idsoftware) = 1.2.7
BuildRequires: cmake
BuildRequires: libcurl-devel
BuildRequires: libjpeg-turbo-devel
BuildRequires: libogg-devel
BuildRequires: libvorbis-devel
BuildRequires: openal-soft-devel
%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
BuildRequires: SDL2-devel
%else
BuildRequires: SDL-devel
%endif
BuildRequires: speex-devel
BuildRequires: zlib-devel
%description
%{name} 3 is a Doom 3 GPL source modification. The goal of %{name} 3 is bring
DOOM 3 with the help of SDL to all suitable platforms. Bugs present in the
original DOOM 3 will be fixed (when identified) without altering the original
game-play.
%prep
%setup -qn %{name}-%{commit}
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
cp %{SOURCE1} ./README.txt
iconv -f iso8859-1 -t utf-8 COPYING.txt > COPYING.txt.conv && mv -f COPYING.txt.conv COPYING.txt
%build
# Passing a fake build name avoids default CMAKE_BUILD_TYPE="RelWithDebInfo"
# which has hard coded GCC optimizations.
%cmake \
-DCMAKE_BUILD_TYPE=Fedora \
-DDEDICATED=ON \
-DZFAIL=1 \
%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
-DSDL2=ON \
%endif
neo
make %{?_smp_mflags}
%post
/usr/sbin/alternatives --install %{_bindir}/doom3-engine doom3-engine %{_bindir}/%{name} 10
%preun
if [ "$1" = 0 ]; then
/usr/sbin/alternatives --remove doom3-engine %{_bindir}/%{name}
fi
%install
make install DESTDIR=%{buildroot}
%files
%doc README.md COPYING.txt README.txt
%{_bindir}/%{name}
%{_bindir}/%{name}ded
%{_libdir}/%{name}
%changelog
* Mon Dec 02 2013 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-21.git6d8108c
- Review fixes.
* Fri Nov 15 2013 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-20.git6d8108c5
- Updated.
- Added README.txt for game content.
* Thu Aug 22 2013 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-19.gitfa231898
- Updated.
- Remove unzip patch, upstreamed.
- Use SDL2 on Fedora 19+ and CentOS/RHEL 7+.
* Tue May 07 2013 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-18.git6407881c
- Updated.
* Sat Apr 13 2013 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-17.gitcedc129a
- Updated.
* Tue Jan 15 2013 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-16.git92a41322
- Updated.
* Fri Jan 04 2013 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-15.gitf8de7386
- Change fixedTic default.
- Added Z-fail compile time option.
- Update minizip code.
* Fri Dec 07 2012 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-13.git.f8de7386
- Updated.
- Removed display resolution autodetection, included upstream.
- Removed gl fix patch, included upstream.
- Updated no-cdkey patch.
* Tue Aug 28 2012 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-12.git.1b1787bb
- Auto detect resolution of monitor if single screen.
- Remove cd key check.
- Add EAX on by default.
* Thu Aug 09 2012 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-10.git.1b1787bb
- Updated, reverted "Don't use alpha bits for the GL config".
- Added dot in release tag for easier reading.
- Added alternatives system for doom3-engine.
* Mon Jul 23 2012 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-9.gitdf81835d
- Updated.
* Thu Jul 19 2012 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-8.git8aa0a4a9
- Updated, removed upstramed patch.
* Tue Jul 10 2012 Simone Caronni <negativo17(a)gmail.com> - 1.3.1.1304-7.gitf3ce725f
- First build.
Index: .cvsignore
===================================================================
RCS file: /cvs/free/rpms/dhewm3/devel/.cvsignore,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- .cvsignore 7 Jan 2014 16:57:36 -0000 1.1
+++ .cvsignore 9 Jan 2014 14:16:53 -0000 1.2
@@ -0,0 +1 @@
+dhewm3-1.3.1.1304-6d8108c.tar.gz
Index: sources
===================================================================
RCS file: /cvs/free/rpms/dhewm3/devel/sources,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sources 7 Jan 2014 16:57:37 -0000 1.1
+++ sources 9 Jan 2014 14:16:53 -0000 1.2
@@ -0,0 +1 @@
+2819e38f2b44e6eb476397756a1baf6e dhewm3-1.3.1.1304-6d8108c.tar.gz
10 years, 11 months
rpms/mame/F-19 .cvsignore, 1.74, 1.75 mame.spec, 1.87, 1.88 sources, 1.74, 1.75
by Julian Sikorski
Author: belegdol
Update of /cvs/nonfree/rpms/mame/F-19
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv24643
Modified Files:
.cvsignore mame.spec sources
Log Message:
* Wed Jan 01 2014 Julian Sikorski <belegdol(a)fedoraproject.org> - 0.152-1
- Updated to 0.152
Index: .cvsignore
===================================================================
RCS file: /cvs/nonfree/rpms/mame/F-19/.cvsignore,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- .cvsignore 10 Nov 2013 10:22:16 -0000 1.74
+++ .cvsignore 8 Jan 2014 18:38:03 -0000 1.75
@@ -1 +1 @@
-mame0151s.exe
+mame0152s.exe
Index: mame.spec
===================================================================
RCS file: /cvs/nonfree/rpms/mame/F-19/mame.spec,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -r1.87 -r1.88
--- mame.spec 10 Nov 2013 10:47:01 -0000 1.87
+++ mame.spec 8 Jan 2014 18:38:03 -0000 1.88
@@ -5,7 +5,7 @@
%bcond_with debug
%bcond_with simd
-%global baseversion 151
+%global baseversion 152
#global sourceupdate 1
#global svn 21418
@@ -393,6 +393,9 @@
%changelog
+* Wed Jan 01 2014 Julian Sikorski <belegdol(a)fedoraproject.org> - 0.152-1
+- Updated to 0.152
+
* Sun Nov 10 2013 Julian Sikorski <belegdol(a)fedoraproject.org> - 0.151-1
- Updated to 0.151
- Updated the verbosebuild patch
Index: sources
===================================================================
RCS file: /cvs/nonfree/rpms/mame/F-19/sources,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- sources 10 Nov 2013 10:22:17 -0000 1.74
+++ sources 8 Jan 2014 18:38:03 -0000 1.75
@@ -1 +1 @@
-adccb17eb36dac39682819ec945e0393 mame0151s.exe
+24e8e4faa62c88130f371f25878393c3 mame0152s.exe
10 years, 11 months
rpms/mame/devel .cvsignore, 1.78, 1.79 mame.spec, 1.92, 1.93 sources, 1.78, 1.79
by Julian Sikorski
Author: belegdol
Update of /cvs/nonfree/rpms/mame/devel
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv24586
Modified Files:
.cvsignore mame.spec sources
Log Message:
* Wed Jan 01 2014 Julian Sikorski <belegdol(a)fedoraproject.org> - 0.152-1
- Updated to 0.152
Index: .cvsignore
===================================================================
RCS file: /cvs/nonfree/rpms/mame/devel/.cvsignore,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -r1.78 -r1.79
--- .cvsignore 10 Nov 2013 10:22:14 -0000 1.78
+++ .cvsignore 8 Jan 2014 18:38:00 -0000 1.79
@@ -1 +1 @@
-mame0151s.exe
+mame0152s.exe
Index: mame.spec
===================================================================
RCS file: /cvs/nonfree/rpms/mame/devel/mame.spec,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -r1.92 -r1.93
--- mame.spec 10 Nov 2013 10:47:01 -0000 1.92
+++ mame.spec 8 Jan 2014 18:38:00 -0000 1.93
@@ -5,7 +5,7 @@
%bcond_with debug
%bcond_with simd
-%global baseversion 151
+%global baseversion 152
#global sourceupdate 1
#global svn 21418
@@ -393,6 +393,9 @@
%changelog
+* Wed Jan 01 2014 Julian Sikorski <belegdol(a)fedoraproject.org> - 0.152-1
+- Updated to 0.152
+
* Sun Nov 10 2013 Julian Sikorski <belegdol(a)fedoraproject.org> - 0.151-1
- Updated to 0.151
- Updated the verbosebuild patch
Index: sources
===================================================================
RCS file: /cvs/nonfree/rpms/mame/devel/sources,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -r1.78 -r1.79
--- sources 10 Nov 2013 10:22:14 -0000 1.78
+++ sources 8 Jan 2014 18:38:00 -0000 1.79
@@ -1 +1 @@
-adccb17eb36dac39682819ec945e0393 mame0151s.exe
+24e8e4faa62c88130f371f25878393c3 mame0152s.exe
10 years, 11 months
rpms/mythtv/F-18 mythtv.spec,1.115,1.116
by Richard Shaw
Author: hobbes1069
Update of /cvs/free/rpms/mythtv/F-18
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv23285
Modified Files:
mythtv.spec
Log Message:
Remove libcdio-paranoia, not a separate package in f18.
Index: mythtv.spec
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-18/mythtv.spec,v
retrieving revision 1.115
retrieving revision 1.116
diff -u -r1.115 -r1.116
--- mythtv.spec 7 Jan 2014 20:05:46 -0000 1.115
+++ mythtv.spec 7 Jan 2014 20:52:02 -0000 1.116
@@ -223,7 +223,7 @@
BuildRequires: libdca-devel
BuildRequires: libdvdnav-devel
BuildRequires: libdvdread-devel >= 0.9.4
-BuildRequires: libcdio-devel libcdio-paranoia-devel
+BuildRequires: libcdio-devel
# nb: libdvdcss will be dynamically loaded if installed
#BuildRequires: libfame-devel >= 0.9.0
BuildRequires: libogg-devel
10 years, 11 months
rpms/mythtv/F-18 ChangeLog, 1.11, 1.12 mythbackend.service, 1.8, 1.9 mythtv-0.27-fixes.patch, 1.2, 1.3 mythtv.spec, 1.114, 1.115
by Richard Shaw
Author: hobbes1069
Update of /cvs/free/rpms/mythtv/F-18
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv16023
Modified Files:
ChangeLog mythbackend.service mythtv-0.27-fixes.patch
mythtv.spec
Log Message:
* Mon Jan 6 2014 Richard Shaw <hobbes1069(a)gmail.com> - 0.27-4
- Update to latest fixes v0.27-130-gfac84fa.
- Add libcdio-paranoia to build requirements for CD audio.
Index: ChangeLog
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-18/ChangeLog,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ChangeLog 2 Dec 2013 19:15:54 -0000 1.11
+++ ChangeLog 7 Jan 2014 20:05:45 -0000 1.12
@@ -1,3 +1,191 @@
+commit fac84fab9c8c6e43f51d3090e13e05e68db0ef6e
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Sat Jan 4 10:12:23 2014 +0000
+
+ MythMusic: avoid storing a pointer to the current playlist in the music player
+
+ Always get the current playlist from MusicData to avoid possibly referencing a
+ stale pointer. This can occur while doing a rescan.
+
+ Also add NULL checks everywhere just in case.
+
+ Refs #11906.
+
+ (cherry picked from commit 193dc636e5fa5ac5edd3589094a58e79a6ab779b)
+
+commit bd74a288f3a9fc8911c9507b27f8fe540bde54f4
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Fri Jan 3 18:11:45 2014 +0000
+
+ MythMusic: make sure we null check the returned tagger after 47217ca10a
+
+ Also make sure the tagger is deleted after use.
+
+ (cherry picked from commit b383c329417a4e4b0b786e51e0d24962728a738b)
+
+commit 70cc07f2d99dd4a2439e249a799c45ec54510991
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Fri Jan 3 18:21:07 2014 +0000
+
+ Bump the ABI version after f359a4ebd3c
+
+commit f359a4ebd3c8a8fff18cdf21813c9d12da8c6c4e
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Fri Jan 3 17:38:39 2014 +0000
+
+ MetaIO: validate the files extension before creating a tagger
+
+ This checks the file extension is one we know how to handle before
+ creating the tagger. Return NULL if not valid.
+
+ This fixes a bug with the music file scanner trying to add files with an
+ unknown file extension.
+
+ NOTE: bumps the ABI version so compile and install myth core before compiling
+ the plugins
+
+ (cherry picked from commit 47217ca10adae1e03a37b396d64b605c8f18e6b0)
+
+commit f984e29cc92a9bc88f2d2e4b72a6f822380efa64
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Fri Jan 3 15:56:47 2014 +0000
+
+ MetaIOAVFComment: don't call av_estimate_timings() in getTrackLength()
+
+ It's not needed with current ffmpeg and was causing a segfault while scanning
+ for music files.
+
+ (cherry picked from commit c2128934644892df613590dda7e6017b72c14f94)
+
+commit 7f548de029ed84870538c87193b8b9f650cf0c5a
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Mon Dec 30 11:28:50 2013 +0000
+
+ MythMusic: fix playback of some radio stations
+
+ Make sure the maximum size of the QTCPSocket read buffer is set appropriately.
+
+ This seems to throttle the sending of readyRead() signals sent to us from
+ QTCPSocket better otherwise once we fill our buffer and don't read anything in the
+ readyRead() slot the QTCPSocket will eventually not send any more signals causing
+ us to run out of data.
+
+ Fixes #11872.
+
+ (cherry picked from commit 6ddaba216d8f6a7e178d4acfe6930458fb532d05)
+
+commit d96506156c2b200d3c6658e578d7b7fbd4014bad
+Author: Jim Stichnoth <jstichnoth(a)mythtv.org>
+Date: Sat Dec 21 21:59:46 2013 -0800
+
+ Update binary version after 525ac31dd2215e5ce46fc3b70f7ba883d99b736a.
+
+commit 525ac31dd2215e5ce46fc3b70f7ba883d99b736a
+Author: Jim Stichnoth <jstichnoth(a)mythtv.org>
+Date: Sat Dec 21 21:14:49 2013 -0800
+
+ Be less aggressive about clearing the bookmark on exit.
+
+ Refs #7994. We shouldn't automatically clear the bookmark at the end
+ of the recording if the "Clear bookmark on playback" setting is false.
+ (cherry picked from commit 670cb2d55c36f57ca056babccef1d99ae4c4bad0)
+
+ Conflicts:
+
+ mythtv/libs/libmythtv/tv_play.cpp
+
+commit 9d4b5e2313ea0b1eb7718264782f529bd88c555d
+Author: Karl Dietz <dekarl(a)mythtv.org>
+Date: Thu Aug 29 23:00:14 2013 +0200
+
+ extend IPTV hack to handle PAT with two entries but only one program
+
+ Fixes #11791
+
+ (cherry picked from commit 3bd3c71551a938eec2bb50feb48501136704392d)
+
+commit 39171be37ab8d63f0f44e5dbd5a78ca6893ceafa
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Sun Dec 15 21:47:04 2013 +0000
+
+ Icon Downloader: Check that the existing icon is actually a valid image.
+
+commit 65c0eb2c4ab660fcabb5b491dac8e88b6dd10d9e
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Sun Dec 15 20:54:57 2013 +0000
+
+ Metadata Lookup: We want to use the first (best) result, not the last.
+
+commit 5dc9d15856ab6cc7a1f39c191a2bd577a26e4fc8
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Sun Dec 15 13:53:44 2013 +0000
+
+ Fix display for progress dialog in Icon Importer
+ (cherry picked from commit 243420f6c1e043530fbe919ec85ae9f41af56323)
+
+commit 8f7c8aa6581e7afacd7e71a3566430e2119ce0b7
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Sun Dec 15 13:34:32 2013 +0000
+
+ Make the check for an existing icon more robust.
+ (cherry picked from commit 8b1d8159331e85569d78f5637df49366e5198f40)
+
+commit fa5599d185014db32dd9a34582d090cb5c7121c9
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Fri Dec 13 15:03:50 2013 +0000
+
+ Icon Downloader: Fix 'Re-scan for missing' to check the Channel Icon storage group
+ (cherry picked from commit 19f6b618045e9ac9bb7657e90f915e09dc63ba14)
+
+commit 866d1fe713116c7ff665157784b3ca7ae2c9d9b4
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Wed Dec 11 09:31:34 2013 +0000
+
+ Fix segfault in Schedule Editor. Not all recording rules are associated with a program and this pointer therefore needs to be checked first
+
+commit f7852552a089a87d7dd53b5da59958205fbae6fd
+Author: Richard Hulme <peper03(a)mythtv.org>
+Date: Thu Dec 5 00:06:42 2013 +0100
+
+ Fix python bindings to store updates to video markup data.
+ (cherry picked from commit 13ae25f5c86bd29a4e854cd5d438436f26d7345e)
+
+commit 26052f483996e28d87e77f5e879eded1e7c727a4
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Wed Dec 4 19:04:05 2013 +0000
+
+ Use category type as a hint in the Schedule Editor Metadata/Artwork searches
+
+commit 15199917e881861add0ab5a21862dd599da45c75
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Wed Dec 4 18:19:49 2013 +0000
+
+ Fix ordering of Artwork in selection dialogs. Best matches should now appear first, not last.
+ (cherry picked from commit d95a237d6cf7e79b4b5f807600fd635f37337e2f)
+
+commit ba15be9a30d6ce02c3bc6c8b330dbde8373f008a
+Author: Jim Stichnoth <jstichnoth(a)mythtv.org>
+Date: Sun Sep 15 06:25:13 2013 -0700
+
+ Reduce logging level for GetKeyframePositions and GetKeyframeDurations.
+ (cherry picked from commit 3c90e595d998e563c7a97a39f9541c157762755e)
+
+commit aea561a518cfa1b638341ab4f42db92fcd379b75
+Author: Richard Hulme <peper03(a)mythtv.org>
+Date: Mon Dec 2 22:29:20 2013 +0100
+
+ Prevent MythWelcome blocking input devices when calling mythshutdown to avoid resetting the idle timer (see [cac1413]) when trying to determine whether the backend is idle, thereby preventing shutdown.
+ (cherry picked from commit 1431eecd20c020b9c0ad826993015bc8957e82d6)
+
+commit 339d1ceb1733c0f36182260d0b1a691b0d05cbb3
+Author: Richard Hulme <peper03(a)mythtv.org>
+Date: Mon Dec 2 22:27:25 2013 +0100
+
+ Only jump back in a menu to the nearest previous block with subpictures if a seek operation is already in progress.
+
+ This should prevent infinite loops on some discs (e.g. Independence Day) where the menu highlight packets are somehow not processed before the navigation data indicates that buttons must be shown.
+ (cherry picked from commit e37383db1f55ad21f200903c18f9750753e05f00)
+
commit cb744f810c6133aa293ad95d65225890371951f0
Author: Raymond Wagner <rwagner(a)mythtv.org>
Date: Fri Nov 29 14:35:54 2013 -0500
Index: mythbackend.service
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-18/mythbackend.service,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- mythbackend.service 28 Aug 2012 18:14:44 -0000 1.8
+++ mythbackend.service 7 Jan 2014 20:05:46 -0000 1.9
@@ -30,7 +30,7 @@
[Unit]
Description=MythTV backend service
-After=network.target mysqld.service time-sync.target
+After=network.target mariadb.service mysqld.service time-sync.target
# Uncomment the following line if you will be using the mythweb plugin on the
# same system as mythbackend.
#Wants=httpd.service
@@ -59,7 +59,7 @@
ExecStart=/usr/bin/mythbackend --logpath /var/log/mythtv
# Whether systemd will continue over-watch and restart on any halt
-#Restart=Restart-always
+#Restart=always
[Install]
WantedBy=multi-user.target
mythtv-0.27-fixes.patch:
b/mythplugins/mytharchive/i18n/mytharchive_sv.qm |binary
b/mythplugins/mytharchive/i18n/mytharchive_sv.ts | 1197
b/mythplugins/mytharchive/mytharchive/archiveutil.cpp | 4
b/mythplugins/mytharchive/mytharchive/mythburn.cpp | 4
b/mythplugins/mytharchive/mythburn/scripts/mythburn.py | 19
b/mythplugins/mythbrowser/i18n/mythbrowser_sv.qm |binary
b/mythplugins/mythbrowser/i18n/mythbrowser_sv.ts | 126
b/mythplugins/mythgallery/i18n/mythgallery_sv.qm |binary
b/mythplugins/mythgallery/i18n/mythgallery_sv.ts | 965
b/mythplugins/mythgame/i18n/mythgame_sv.qm |binary
b/mythplugins/mythgame/i18n/mythgame_sv.ts | 136
b/mythplugins/mythmusic/i18n/mythmusic_sv.qm |binary
b/mythplugins/mythmusic/i18n/mythmusic_sv.ts | 1902
b/mythplugins/mythmusic/mythmusic/avfdecoder.cpp | 9
b/mythplugins/mythmusic/mythmusic/editmetadata.cpp | 34
b/mythplugins/mythmusic/mythmusic/importmusic.cpp | 4
b/mythplugins/mythmusic/mythmusic/musiccommon.cpp | 102
b/mythplugins/mythmusic/mythmusic/musicplayer.cpp | 94
b/mythplugins/mythmusic/mythmusic/musicplayer.h | 3
b/mythplugins/mythmusic/mythmusic/playlist.cpp | 2
b/mythplugins/mythmusic/mythmusic/playlisteditorview.cpp | 16
b/mythplugins/mythmusic/mythmusic/searchview.cpp | 15
b/mythplugins/mythmusic/mythmusic/shoutcast.cpp | 4
b/mythplugins/mythmusic/mythmusic/streamview.cpp | 7
b/mythplugins/mythnetvision/i18n/mythnetvision_sv.qm |binary
b/mythplugins/mythnetvision/i18n/mythnetvision_sv.ts | 279
b/mythplugins/mythnews/i18n/mythnews_sv.qm |binary
b/mythplugins/mythnews/i18n/mythnews_sv.ts | 76
b/mythplugins/mythweather/i18n/mythweather_sv.qm |binary
b/mythplugins/mythweather/i18n/mythweather_sv.ts | 62
b/mythplugins/mythzoneminder/i18n/mythzoneminder_sv.qm |binary
b/mythplugins/mythzoneminder/i18n/mythzoneminder_sv.ts | 183
b/mythplugins/mythzoneminder/mythzmserver/main.cpp | 13
b/mythplugins/mythzoneminder/mythzmserver/zmserver.cpp | 655
b/mythplugins/mythzoneminder/mythzmserver/zmserver.h | 101
b/mythplugins/mythzoneminder/mythzoneminder/zmclient.cpp | 25
b/mythplugins/mythzoneminder/mythzoneminder/zmconsole.cpp | 8
b/mythplugins/mythzoneminder/mythzoneminder/zmconsole.h | 2
b/mythplugins/mythzoneminder/mythzoneminder/zmdefines.h | 11
b/mythplugins/mythzoneminder/mythzoneminder/zmevents.cpp | 64
b/mythplugins/mythzoneminder/mythzoneminder/zmevents.h | 1
b/mythplugins/mythzoneminder/mythzoneminder/zmliveplayer.cpp | 64
b/mythplugins/mythzoneminder/mythzoneminder/zmplayer.cpp | 21
b/mythplugins/mythzoneminder/mythzoneminder/zmplayer.h | 3
b/mythplugins/mythzoneminder/theme/default-wide/zoneminder-ui.xml | 244
b/mythplugins/mythzoneminder/theme/default/zoneminder-ui.xml | 203
b/mythtv/bindings/python/MythTV/dataheap.py | 1
b/mythtv/bindings/python/MythTV/system.py | 11
b/mythtv/bindings/python/scripts/mythpython | 4
b/mythtv/bindings/python/setup.py | 6
b/mythtv/external/FFmpeg/libavcodec/mpeg12.c | 8
b/mythtv/external/FFmpeg/libavformat/mpeg.c | 10
b/mythtv/i18n/mythfrontend_sv.qm |binary
b/mythtv/i18n/mythfrontend_sv.ts |28897 +++++-----
b/mythtv/libs/libmyth/programinfo.cpp | 283
b/mythtv/libs/libmyth/programinfo.h | 17
b/mythtv/libs/libmyth/programtypes.h | 2
b/mythtv/libs/libmythbase/housekeeper.cpp | 19
b/mythtv/libs/libmythbase/housekeeper.h | 2
b/mythtv/libs/libmythbase/libmythbase.pro | 6
b/mythtv/libs/libmythbase/mythcommandlineparser.cpp | 3
b/mythtv/libs/libmythbase/mythcorecontext.cpp | 36
b/mythtv/libs/libmythbase/mythdownloadmanager.cpp | 1
b/mythtv/libs/libmythbase/mythsingledownload.cpp | 82
b/mythtv/libs/libmythbase/mythsingledownload.h | 44
b/mythtv/libs/libmythbase/mythsocket.cpp | 12
b/mythtv/libs/libmythbase/mythsystemlegacy.cpp | 8
b/mythtv/libs/libmythbase/mythversion.h | 2
b/mythtv/libs/libmythmetadata/metadatacommon.cpp | 23
b/mythtv/libs/libmythmetadata/metadatafactory.cpp | 6
b/mythtv/libs/libmythmetadata/metaio.cpp | 8
b/mythtv/libs/libmythmetadata/metaio.h | 2
b/mythtv/libs/libmythmetadata/metaioavfcomment.cpp | 2
b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp | 14
b/mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp | 3
b/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp | 5
b/mythtv/libs/libmythtv/cardutil.cpp | 22
b/mythtv/libs/libmythtv/cardutil.h | 8
b/mythtv/libs/libmythtv/libmythtv.pro | 14
b/mythtv/libs/libmythtv/mpeg/H264Parser.cpp | 2
b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp | 2
b/mythtv/libs/libmythtv/mythplayer.cpp | 19
b/mythtv/libs/libmythtv/mythplayer.h | 4
b/mythtv/libs/libmythtv/previewgenerator.cpp | 6
b/mythtv/libs/libmythtv/previewgeneratorqueue.cpp | 2
b/mythtv/libs/libmythtv/recorders/HLS/HLSPlaylistWorker.cpp | 125
b/mythtv/libs/libmythtv/recorders/HLS/HLSPlaylistWorker.h | 32
b/mythtv/libs/libmythtv/recorders/HLS/HLSReader.cpp | 1328
b/mythtv/libs/libmythtv/recorders/HLS/HLSReader.h | 148
b/mythtv/libs/libmythtv/recorders/HLS/HLSSegment.cpp | 64
b/mythtv/libs/libmythtv/recorders/HLS/HLSSegment.h | 53
b/mythtv/libs/libmythtv/recorders/HLS/HLSStream.cpp | 191
b/mythtv/libs/libmythtv/recorders/HLS/HLSStream.h | 98
b/mythtv/libs/libmythtv/recorders/HLS/HLSStreamWorker.cpp | 75
b/mythtv/libs/libmythtv/recorders/HLS/HLSStreamWorker.h | 37
b/mythtv/libs/libmythtv/recorders/channelbase.cpp | 4
b/mythtv/libs/libmythtv/recorders/dtvsignalmonitor.cpp | 12
b/mythtv/libs/libmythtv/recorders/hlsstreamhandler.cpp | 91
b/mythtv/libs/libmythtv/recorders/hlsstreamhandler.h | 5
b/mythtv/libs/libmythtv/recorders/importrecorder.cpp | 2
b/mythtv/libs/libmythtv/recorders/iptvchannel.cpp | 105
b/mythtv/libs/libmythtv/recorders/iptvchannel.h | 20
b/mythtv/libs/libmythtv/recorders/iptvrecorder.cpp | 17
b/mythtv/libs/libmythtv/recorders/iptvrecorder.h | 1
b/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.cpp | 46
b/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.h | 3
b/mythtv/libs/libmythtv/recorders/recorderbase.cpp | 4
b/mythtv/libs/libmythtv/recorders/signalmonitor.cpp | 3
b/mythtv/libs/libmythtv/recorders/streamhandler.cpp | 2
b/mythtv/libs/libmythtv/recorders/streamhandler.h | 1
b/mythtv/libs/libmythtv/recordinginfo.cpp | 143
b/mythtv/libs/libmythtv/tv_play.cpp | 84
b/mythtv/libs/libmythtv/tv_play.h | 1
b/mythtv/libs/libmythtv/tv_rec.cpp | 69
b/mythtv/libs/libmythtv/tv_rec.h | 1
b/mythtv/libs/libmythtv/tvremoteutil.cpp | 2
b/mythtv/libs/libmythtv/videosource.cpp | 2
b/mythtv/libs/libmythupnp/httprequest.cpp | 3
b/mythtv/programs/mythbackend/backendhousekeeper.cpp | 52
b/mythtv/programs/mythbackend/backendhousekeeper.h | 1
b/mythtv/programs/mythbackend/mainserver.cpp | 47
b/mythtv/programs/mythbackend/mainserver.h | 2
b/mythtv/programs/mythbackend/playbacksock.cpp | 6
b/mythtv/programs/mythbackend/playbacksock.h | 3
b/mythtv/programs/mythbackend/scheduler.cpp | 75
b/mythtv/programs/mythbackend/services/dvr.cpp | 2
b/mythtv/programs/mythbackend/services/guide.cpp | 61
b/mythtv/programs/mythbackend/services/serviceUtil.cpp | 6
b/mythtv/programs/mythcommflag/main.cpp | 6
b/mythtv/programs/mythfilldatabase/filldata.cpp | 81
b/mythtv/programs/mythfilldatabase/filldata.h | 7
b/mythtv/programs/mythfilldatabase/main.cpp | 12
b/mythtv/programs/mythfrontend/guidegrid.cpp | 450
b/mythtv/programs/mythfrontend/guidegrid.h | 50
b/mythtv/programs/mythfrontend/scheduleeditor.cpp | 18
b/mythtv/programs/mythtranscode/main.cpp | 3
b/mythtv/programs/mythtranscode/mpeg2fix.cpp | 2
b/mythtv/programs/mythtranscode/transcode.cpp | 7
b/mythtv/programs/mythtv-setup/importicons.cpp | 107
b/mythtv/programs/mythtv-setup/importicons.h | 1
b/mythtv/programs/mythutil/commandlineparser.cpp | 35
b/mythtv/programs/mythutil/markuputils.cpp | 157
b/mythtv/programs/mythutil/mythutil.cpp | 6
b/mythtv/programs/mythwelcome/welcomedialog.cpp | 30
b/mythtv/programs/scripts/metadata/Movie/tmdb3.py | 19
b/mythtv/themes/MythCenter-wide/notification-ui.xml | 2
b/mythtv/themes/MythCenter-wide/zoneminder-ui.xml | 242
b/mythtv/themes/MythCenter/notification-ui.xml | 2
mythtv/bindings/python/MythTV/tmdb/XSLT/tmdbQuery.xsl | 99
mythtv/bindings/python/MythTV/tmdb/XSLT/tmdbVideo.xsl | 157
mythtv/bindings/python/MythTV/tmdb/tmdb_api.py | 1317
mythtv/bindings/python/MythTV/tmdb/tmdb_exceptions.py | 45
mythtv/bindings/python/MythTV/tmdb/tmdb_ui.py | 266
mythtv/programs/scripts/metadata/Movie/tmdb.py | 647
154 files changed, 24207 insertions(+), 18842 deletions(-)
Index: mythtv-0.27-fixes.patch
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-18/mythtv-0.27-fixes.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mythtv-0.27-fixes.patch 2 Dec 2013 19:15:54 -0000 1.2
+++ mythtv-0.27-fixes.patch 7 Jan 2014 20:05:46 -0000 1.3
@@ -11,7 +11,17 @@
mythplugins/mythgame/i18n/mythgame_sv.ts | 136 +-
mythplugins/mythmusic/i18n/mythmusic_sv.qm | Bin 60650 -> 61545 bytes
mythplugins/mythmusic/i18n/mythmusic_sv.ts | 1902 +-
- mythplugins/mythmusic/mythmusic/avfdecoder.cpp | 4 +-
+ mythplugins/mythmusic/mythmusic/avfdecoder.cpp | 9 +-
+ mythplugins/mythmusic/mythmusic/editmetadata.cpp | 34 +-
+ mythplugins/mythmusic/mythmusic/importmusic.cpp | 4 +-
+ mythplugins/mythmusic/mythmusic/musiccommon.cpp | 102 +-
+ mythplugins/mythmusic/mythmusic/musicplayer.cpp | 94 +-
+ mythplugins/mythmusic/mythmusic/musicplayer.h | 3 +-
+ mythplugins/mythmusic/mythmusic/playlist.cpp | 2 +-
+ .../mythmusic/mythmusic/playlisteditorview.cpp | 16 +-
+ mythplugins/mythmusic/mythmusic/searchview.cpp | 15 +-
+ mythplugins/mythmusic/mythmusic/shoutcast.cpp | 4 +-
+ mythplugins/mythmusic/mythmusic/streamview.cpp | 7 +-
mythplugins/mythnetvision/i18n/mythnetvision_sv.qm | Bin 11838 -> 14109 bytes
mythplugins/mythnetvision/i18n/mythnetvision_sv.ts | 279 +-
mythplugins/mythnews/i18n/mythnews_sv.qm | Bin 4604 -> 4965 bytes
@@ -34,6 +44,7 @@
.../mythzoneminder/mythzoneminder/zmplayer.h | 3 +-
.../theme/default-wide/zoneminder-ui.xml | 244 +-
.../mythzoneminder/theme/default/zoneminder-ui.xml | 203 +
+ mythtv/bindings/python/MythTV/dataheap.py | 1 +
mythtv/bindings/python/MythTV/system.py | 11 +-
.../bindings/python/MythTV/tmdb/XSLT/tmdbQuery.xsl | 99 -
.../bindings/python/MythTV/tmdb/XSLT/tmdbVideo.xsl | 157 -
@@ -61,8 +72,14 @@
mythtv/libs/libmythbase/mythsocket.cpp | 12 +
mythtv/libs/libmythbase/mythsystemlegacy.cpp | 8 +-
mythtv/libs/libmythbase/mythversion.h | 2 +-
+ mythtv/libs/libmythmetadata/metadatacommon.cpp | 23 +-
+ mythtv/libs/libmythmetadata/metadatafactory.cpp | 6 +-
+ mythtv/libs/libmythmetadata/metaio.cpp | 8 +
+ mythtv/libs/libmythmetadata/metaio.h | 2 +
+ mythtv/libs/libmythmetadata/metaioavfcomment.cpp | 2 -
.../libs/libmythtv/AirPlay/mythairplayserver.cpp | 14 +-
mythtv/libs/libmythtv/AirPlay/mythraopdevice.cpp | 3 +-
+ mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp | 5 +-
mythtv/libs/libmythtv/cardutil.cpp | 22 +
mythtv/libs/libmythtv/cardutil.h | 8 +
mythtv/libs/libmythtv/libmythtv.pro | 14 +
@@ -83,6 +100,7 @@
.../libmythtv/recorders/HLS/HLSStreamWorker.cpp | 75 +
.../libs/libmythtv/recorders/HLS/HLSStreamWorker.h | 37 +
mythtv/libs/libmythtv/recorders/channelbase.cpp | 4 +-
+ .../libs/libmythtv/recorders/dtvsignalmonitor.cpp | 12 +
.../libs/libmythtv/recorders/hlsstreamhandler.cpp | 91 +-
mythtv/libs/libmythtv/recorders/hlsstreamhandler.h | 5 +-
mythtv/libs/libmythtv/recorders/importrecorder.cpp | 2 +-
@@ -92,11 +110,13 @@
mythtv/libs/libmythtv/recorders/iptvrecorder.h | 1 -
.../libs/libmythtv/recorders/iptvsignalmonitor.cpp | 46 +-
.../libs/libmythtv/recorders/iptvsignalmonitor.h | 3 +-
+ mythtv/libs/libmythtv/recorders/recorderbase.cpp | 4 +-
mythtv/libs/libmythtv/recorders/signalmonitor.cpp | 3 +-
mythtv/libs/libmythtv/recorders/streamhandler.cpp | 2 +
mythtv/libs/libmythtv/recorders/streamhandler.h | 1 +
mythtv/libs/libmythtv/recordinginfo.cpp | 143 +-
- mythtv/libs/libmythtv/tv_play.cpp | 43 +-
+ mythtv/libs/libmythtv/tv_play.cpp | 84 +-
+ mythtv/libs/libmythtv/tv_play.h | 1 +
mythtv/libs/libmythtv/tv_rec.cpp | 69 +-
mythtv/libs/libmythtv/tv_rec.h | 1 +
mythtv/libs/libmythtv/tvremoteutil.cpp | 2 +-
@@ -118,18 +138,22 @@
mythtv/programs/mythfilldatabase/main.cpp | 12 +-
mythtv/programs/mythfrontend/guidegrid.cpp | 450 +-
mythtv/programs/mythfrontend/guidegrid.h | 50 +-
+ mythtv/programs/mythfrontend/scheduleeditor.cpp | 18 +-
mythtv/programs/mythtranscode/main.cpp | 3 +-
mythtv/programs/mythtranscode/mpeg2fix.cpp | 2 +
mythtv/programs/mythtranscode/transcode.cpp | 7 +-
+ mythtv/programs/mythtv-setup/importicons.cpp | 107 +-
+ mythtv/programs/mythtv-setup/importicons.h | 1 +
mythtv/programs/mythutil/commandlineparser.cpp | 35 +-
mythtv/programs/mythutil/markuputils.cpp | 157 +-
mythtv/programs/mythutil/mythutil.cpp | 6 +
+ mythtv/programs/mythwelcome/welcomedialog.cpp | 30 +-
mythtv/programs/scripts/metadata/Movie/tmdb.py | 647 -
mythtv/programs/scripts/metadata/Movie/tmdb3.py | 19 +-
mythtv/themes/MythCenter-wide/notification-ui.xml | 2 +-
mythtv/themes/MythCenter-wide/zoneminder-ui.xml | 242 +-
mythtv/themes/MythCenter/notification-ui.xml | 2 +-
- 131 files changed, 23851 insertions(+), 18651 deletions(-)
+ 155 files changed, 24207 insertions(+), 18842 deletions(-)
diff --git a/mythplugins/mytharchive/i18n/mytharchive_sv.qm b/mythplugins/mytharchive/i18n/mytharchive_sv.qm
index fd29269..a6c7157 100644
@@ -8252,10 +8276,18 @@
+</context>
</TS>
diff --git a/mythplugins/mythmusic/mythmusic/avfdecoder.cpp b/mythplugins/mythmusic/mythmusic/avfdecoder.cpp
-index 08cbd24..535aa12 100644
+index 08cbd24..898ebbd 100644
--- a/mythplugins/mythmusic/mythmusic/avfdecoder.cpp
+++ b/mythplugins/mythmusic/mythmusic/avfdecoder.cpp
-@@ -48,7 +48,7 @@ extern "C" {
+@@ -35,6 +35,7 @@ using namespace std;
+
+ // Mythmusic Headers
+ #include "avfdecoder.h"
++#include "metaio.h"
+ #include "metaioavfcomment.h"
+ #include "metaioid3.h"
+ #include "metaioflacvorbis.h"
+@@ -48,7 +49,7 @@ extern "C" {
}
// size of the buffer used for streaming
@@ -8264,7 +8296,7 @@
// streaming callbacks
static int ReadFunc(void *opaque, uint8_t *buf, int buf_size)
-@@ -264,7 +264,7 @@ bool avfDecoder::initialize()
+@@ -264,7 +265,7 @@ bool avfDecoder::initialize()
probe_data.filename = filename.toLocal8Bit().constData();
probe_data.buf_size = min(BUFFER_SIZE, (int) input()->bytesAvailable());
probe_data.buf = m_buffer;
@@ -8273,6 +8305,862 @@
m_inputFormat = av_probe_input_format(&probe_data, 1);
if (!m_inputFormat)
+@@ -551,9 +552,7 @@ bool avfDecoderFactory::supports(const QString &source) const
+
+ const QString &avfDecoderFactory::extension() const
+ {
+- static QString ext(".mp3|.mp2|.ogg|.oga|.flac|.wma|.wav|.ac3|.oma|.omg|"
+- ".atp|.ra|.dts|.aac|.m4a|.aa3|.tta|.mka|.aiff|.swa|.wv");
+- return ext;
++ return MetaIO::ValidFileExtensions;
+ }
+
+ const QString &avfDecoderFactory::description() const
+diff --git a/mythplugins/mythmusic/mythmusic/editmetadata.cpp b/mythplugins/mythmusic/mythmusic/editmetadata.cpp
+index d25a222..fc02be4 100644
+--- a/mythplugins/mythmusic/mythmusic/editmetadata.cpp
++++ b/mythplugins/mythmusic/mythmusic/editmetadata.cpp
+@@ -205,7 +205,10 @@ void EditMetadataCommon::saveAll()
+ MetaIO *tagger = m_metadata->getTagger();
+
+ if (tagger)
++ {
+ tagger->write(m_metadata);
++ delete tagger;
++ }
+ }
+
+ saveToDatabase();
+@@ -289,7 +292,7 @@ void EditMetadataCommon::scanForImages(void)
+ // scan the tracks tag for any images
+ MetaIO *tagger = m_metadata->getTagger();
+
+- if (tagger->supportsEmbeddedImages())
++ if (tagger && tagger->supportsEmbeddedImages())
+ {
+ AlbumArtList art = tagger->getAlbumArtList(m_metadata->Filename());
+ for (int x = 0; x < art.count(); x++)
+@@ -298,6 +301,9 @@ void EditMetadataCommon::scanForImages(void)
+ m_metadata->getAlbumArtImages()->addImage(image);
+ }
+ }
++
++ if (tagger)
++ delete tagger;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////
+@@ -1080,6 +1086,8 @@ void EditAlbumartDialog::showMenu(void )
+ menu->AddButton(tr("Rescan For Images"));
+ menu->AddButton(tr("Search Internet For Images"));
+
++ MetaIO *tagger = m_metadata->getTagger();
++
+ if (m_coverartList->GetItemCurrent())
+ {
+ menu->AddButton(tr("Change Image Type"), NULL, true);
+@@ -1094,12 +1102,12 @@ void EditAlbumartDialog::showMenu(void )
+ {
+ if (!image->embedded)
+ {
+- if (m_metadata->getTagger()->supportsEmbeddedImages())
++ if (tagger && tagger->supportsEmbeddedImages())
+ menu->AddButton(tr("Copy Selected Image To Tag"));
+ }
+ else
+ {
+- if (m_metadata->getTagger()->supportsEmbeddedImages())
++ if (tagger && tagger->supportsEmbeddedImages())
+ menu->AddButton(tr("Remove Selected Image From Tag"));
+ }
+ }
+@@ -1109,10 +1117,13 @@ void EditAlbumartDialog::showMenu(void )
+
+ if (GetMythDB()->GetNumSetting("AllowTagWriting", 0))
+ {
+- if (m_metadata->getTagger()->supportsEmbeddedImages())
++ if (tagger && tagger->supportsEmbeddedImages())
+ menu->AddButton(tr("Copy Image To Tag"));
+ }
+
++ if (tagger)
++ delete tagger;
++
+ popupStack->AddScreen(menu);
+ }
+
+@@ -1177,6 +1188,9 @@ void EditAlbumartDialog::customEvent(QEvent *event)
+ if (!tagger->changeImageType(m_metadata->Filename(), &oldImage, image->imageType))
+ LOG(VB_GENERAL, LOG_INFO, "EditAlbumartDialog: failed to change image type");
+ }
++
++ if (tagger)
++ delete tagger;
+ }
+ else
+ {
+@@ -1334,10 +1348,11 @@ void EditAlbumartDialog::doRemoveImageFromTag(bool doIt)
+ {
+ MetaIO *tagger = m_metadata->getTagger();
+
+- if (!tagger->supportsEmbeddedImages())
++ if (tagger && !tagger->supportsEmbeddedImages())
+ {
+ LOG(VB_GENERAL, LOG_ERR, "EditAlbumartDialog: asked to remove an image from the tag "
+ "but the tagger doesn't support it!");
++ delete tagger;
+ return;
+ }
+
+@@ -1348,6 +1363,9 @@ void EditAlbumartDialog::doRemoveImageFromTag(bool doIt)
+
+ removeCachedImage(image);
+ rescanForImages();
++
++ if (tagger)
++ delete tagger;
+ }
+ }
+ }
+@@ -1356,10 +1374,11 @@ void EditAlbumartDialog::doCopyImageToTag(const AlbumArtImage *image)
+ {
+ MetaIO *tagger = m_metadata->getTagger();
+
+- if (!tagger->supportsEmbeddedImages())
++ if (tagger && !tagger->supportsEmbeddedImages())
+ {
+ LOG(VB_GENERAL, LOG_ERR, "EditAlbumartDialog: asked to write album art to the tag "
+ "but the tagger does't support it!");
++ delete tagger;
+ return;
+ }
+
+@@ -1371,6 +1390,9 @@ void EditAlbumartDialog::doCopyImageToTag(const AlbumArtImage *image)
+ removeCachedImage(image);
+
+ rescanForImages();
++
++ if (tagger)
++ delete tagger;
+ }
+
+ void EditAlbumartDialog::removeCachedImage(const AlbumArtImage *image)
+diff --git a/mythplugins/mythmusic/mythmusic/importmusic.cpp b/mythplugins/mythmusic/mythmusic/importmusic.cpp
+index a016177..d0faf12 100644
+--- a/mythplugins/mythmusic/mythmusic/importmusic.cpp
++++ b/mythplugins/mythmusic/mythmusic/importmusic.cpp
+@@ -450,9 +450,11 @@ void ImportMusicDialog::addPressed()
+ AlbumArtList artList = tagger->getAlbumArtList(meta->Filename(true));
+ meta->setEmbeddedAlbumArt(artList);
+ meta->getAlbumArtImages()->dumpToDatabase();
+- delete tagger;
+ }
+
++ if (tagger)
++ delete tagger;
++
+ m_somethingWasImported = true;
+
+ m_tracks->at(m_currentTrack)->isNewTune =
+diff --git a/mythplugins/mythmusic/mythmusic/musiccommon.cpp b/mythplugins/mythmusic/mythmusic/musiccommon.cpp
+index e75b5d3..2292d39 100644
+--- a/mythplugins/mythmusic/mythmusic/musiccommon.cpp
++++ b/mythplugins/mythmusic/mythmusic/musiccommon.cpp
+@@ -272,8 +272,9 @@ bool MusicCommon::CreateCommon(void)
+ updateShuffleMode();
+ updateRepeatMode();
+
+- gPlayer->getPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
+- m_currentTrack, &m_playlistPlayedTime);
++ if (gPlayer->getCurrentPlaylist())
++ gPlayer->getCurrentPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
++ m_currentTrack, &m_playlistPlayedTime);
+
+ if (m_playlistProgress)
+ {
+@@ -364,8 +365,9 @@ void MusicCommon::updateShuffleMode(bool updateUIList)
+ {
+ updateUIPlaylist();
+
+- gPlayer->getPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
+- gPlayer->getCurrentTrackPos(), &m_playlistPlayedTime);
++ if (gPlayer->getCurrentPlaylist())
++ gPlayer->getCurrentPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
++ gPlayer->getCurrentTrackPos(), &m_playlistPlayedTime);
+ updatePlaylistStats();
+
+ // need this to update the next track info
+@@ -517,8 +519,9 @@ bool MusicCommon::keyPressEvent(QKeyEvent *e)
+ gPlayer->moveTrackUpDown(true, m_currentPlaylist->GetCurrentPos());
+ item->MoveUpDown(true);
+ m_currentTrack = gPlayer->getCurrentTrackPos();
+- gPlayer->getPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
+- m_currentTrack, &m_playlistPlayedTime);
++ if (gPlayer->getCurrentPlaylist())
++ gPlayer->getCurrentPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
++ m_currentTrack, &m_playlistPlayedTime);
+ updatePlaylistStats();
+ updateTrackInfo(gPlayer->getCurrentMetadata());
+ }
+@@ -527,8 +530,9 @@ bool MusicCommon::keyPressEvent(QKeyEvent *e)
+ gPlayer->moveTrackUpDown(false, m_currentPlaylist->GetCurrentPos());
+ item->MoveUpDown(false);
+ m_currentTrack = gPlayer->getCurrentTrackPos();
+- gPlayer->getPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
+- m_currentTrack, &m_playlistPlayedTime);
++ if (gPlayer->getCurrentPlaylist())
++ gPlayer->getCurrentPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
++ m_currentTrack, &m_playlistPlayedTime);
+ updatePlaylistStats();
+ updateTrackInfo(gPlayer->getCurrentMetadata());
+ }
+@@ -1266,8 +1270,11 @@ void MusicCommon::customEvent(QEvent *event)
+ }
+ else if (resulttext == tr("Remove All Tracks"))
+ {
+- gPlayer->getPlaylist()->removeAllTracks();
+- gPlayer->activePlaylistChanged(-1, true);
++ if (gPlayer->getCurrentPlaylist())
++ {
++ gPlayer->getCurrentPlaylist()->removeAllTracks();
++ gPlayer->activePlaylistChanged(-1, true);
++ }
+ }
+ else if (resulttext == tr("Save To New Playlist"))
+ {
+@@ -1419,12 +1426,15 @@ void MusicCommon::customEvent(QEvent *event)
+ }
+ else if (resultid == "updateplaylist")
+ {
+- Playlist *playlist = gMusicData->all_playlists->getPlaylist(resulttext);
+- QString songList = gPlayer->getPlaylist()->toRawSonglist();
+- playlist->removeAllTracks();
+- playlist->fillSongsFromSonglist(songList);
+- playlist->changed();
+- gPlayer->playlistChanged(playlist->getID());
++ if (gPlayer->getCurrentPlaylist())
++ {
++ Playlist *playlist = gMusicData->all_playlists->getPlaylist(resulttext);
++ QString songList = gPlayer->getCurrentPlaylist()->toRawSonglist();
++ playlist->removeAllTracks();
++ playlist->fillSongsFromSonglist(songList);
++ playlist->changed();
++ gPlayer->playlistChanged(playlist->getID());
++ }
+ }
+ }
+ else if (event->type() == MusicPlayerEvent::TrackChangeEvent)
+@@ -1464,8 +1474,9 @@ void MusicCommon::customEvent(QEvent *event)
+
+ m_currentTrack = trackNo;
+
+- gPlayer->getPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
+- m_currentTrack, &m_playlistPlayedTime);
++ if (gPlayer->getCurrentPlaylist())
++ gPlayer->getCurrentPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
++ m_currentTrack, &m_playlistPlayedTime);
+ if (m_playlistProgress)
+ {
+ m_playlistProgress->SetTotal(m_playlistMaxTime);
+@@ -1513,13 +1524,14 @@ void MusicCommon::customEvent(QEvent *event)
+ gPlayer->next();
+ }
+
+- gPlayer->getPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
+- m_currentTrack, &m_playlistPlayedTime);
++ if (gPlayer->getCurrentPlaylist())
++ gPlayer->getCurrentPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
++ m_currentTrack, &m_playlistPlayedTime);
+ updatePlaylistStats();
+ updateTrackInfo(gPlayer->getCurrentMetadata());
+
+- if (m_noTracksText)
+- m_noTracksText->SetVisible((gPlayer->getPlaylist()->getSongs().count() == 0));
++ if (m_noTracksText && gPlayer->getCurrentPlaylist())
++ m_noTracksText->SetVisible((gPlayer->getCurrentPlaylist()->getSongs().count() == 0));
+ }
+ else if (event->type() == MusicPlayerEvent::TrackAddedEvent)
+ {
+@@ -1568,13 +1580,14 @@ void MusicCommon::customEvent(QEvent *event)
+ gPlayer->changeCurrentTrack(0);
+ }
+
+- if (m_noTracksText)
+- m_noTracksText->SetVisible((gPlayer->getPlaylist()->getSongs().count() == 0));
++ if (m_noTracksText && gPlayer->getCurrentPlaylist())
++ m_noTracksText->SetVisible((gPlayer->getCurrentPlaylist()->getSongs().count() == 0));
+ }
+ }
+
+- gPlayer->getPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
+- m_currentTrack, &m_playlistPlayedTime);
++ if (gPlayer->getCurrentPlaylist())
++ gPlayer->getCurrentPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
++ m_currentTrack, &m_playlistPlayedTime);
+
+ updatePlaylistStats();
+ updateTrackInfo(gPlayer->getCurrentMetadata());
+@@ -1859,8 +1872,8 @@ void MusicCommon::playlistItemVisible(MythUIButtonListItem *item)
+
+ void MusicCommon::updateUIPlaylist(void)
+ {
+- if (m_noTracksText)
+- m_noTracksText->SetVisible((gPlayer->getPlaylist()->getSongs().count() == 0));
++ if (m_noTracksText && gPlayer->getCurrentPlaylist())
++ m_noTracksText->SetVisible((gPlayer->getCurrentPlaylist()->getSongs().count() == 0));
+
+ if (!m_currentPlaylist)
+ return;
+@@ -1869,7 +1882,10 @@ void MusicCommon::updateUIPlaylist(void)
+
+ m_currentTrack = -1;
+
+- Playlist *playlist = gPlayer->getPlaylist();
++ Playlist *playlist = gPlayer->getCurrentPlaylist();
++
++ if (!playlist)
++ return;
+
+ QList<MusicMetadata*> songlist = playlist->getSongs();
+ QList<MusicMetadata*>::iterator it = songlist.begin();
+@@ -1940,7 +1956,10 @@ void MusicCommon::updateUIPlayedList(void)
+
+ void MusicCommon::updatePlaylistStats(void)
+ {
+- int trackCount = gPlayer->getPlaylist()->getSongs().size();
++ int trackCount = 0;
++
++ if (gPlayer->getCurrentPlaylist())
++ trackCount = gPlayer->getCurrentPlaylist()->getSongs().size();
+
+ InfoMap map;
+ if (gPlayer->isPlaying() && trackCount > 0)
+@@ -1955,7 +1974,7 @@ void MusicCommon::updatePlaylistStats(void)
+ map["playlisttime"] = getTimeString(m_playlistPlayedTime + m_currentTime, m_playlistMaxTime);
+ map["playlistplayedtime"] = getTimeString(m_playlistPlayedTime + m_currentTime, 0);
+ map["playlisttotaltime"] = getTimeString(m_playlistMaxTime, 0);
+- QString playlistName = gPlayer->getPlaylist()->getName();
++ QString playlistName = gPlayer->getCurrentPlaylist() ? gPlayer->getCurrentPlaylist()->getName() : "";
+ if (playlistName == "default_playlist_storage")
+ playlistName = tr("Default Playlist");
+ else if (playlistName == "stream_playlist")
+@@ -2338,10 +2357,13 @@ void MusicCommon::byTitle(void)
+
+ void MusicCommon::showPlaylistOptionsMenu(bool addMainMenu)
+ {
++ if (!gPlayer->getCurrentPlaylist())
++ return;
++
+ m_playlistOptions.playPLOption = PL_CURRENT;
+
+ // Don't bother showing the dialog if the current playlist is empty
+- if (gPlayer->getPlaylist()->getSongs().count() == 0)
++ if (gPlayer->getCurrentPlaylist()->getSongs().count() == 0)
+ {
+ m_playlistOptions.insertPLOption = PL_REPLACE;
+ doUpdatePlaylist(true);
+@@ -2365,10 +2387,11 @@ void MusicCommon::showPlaylistOptionsMenu(bool addMainMenu)
+
+ void MusicCommon::doUpdatePlaylist(bool startPlayback)
+ {
+- int curTrackID, trackCount;
++ int curTrackID, trackCount = 0;
+ int curPos = gPlayer->getCurrentTrackPos();
+
+- trackCount = gPlayer->getPlaylist()->getSongs().count();
++ if (gPlayer->getCurrentPlaylist())
++ trackCount = gPlayer->getCurrentPlaylist()->getSongs().count();
+
+ // store id of current track
+ if (gPlayer->getCurrentMetadata())
+@@ -2482,8 +2505,9 @@ void MusicCommon::doUpdatePlaylist(bool startPlayback)
+ gPlayer->changeCurrentTrack(m_currentTrack);
+ }
+
+- gPlayer->getPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
+- m_currentTrack, &m_playlistPlayedTime);
++ if (gPlayer->getCurrentPlaylist())
++ gPlayer->getCurrentPlaylist()->getStats(&m_playlistTrackCount, &m_playlistMaxTime,
++ m_currentTrack, &m_playlistPlayedTime);
+ updatePlaylistStats();
+ updateTrackInfo(gPlayer->getCurrentMetadata());
+ }
+@@ -2493,11 +2517,11 @@ bool MusicCommon::restorePosition(int trackID)
+ // try to move to the current track
+ bool foundTrack = false;
+
+- if (trackID != -1)
++ if (trackID != -1 && gPlayer->getCurrentPlaylist())
+ {
+- for (int x = 0; x < gPlayer->getPlaylist()->getSongs().size(); x++)
++ for (int x = 0; x < gPlayer->getCurrentPlaylist()->getSongs().size(); x++)
+ {
+- MusicMetadata *mdata = gPlayer->getPlaylist()->getSongs().at(x);
++ MusicMetadata *mdata = gPlayer->getCurrentPlaylist()->getSongs().at(x);
+ if (mdata && mdata->ID() == (MusicMetadata::IdType) trackID)
+ {
+ m_currentTrack = x;
+diff --git a/mythplugins/mythmusic/mythmusic/musicplayer.cpp b/mythplugins/mythmusic/mythmusic/musicplayer.cpp
+index 5a0e414..2f23efb 100644
+--- a/mythplugins/mythmusic/mythmusic/musicplayer.cpp
++++ b/mythplugins/mythmusic/mythmusic/musicplayer.cpp
+@@ -57,7 +57,6 @@ MusicPlayer::MusicPlayer(QObject *parent)
+
+ m_output = NULL;
+ m_decoderHandler = NULL;
+- m_currentPlaylist = NULL;
+ m_currentTrack = -1;
+
+ m_currentTime = 0;
+@@ -408,7 +407,7 @@ void MusicPlayer::next(void)
+ {
+ int currentTrack = m_currentTrack;
+
+- if (!m_currentPlaylist)
++ if (!getCurrentPlaylist())
+ return;
+
+ if (m_oneshotMetadata)
+@@ -419,7 +418,7 @@ void MusicPlayer::next(void)
+ else
+ currentTrack++;
+
+- if (currentTrack >= m_currentPlaylist->getSongs().size())
++ if (currentTrack >= getCurrentPlaylist()->getSongs().size())
+ {
+ if (m_repeatMode == REPEAT_ALL)
+ {
+@@ -445,7 +444,7 @@ void MusicPlayer::previous(void)
+ {
+ int currentTrack = m_currentTrack;
+
+- if (!m_currentPlaylist)
++ if (!getCurrentPlaylist())
+ return;
+
+ if (m_oneshotMetadata)
+@@ -474,7 +473,7 @@ void MusicPlayer::previous(void)
+
+ void MusicPlayer::nextAuto(void)
+ {
+- if (!m_currentPlaylist)
++ if (!getCurrentPlaylist())
+ return;
+
+ if (m_oneshotMetadata)
+@@ -886,12 +885,10 @@ void MusicPlayer::loadPlaylist(void)
+ {
+ if (m_playMode == PLAYMODE_RADIO)
+ {
+- m_currentPlaylist = gMusicData->all_playlists->getStreamPlaylist();
+-
+ if (getResumeMode() > MusicPlayer::RESUME_OFF)
+ {
+ int bookmark = gCoreContext->GetNumSetting("MusicRadioBookmark", 0);
+- if (bookmark < 0 || bookmark >= m_currentPlaylist->getSongs().size())
++ if (bookmark < 0 || bookmark >= getCurrentPlaylist()->getSongs().size())
+ bookmark = 0;
+
+ m_currentTrack = bookmark;
+@@ -903,12 +900,10 @@ void MusicPlayer::loadPlaylist(void)
+ }
+ else
+ {
+- m_currentPlaylist = gMusicData->all_playlists->getActive();
+-
+ if (getResumeMode() > MusicPlayer::RESUME_OFF)
+ {
+ int bookmark = gCoreContext->GetNumSetting("MusicBookmark", 0);
+- if (bookmark < 0 || bookmark >= m_currentPlaylist->getSongs().size())
++ if (bookmark < 0 || bookmark >= getCurrentPlaylist()->getSongs().size())
+ bookmark = 0;
+
+ m_currentTrack = bookmark;
+@@ -936,17 +931,20 @@ void MusicPlayer::loadStreamPlaylist(void)
+
+ void MusicPlayer::moveTrackUpDown(bool moveUp, int whichTrack)
+ {
++ if (!getCurrentPlaylist())
++ return;
++
+ if (moveUp && whichTrack <= 0)
+ return;
+
+- if (!moveUp && whichTrack >= m_currentPlaylist->getSongs().size() - 1)
++ if (!moveUp && whichTrack >= getCurrentPlaylist()->getSongs().size() - 1)
+ return;
+
+- MusicMetadata *currTrack = m_currentPlaylist->getSongs().at(m_currentTrack);
++ MusicMetadata *currTrack = getCurrentPlaylist()->getSongs().at(m_currentTrack);
+
+- m_currentPlaylist->moveTrackUpDown(moveUp, whichTrack);
++ getCurrentPlaylist()->moveTrackUpDown(moveUp, whichTrack);
+
+- m_currentTrack = m_currentPlaylist->getSongs().indexOf(currTrack);
++ m_currentTrack = getCurrentPlaylist()->getSongs().indexOf(currTrack);
+ }
+
+ bool MusicPlayer::setCurrentTrackPos(int pos)
+@@ -998,12 +996,15 @@ void MusicPlayer::restorePosition(void)
+ id = gCoreContext->GetNumSetting("MusicBookmark", 0);
+ }
+
+- for (int x = 0; x < m_currentPlaylist->getSongs().size(); x++)
++ if (getCurrentPlaylist())
+ {
+- if (m_currentPlaylist->getSongs().at(x)->ID() == id)
++ for (int x = 0; x < getCurrentPlaylist()->getSongs().size(); x++)
+ {
+- m_currentTrack = x;
+- break;
++ if (getCurrentPlaylist()->getSongs().at(x)->ID() == id)
++ {
++ m_currentTrack = x;
++ break;
++ }
+ }
+ }
+
+@@ -1046,7 +1047,7 @@ void MusicPlayer::showMiniPlayer(void)
+ /// change the current track to the given track
+ void MusicPlayer::changeCurrentTrack(int trackNo)
+ {
+- if (!m_currentPlaylist)
++ if (!getCurrentPlaylist())
+ return;
+
+ // check to see if we need to save the current tracks volatile metadata (playcount, last played etc)
+@@ -1055,7 +1056,7 @@ void MusicPlayer::changeCurrentTrack(int trackNo)
+ m_currentTrack = trackNo;
+
+ // sanity check the current track
+- if (m_currentTrack < 0 || m_currentTrack >= m_currentPlaylist->getSongs().size())
++ if (m_currentTrack < 0 || m_currentTrack >= getCurrentPlaylist()->getSongs().size())
+ {
+ LOG(VB_GENERAL, LOG_ERR,
+ QString("MusicPlayer: asked to set the current track to an invalid track no. %1")
+@@ -1071,10 +1072,10 @@ MusicMetadata *MusicPlayer::getCurrentMetadata(void)
+ if (m_oneshotMetadata)
+ return m_oneshotMetadata;
+
+- if (!m_currentPlaylist || !m_currentPlaylist->getSongAt(m_currentTrack))
++ if (!getCurrentPlaylist() || !getCurrentPlaylist()->getSongAt(m_currentTrack))
+ return NULL;
+
+- return m_currentPlaylist->getSongAt(m_currentTrack);
++ return getCurrentPlaylist()->getSongAt(m_currentTrack);
+ }
+
+ /// get the metadata for the next track in the playlist
+@@ -1086,21 +1087,21 @@ MusicMetadata *MusicPlayer::getNextMetadata(void)
+ if (m_oneshotMetadata)
+ return getCurrentMetadata();
+
+- if (!m_currentPlaylist || !m_currentPlaylist->getSongAt(m_currentTrack))
++ if (!getCurrentPlaylist() || !getCurrentPlaylist()->getSongAt(m_currentTrack))
+ return NULL;
+
+ if (m_repeatMode == REPEAT_TRACK)
+ return getCurrentMetadata();
+
+ // if we are not playing the last track then just return the next track
+- if (m_currentTrack < m_currentPlaylist->getSongs().size() - 1)
+- return m_currentPlaylist->getSongAt(m_currentTrack + 1);
++ if (m_currentTrack < getCurrentPlaylist()->getSongs().size() - 1)
++ return getCurrentPlaylist()->getSongAt(m_currentTrack + 1);
+ else
+ {
+ // if we are playing the last track then we need to take the
+ // repeat mode into account
+ if (m_repeatMode == REPEAT_ALL)
+- return m_currentPlaylist->getSongAt(0);
++ return getCurrentPlaylist()->getSongAt(0);
+ else
+ return NULL;
+ }
+@@ -1168,14 +1169,16 @@ void MusicPlayer::setShuffleMode(ShuffleMode mode)
+ if (m_playMode == PLAYMODE_TRACKS)
+ m_shuffleMode = mode;
+
+- if (m_currentPlaylist)
+- m_currentPlaylist->shuffleTracks(mode);
++ if (!getCurrentPlaylist())
++ return;
++
++ getCurrentPlaylist()->shuffleTracks(mode);
+
+ if (curTrackID != -1)
+ {
+- for (int x = 0; x < getPlaylist()->getSongs().size(); x++)
++ for (int x = 0; x < getCurrentPlaylist()->getSongs().size(); x++)
+ {
+- MusicMetadata *mdata = getPlaylist()->getSongs().at(x);
++ MusicMetadata *mdata = getCurrentPlaylist()->getSongs().at(x);
+ if (mdata && mdata->ID() == (MusicMetadata::IdType) curTrackID)
+ {
+ m_currentTrack = x;
+@@ -1361,7 +1364,7 @@ void MusicPlayer::activePlaylistChanged(int trackID, bool deleted)
+ }
+
+ // if we don't have any tracks to play stop here
+- if (!m_currentPlaylist || m_currentPlaylist->getSongs().count() == 0)
++ if (!getCurrentPlaylist() || getCurrentPlaylist()->getSongs().count() == 0)
+ {
+ m_currentTrack = -1;
+ if (isPlaying())
+@@ -1374,9 +1377,9 @@ void MusicPlayer::activePlaylistChanged(int trackID, bool deleted)
+ // make sure the current playing track is still valid
+ if (isPlaying() && getDecoderHandler())
+ {
+- for (int x = 0; x < m_currentPlaylist->getSongs().size(); x++)
++ for (int x = 0; x < getCurrentPlaylist()->getSongs().size(); x++)
+ {
+- if (m_currentPlaylist->getSongs().at(x)->ID() == getDecoderHandler()->getMetadata().ID())
++ if (getCurrentPlaylist()->getSongs().at(x)->ID() == getDecoderHandler()->getMetadata().ID())
+ {
+ trackPos = x;
+ break;
+@@ -1493,17 +1496,34 @@ void MusicPlayer::removeTrack(int trackID)
+ MusicMetadata *mdata = gMusicData->all_music->getMetadata(trackID);
+ if (mdata)
+ {
+- int trackPos = gPlayer->getPlaylist()->getSongs().indexOf(mdata);
++ int trackPos = getCurrentPlaylist()->getSongs().indexOf(mdata);
+ if (m_currentTrack > 0 && m_currentTrack >= trackPos)
+ m_currentTrack--;
+
+- getPlaylist()->removeTrack(trackID);
++ getCurrentPlaylist()->removeTrack(trackID);
+ }
+ }
+
+ void MusicPlayer::addTrack(int trackID, bool updateUI)
+ {
+- getPlaylist()->addTrack(trackID, updateUI);
++ getCurrentPlaylist()->addTrack(trackID, updateUI);
++}
++
++Playlist* MusicPlayer::getCurrentPlaylist ( void )
++{
++ if (!gMusicData || !gMusicData->all_playlists)
++ return NULL;
++
++ if (m_playMode == PLAYMODE_RADIO)
++ {
++ return gMusicData->all_playlists->getStreamPlaylist();
++ }
++ else
++ {
++ return gMusicData->all_playlists->getActive();
++ }
++
++ return NULL;
+ }
+
+ StreamList *MusicPlayer::getStreamList(void)
+diff --git a/mythplugins/mythmusic/mythmusic/musicplayer.h b/mythplugins/mythmusic/mythmusic/musicplayer.h
+index 4a57e8b..8f6bb5c 100644
+--- a/mythplugins/mythmusic/mythmusic/musicplayer.h
++++ b/mythplugins/mythmusic/mythmusic/musicplayer.h
+@@ -113,7 +113,7 @@ class MusicPlayer : public QObject, public MythObservable
+
+ void loadPlaylist(void);
+ void loadStreamPlaylist(void);
+- Playlist *getPlaylist(void) { return m_currentPlaylist; }
++ Playlist *getCurrentPlaylist(void);
+ StreamList *getStreamList(void);
+
+ // these add and remove tracks from the active playlist
+@@ -198,7 +198,6 @@ class MusicPlayer : public QObject, public MythObservable
+ void setupDecoderHandler(void);
+ void decoderHandlerReady(void);
+
+- Playlist *m_currentPlaylist;
+ int m_currentTrack;
+ int m_currentTime;
+
+diff --git a/mythplugins/mythmusic/mythmusic/playlist.cpp b/mythplugins/mythmusic/mythmusic/playlist.cpp
+index ac2a4d3..4f36b58 100644
+--- a/mythplugins/mythmusic/mythmusic/playlist.cpp
++++ b/mythplugins/mythmusic/mythmusic/playlist.cpp
+@@ -680,7 +680,7 @@ void Playlist::fillSongsFromSonglist(QString songList)
+ }
+ }
+
+- if (this == gPlayer->getPlaylist())
++ if (this == gPlayer->getCurrentPlaylist())
+ shuffleTracks(gPlayer->getShuffleMode());
+ else
+ shuffleTracks(MusicPlayer::SHUFFLE_OFF);
+diff --git a/mythplugins/mythmusic/mythmusic/playlisteditorview.cpp b/mythplugins/mythmusic/mythmusic/playlisteditorview.cpp
+index ce944c5..868628d 100644
+--- a/mythplugins/mythmusic/mythmusic/playlisteditorview.cpp
++++ b/mythplugins/mythmusic/mythmusic/playlisteditorview.cpp
+@@ -780,12 +780,12 @@ void PlaylistEditorView::treeItemClicked(MythUIButtonListItem *item)
+ MythGenericTree *node = qVariantValue<MythGenericTree*> (item->GetData());
+ MusicGenericTree *mnode = dynamic_cast<MusicGenericTree*>(node);
+
+- if (!mnode)
++ if (!mnode || !gPlayer->getCurrentPlaylist())
+ return;
+
+ if (mnode->getAction() == "trackid")
+ {
+- if (gPlayer->getPlaylist()->checkTrack(mnode->getInt()))
++ if (gPlayer->getCurrentPlaylist()->checkTrack(mnode->getInt()))
+ {
+ // remove track from the current playlist
+ gPlayer->removeTrack(mnode->getInt());
+@@ -1009,7 +1009,7 @@ void PlaylistEditorView::filterTracks(MusicGenericTree *node)
+ MusicGenericTree *newnode = new MusicGenericTree(node, i.key(), "trackid");
+ newnode->setInt(i.value());
+ newnode->setDrawArrow(false);
+- bool hasTrack = gPlayer->getPlaylist()->checkTrack(newnode->getInt());
++ bool hasTrack = gPlayer->getCurrentPlaylist() ? gPlayer->getCurrentPlaylist()->checkTrack(newnode->getInt()) : false;
+ newnode->setCheck( hasTrack ? MythUIButtonListItem::FullChecked : MythUIButtonListItem::NotChecked);
+ ++i;
+ }
+@@ -1288,7 +1288,7 @@ void PlaylistEditorView::filterTracks(MusicGenericTree *node)
+ MusicGenericTree *newnode = new MusicGenericTree(node, i.key().mid(7), "trackid");
+ newnode->setInt(i.value()->at(0)->ID());
+ newnode->setDrawArrow(false);
+- bool hasTrack = gPlayer->getPlaylist()->checkTrack(newnode->getInt());
++ bool hasTrack = gPlayer->getCurrentPlaylist() ? gPlayer->getCurrentPlaylist()->checkTrack(newnode->getInt()) : false;
+ newnode->setCheck( hasTrack ? MythUIButtonListItem::FullChecked : MythUIButtonListItem::NotChecked);
+ }
+ ++i;
+@@ -1544,7 +1544,7 @@ void PlaylistEditorView::getSmartPlaylistTracks(MusicGenericTree *node, int play
+ new MusicGenericTree(node, query.value(1).toString(), "trackid");
+ newnode->setInt(query.value(0).toInt());
+ newnode->setDrawArrow(false);
+- bool hasTrack = gPlayer->getPlaylist()->checkTrack(newnode->getInt());
++ bool hasTrack = gPlayer->getCurrentPlaylist() ? gPlayer->getCurrentPlaylist()->checkTrack(newnode->getInt()) : false;
+ newnode->setCheck( hasTrack ? MythUIButtonListItem::FullChecked : MythUIButtonListItem::NotChecked);
+ }
+
+@@ -1581,7 +1581,7 @@ void PlaylistEditorView::getCDTracks(MusicGenericTree *node)
+ MusicGenericTree *newnode = new MusicGenericTree(node, title, "trackid");
+ newnode->setInt(mdata->ID());
+ newnode->setDrawArrow(false);
+- bool hasTrack = gPlayer->getPlaylist()->checkTrack(mdata->ID());
++ bool hasTrack = gPlayer->getCurrentPlaylist() ? gPlayer->getCurrentPlaylist()->checkTrack(mdata->ID()) : false;
+ newnode->setCheck(hasTrack ? MythUIButtonListItem::FullChecked : MythUIButtonListItem::NotChecked);
+ }
+ }
+@@ -1599,7 +1599,7 @@ void PlaylistEditorView::getPlaylistTracks(MusicGenericTree *node, int playlistI
+ MusicGenericTree *newnode = new MusicGenericTree(node, mdata->Title(), "trackid");
+ newnode->setInt(mdata->ID());
+ newnode->setDrawArrow(false);
+- bool hasTrack = gPlayer->getPlaylist()->checkTrack(mdata->ID());
++ bool hasTrack = gPlayer->getCurrentPlaylist() ? gPlayer->getCurrentPlaylist()->checkTrack(mdata->ID()) : false;
+ newnode->setCheck(hasTrack ? MythUIButtonListItem::FullChecked : MythUIButtonListItem::NotChecked);
+ }
+ }
+@@ -1627,7 +1627,7 @@ void PlaylistEditorView::updateSelectedTracks(MusicGenericTree *node)
+ {
+ if (mnode->getAction() == "trackid")
+ {
+- bool hasTrack = gPlayer->getPlaylist()->checkTrack(mnode->getInt());
++ bool hasTrack = gPlayer->getCurrentPlaylist() ? gPlayer->getCurrentPlaylist()->checkTrack(mnode->getInt()) : false;
+ mnode->setCheck(hasTrack ? MythUIButtonListItem::FullChecked : MythUIButtonListItem::NotChecked);
+ }
+ else
+diff --git a/mythplugins/mythmusic/mythmusic/searchview.cpp b/mythplugins/mythmusic/mythmusic/searchview.cpp
+index 7078365..39f63f4 100644
+--- a/mythplugins/mythmusic/mythmusic/searchview.cpp
++++ b/mythplugins/mythmusic/mythmusic/searchview.cpp
+@@ -105,7 +105,7 @@ void SearchView::customEvent(QEvent *event)
+ MusicMetadata *mdata = qVariantValue<MusicMetadata*> (item->GetData());
+ if (mdata && (mdata->ID() == (MusicMetadata::IdType) trackID || trackID == -1))
+ {
+- if (gPlayer->getPlaylist()->checkTrack(mdata->ID()))
++ if (gPlayer->getCurrentPlaylist() && gPlayer->getCurrentPlaylist()->checkTrack(mdata->ID()))
+ item->DisplayState("on", "selectedstate");
+ else
+ item->DisplayState("off", "selectedstate");
+@@ -280,7 +280,7 @@ void SearchView::ShowMenu(void)
+ MusicMetadata *mdata = qVariantValue<MusicMetadata*> (item->GetData());
+ if (mdata)
+ {
+- if (gPlayer->getPlaylist()->checkTrack(mdata->ID()))
++ if (gPlayer->getCurrentPlaylist() && gPlayer->getCurrentPlaylist()->checkTrack(mdata->ID()))
+ menu->AddItem(tr("Remove From Playlist"));
+ else
+ {
+@@ -425,7 +425,7 @@ void SearchView::updateTracksList(void)
+ mdata->toMap(metadataMap);
+ newitem->SetTextFromMap(metadataMap);
+
+- if (gPlayer->getPlaylist()->checkTrack(mdata->ID()))
++ if (gPlayer->getCurrentPlaylist() && gPlayer->getCurrentPlaylist()->checkTrack(mdata->ID()))
+ newitem->DisplayState("on", "selectedstate");
+ else
+ newitem->DisplayState("off", "selectedstate");
+@@ -442,13 +442,16 @@ void SearchView::updateTracksList(void)
+
+ void SearchView::trackClicked(MythUIButtonListItem *item)
+ {
++ if (!gPlayer->getCurrentPlaylist())
++ return;
++
+ MusicMetadata *mdata = qVariantValue<MusicMetadata*> (item->GetData());
+ if (mdata)
+ {
+- if (gPlayer->getPlaylist()->checkTrack(mdata->ID()))
+- gPlayer->getPlaylist()->removeTrack(mdata->ID());
++ if (gPlayer->getCurrentPlaylist()->checkTrack(mdata->ID()))
++ gPlayer->getCurrentPlaylist()->removeTrack(mdata->ID());
+ else
+- gPlayer->getPlaylist()->addTrack(mdata->ID(), true);
++ gPlayer->getCurrentPlaylist()->addTrack(mdata->ID(), true);
+ }
+ }
+
+diff --git a/mythplugins/mythmusic/mythmusic/shoutcast.cpp b/mythplugins/mythmusic/mythmusic/shoutcast.cpp
+index 9d7f3b5..5cdb56a 100644
+--- a/mythplugins/mythmusic/mythmusic/shoutcast.cpp
++++ b/mythplugins/mythmusic/mythmusic/shoutcast.cpp
+@@ -391,6 +391,8 @@ ShoutCastIODevice::ShoutCastIODevice(void)
+ switchToState(NOT_CONNECTED);
+
+ setOpenMode(ReadWrite);
++
++ m_socket->setReadBufferSize(DecoderIOFactory::DefaultPrebufferSize);
+ }
+
+ ShoutCastIODevice::~ShoutCastIODevice(void)
+@@ -540,7 +542,7 @@ void ShoutCastIODevice::socketReadyRead(void)
+
+ if (!m_started && m_bytesDownloaded > DecoderIOFactory::DefaultPrebufferSize)
+ {
+- m_socket->setReadBufferSize(DecoderIOFactory::DefaultPrebufferSize);
++ m_socket->setReadBufferSize(DecoderIOFactory::DefaultBufferSize);
+ m_started = true;
+ }
+
+diff --git a/mythplugins/mythmusic/mythmusic/streamview.cpp b/mythplugins/mythmusic/mythmusic/streamview.cpp
+index 08568cb..46c001d 100644
+--- a/mythplugins/mythmusic/mythmusic/streamview.cpp
++++ b/mythplugins/mythmusic/mythmusic/streamview.cpp
+@@ -411,13 +411,16 @@ void StreamView::doRemoveStream(bool ok)
+
+ void StreamView::updateStreamList(void)
+ {
++ if (!gPlayer->getCurrentPlaylist())
++ return;
++
+ m_streamList->Reset();
+
+ bool foundActiveStream = false;
+
+- for (int x = 0; x < gPlayer->getPlaylist()->getSongs().count(); x++)
++ for (int x = 0; x < gPlayer->getCurrentPlaylist()->getSongs().count(); x++)
+ {
+- MusicMetadata *mdata = gPlayer->getPlaylist()->getSongs().at(x);
++ MusicMetadata *mdata = gPlayer->getCurrentPlaylist()->getSongs().at(x);
+ MythUIButtonListItem *item = new MythUIButtonListItem(m_streamList, "", qVariantFromValue(mdata));
+ InfoMap metadataMap;
+ if (mdata)
diff --git a/mythplugins/mythnetvision/i18n/mythnetvision_sv.qm b/mythplugins/mythnetvision/i18n/mythnetvision_sv.qm
index 89c05a8..a2d6520 100644
Binary files a/mythplugins/mythnetvision/i18n/mythnetvision_sv.qm and b/mythplugins/mythnetvision/i18n/mythnetvision_sv.qm differ
@@ -11688,6 +12576,18 @@
</window>
</mythuitheme>
+diff --git a/mythtv/bindings/python/MythTV/dataheap.py b/mythtv/bindings/python/MythTV/dataheap.py
+index b37b70a..f8510e3 100644
+--- a/mythtv/bindings/python/MythTV/dataheap.py
++++ b/mythtv/bindings/python/MythTV/dataheap.py
+@@ -888,6 +888,7 @@ class Video( CMPVideo, VideoSchema, DBDataWrite ):
+ self.cast.commit()
+ self.genre.commit()
+ self.country.commit()
++ self.markup.commit()
+
+ def __repr__(self):
+ if self._wheredat is None:
diff --git a/mythtv/bindings/python/MythTV/system.py b/mythtv/bindings/python/MythTV/system.py
index f24c8a9..44803bd 100644
--- a/mythtv/bindings/python/MythTV/system.py
@@ -54746,7 +55646,7 @@
}
diff --git a/mythtv/libs/libmythbase/mythversion.h b/mythtv/libs/libmythbase/mythversion.h
-index 52d12bf..ebaee78 100644
+index 52d12bf..2ae9c54 100644
--- a/mythtv/libs/libmythbase/mythversion.h
+++ b/mythtv/libs/libmythbase/mythversion.h
@@ -12,7 +12,7 @@
@@ -54754,10 +55654,132 @@
/// Including changes in the libmythbase, libmyth, libmythtv, libmythav* and
/// libmythui class methods in exported headers.
-#define MYTH_BINARY_VERSION "0.27.20130902-1"
-+#define MYTH_BINARY_VERSION "0.27.20131107-1"
++#define MYTH_BINARY_VERSION "0.27.20140103-1"
/** \brief Increment this whenever the MythTV network protocol changes.
*
+diff --git a/mythtv/libs/libmythmetadata/metadatacommon.cpp b/mythtv/libs/libmythmetadata/metadatacommon.cpp
+index 2c320f5..9c9ae58 100644
+--- a/mythtv/libs/libmythmetadata/metadatacommon.cpp
++++ b/mythtv/libs/libmythmetadata/metadatacommon.cpp
+@@ -393,14 +393,33 @@ MetadataLookup::~MetadataLookup()
+ QList<PersonInfo> MetadataLookup::GetPeople(PeopleType type) const
+ {
+ QList<PersonInfo> ret;
+- ret = m_people.values(type);
++ // QMultiMap::values() returns items in reverse order which we need to
++ // correct by iterating back over the list
++ // See http://qt-project.org/doc/qt-4.8/qmultimap.html#details
++ // Specifically "The items that share the same key are available from "
++ // "most recently to least recently inserted."
++ QListIterator<PersonInfo> it(m_people.values(type));
++ it.toBack();
++ while (it.hasPrevious())
++ ret.append(it.previous());
++
+ return ret;
+ }
+
+ ArtworkList MetadataLookup::GetArtwork(VideoArtworkType type) const
+ {
+ ArtworkList ret;
+- ret = m_artwork.values(type);
++
++ // QMultiMap::values() returns items in reverse order which we need to
++ // correct by iterating back over the list
++ // See http://qt-project.org/doc/qt-4.8/qmultimap.html#details
++ // Specifically "The items that share the same key are available from "
++ // "most recently to least recently inserted."
++ QListIterator<ArtworkInfo> it(m_artwork.values(type));
++ it.toBack();
++ while (it.hasPrevious())
++ ret.append(it.previous());
++
+ return ret;
+ }
+
+diff --git a/mythtv/libs/libmythmetadata/metadatafactory.cpp b/mythtv/libs/libmythmetadata/metadatafactory.cpp
+index 2bda8a8..0109213 100644
+--- a/mythtv/libs/libmythmetadata/metadatafactory.cpp
++++ b/mythtv/libs/libmythmetadata/metadatafactory.cpp
+@@ -287,7 +287,7 @@ void MetadataFactory::OnSingleResult(MetadataLookup *lookup)
+ if (coverartlist.size())
+ {
+ ArtworkInfo info;
+- info.url = coverartlist.takeLast().url;
++ info.url = coverartlist.takeFirst().url;
+ map.insert(kArtworkCoverart, info);
+ }
+
+@@ -309,7 +309,7 @@ void MetadataFactory::OnSingleResult(MetadataLookup *lookup)
+ if (bannerlist.size())
+ {
+ ArtworkInfo info;
+- info.url = bannerlist.takeLast().url;
++ info.url = bannerlist.takeFirst().url;
+ map.insert(kArtworkBanner, info);
+ }
+
+@@ -319,7 +319,7 @@ void MetadataFactory::OnSingleResult(MetadataLookup *lookup)
+ if (screenshotlist.size())
+ {
+ ArtworkInfo info;
+- info.url = screenshotlist.takeLast().url;
++ info.url = screenshotlist.takeFirst().url;
+ map.insert(kArtworkScreenshot, info);
+ }
+ }
+diff --git a/mythtv/libs/libmythmetadata/metaio.cpp b/mythtv/libs/libmythmetadata/metaio.cpp
+index a64e6eb..04d5e20 100644
+--- a/mythtv/libs/libmythmetadata/metaio.cpp
++++ b/mythtv/libs/libmythmetadata/metaio.cpp
+@@ -14,6 +14,8 @@
+ // Libmyth
+ #include <mythcontext.h>
+
++const QString MetaIO::ValidFileExtensions(".mp3|.mp2|.ogg|.oga|.flac|.wma|.wav|.ac3|.oma|.omg|"
++ ".atp|.ra|.dts|.aac|.m4a|.aa3|.tta|.mka|.aiff|.swa|.wv");
+ /*!
+ * \brief Constructor
+ */
+@@ -35,6 +37,12 @@ MetaIO* MetaIO::createTagger(const QString& filename)
+ QFileInfo fi(filename);
+ QString extension = fi.suffix().toLower();
+
++ if (extension.isEmpty() || !MetaIO::ValidFileExtensions.contains(extension))
++ {
++ LOG(VB_FILE, LOG_WARNING, QString("MetaIO: unknown extension: '%1'").arg(extension));
++ return NULL;
++ }
++
+ if (extension == "mp3" || extension == "mp2")
+ return new MetaIOID3;
+ else if (extension == "ogg" || extension == "oga")
+diff --git a/mythtv/libs/libmythmetadata/metaio.h b/mythtv/libs/libmythmetadata/metaio.h
+index 7b9594e..b117d69 100644
+--- a/mythtv/libs/libmythmetadata/metaio.h
++++ b/mythtv/libs/libmythmetadata/metaio.h
+@@ -156,6 +156,8 @@ class META_PUBLIC MetaIO
+ */
+ static MusicMetadata *getMetadata(const QString &filename);
+
++ static const QString ValidFileExtensions;
++
+ protected:
+
+ private:
+diff --git a/mythtv/libs/libmythmetadata/metaioavfcomment.cpp b/mythtv/libs/libmythmetadata/metaioavfcomment.cpp
+index c9ed293..ccb2af0 100644
+--- a/mythtv/libs/libmythmetadata/metaioavfcomment.cpp
++++ b/mythtv/libs/libmythmetadata/metaioavfcomment.cpp
+@@ -136,7 +136,5 @@ int MetaIOAVFComment::getTrackLength(AVFormatContext* pContext)
+ if (!pContext)
+ return 0;
+
+- av_estimate_timings(pContext, 0);
+-
+ return (pContext->duration / AV_TIME_BASE) * 1000;
+ }
diff --git a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp b/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp
index ab0f393..f6e1f15 100644
--- a/mythtv/libs/libmythtv/AirPlay/mythairplayserver.cpp
@@ -54814,6 +55836,22 @@
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)));
+diff --git a/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp b/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp
+index 70bcb97..5708f76 100644
+--- a/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp
++++ b/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp
+@@ -942,7 +942,10 @@ int DVDRingBuffer::safe_read(void *data, uint sz)
+ m_endPts = pci->pci_gi.vobu_e_ptm;
+ m_inMenu = (pci->hli.hl_gi.btn_ns > 0);
+
+- if (m_inMenu && (dsi->synci.sp_synca[0] & 0x80000000) && !m_buttonExists)
++ if (m_inMenu &&
++ m_seeking &&
++ (dsi->synci.sp_synca[0] & 0x80000000) &&
++ !m_buttonExists)
+ {
+ LOG(VB_PLAYBACK, LOG_DEBUG, LOC + QString("Jumped into middle of menu: lba %1, dest %2")
+ .arg(pci->pci_gi.nv_pck_lbn)
diff --git a/mythtv/libs/libmythtv/cardutil.cpp b/mythtv/libs/libmythtv/cardutil.cpp
index 9e4324c..da7998f 100644
--- a/mythtv/libs/libmythtv/cardutil.cpp
@@ -57318,6 +58356,36 @@
.arg(m_system_status). arg(ret));
m_system_status = ret;
+diff --git a/mythtv/libs/libmythtv/recorders/dtvsignalmonitor.cpp b/mythtv/libs/libmythtv/recorders/dtvsignalmonitor.cpp
+index f3e4b6b..f6f9f67 100644
+--- a/mythtv/libs/libmythtv/recorders/dtvsignalmonitor.cpp
++++ b/mythtv/libs/libmythtv/recorders/dtvsignalmonitor.cpp
+@@ -321,6 +321,7 @@ void DTVSignalMonitor::HandlePAT(const ProgramAssociationTable *pat)
+ .arg(programNumber);
+ LOG(VB_GENERAL, LOG_ERR, LOC + errStr + "\n" + pat->toString());
+ }
++ // only one entry in the PAT, just use it
+ if (pat->ProgramCount() == 1)
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "But there is only one program "
+@@ -329,6 +330,17 @@ void DTVSignalMonitor::HandlePAT(const ProgramAssociationTable *pat)
+ AddFlags(kDTVSigMon_PATMatch);
+ GetStreamData()->AddListeningPID(pat->ProgramPID(0));
+ }
++ // two entries, but one is a pointer to the NIT PID instead
++ // of a real program, use the other
++ if ((pat->ProgramCount() == 2) && ((pat->ProgramNumber(0) == 0) || (pat->ProgramNumber(1) == 0)))
++ {
++ LOG(VB_GENERAL, LOG_ERR, LOC + "But there is only one program "
++ "in the PAT, so we'll just use it");
++ uint pid = pat->FindAnyPID();
++ SetProgramNumber(pat->FindProgram(pid));
++ AddFlags(kDTVSigMon_PATMatch);
++ GetStreamData()->AddListeningPID(pid);
++ }
+ }
+ }
+
diff --git a/mythtv/libs/libmythtv/recorders/hlsstreamhandler.cpp b/mythtv/libs/libmythtv/recorders/hlsstreamhandler.cpp
index 0885ef5..c3d4dc1 100644
--- a/mythtv/libs/libmythtv/recorders/hlsstreamhandler.cpp
@@ -57958,6 +59026,28 @@
};
#endif // _IPTVSIGNALMONITOR_H_
+diff --git a/mythtv/libs/libmythtv/recorders/recorderbase.cpp b/mythtv/libs/libmythtv/recorders/recorderbase.cpp
+index 06a1f2c..57f7dd9 100644
+--- a/mythtv/libs/libmythtv/recorders/recorderbase.cpp
++++ b/mythtv/libs/libmythtv/recorders/recorderbase.cpp
+@@ -430,7 +430,7 @@ bool RecorderBase::GetKeyframePositions(
+ (it.key() <= (uint64_t)end); ++it)
+ map[it.key()] = *it;
+
+- LOG(VB_GENERAL, LOG_INFO, LOC +
++ LOG(VB_GENERAL, LOG_DEBUG, LOC +
+ QString("GetKeyframePositions(%1,%2,#%3) out of %4")
+ .arg(start).arg(end).arg(map.size()).arg(positionMap.size()));
+
+@@ -452,7 +452,7 @@ bool RecorderBase::GetKeyframeDurations(
+ (it.key() <= (uint64_t)end); ++it)
+ map[it.key()] = *it;
+
+- LOG(VB_GENERAL, LOG_INFO, LOC +
++ LOG(VB_GENERAL, LOG_DEBUG, LOC +
+ QString("GetKeyframeDurations(%1,%2,#%3) out of %4")
+ .arg(start).arg(end).arg(map.size()).arg(durationMap.size()));
+
diff --git a/mythtv/libs/libmythtv/recorders/signalmonitor.cpp b/mythtv/libs/libmythtv/recorders/signalmonitor.cpp
index cb38c42..1c413df 100644
--- a/mythtv/libs/libmythtv/recorders/signalmonitor.cpp
@@ -58177,10 +59267,34 @@
{
result.prepare("DELETE FROM oldfind WHERE "
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
-index 99d0c1f..c446dc8 100644
+index 99d0c1f..5efb78e 100644
--- a/mythtv/libs/libmythtv/tv_play.cpp
+++ b/mythtv/libs/libmythtv/tv_play.cpp
-@@ -1618,17 +1618,17 @@ void TV::GetStatus(void)
+@@ -982,6 +982,7 @@ TV::TV(void)
+ db_auto_set_watched(false), db_end_of_rec_exit_prompt(false),
+ db_jump_prefer_osd(true), db_use_gui_size_for_tv(false),
+ db_start_in_guide(false), db_toggle_bookmark(false),
++ db_clear_saved_position(false),
+ db_run_jobs_on_remote(false), db_continue_embedded(false),
+ db_use_fixed_size(true), db_browse_always(false),
+ db_browse_all_tuners(false),
+@@ -1087,6 +1088,7 @@ void TV::InitFromDB(void)
+ kv["JumpToProgramOSD"] = "1";
+ kv["GuiSizeForTV"] = "0";
+ kv["WatchTVGuide"] = "0";
++ kv["ClearSavedPosition"] = "1";
+ kv["AltClearSavedPosition"] = "1";
+ kv["JobsRunOnRecordHost"] = "0";
+ kv["ContinueEmbeddedTVPlay"] = "0";
+@@ -1131,6 +1133,7 @@ void TV::InitFromDB(void)
+ db_jump_prefer_osd = kv["JumpToProgramOSD"].toInt();
+ db_use_gui_size_for_tv = kv["GuiSizeForTV"].toInt();
+ db_start_in_guide = kv["WatchTVGuide"].toInt();
++ db_clear_saved_position= kv["ClearSavedPosition"].toInt();
+ db_toggle_bookmark = kv["AltClearSavedPosition"].toInt();
+ db_run_jobs_on_remote = kv["JobsRunOnRecordHost"].toInt();
+ db_continue_embedded = kv["ContinueEmbeddedTVPlay"].toInt();
+@@ -1618,17 +1621,17 @@ void TV::GetStatus(void)
status.insert("brightness",
vo->GetPictureAttribute(kPictureAttribute_Brightness));
}
@@ -58201,7 +59315,55 @@
{
status.insert("hue",
vo->GetPictureAttribute(kPictureAttribute_Hue));
-@@ -3709,6 +3709,34 @@ static bool has_action(QString action, const QStringList &actions)
+@@ -3260,17 +3263,39 @@ void TV::PrepToSwitchToRecordedProgram(PlayerContext *ctx,
+
+ void TV::PrepareToExitPlayer(PlayerContext *ctx, int line, BookmarkAction bookmark)
+ {
+- bool bm_basic =
+- (bookmark == kBookmarkAlways ||
+- (bookmark == kBookmarkAuto && db_playback_exit_prompt == 2));
+- bool bookmark_it = bm_basic && IsBookmarkAllowed(ctx);
++ bool bm_allowed = IsBookmarkAllowed(ctx);
+ ctx->LockDeletePlayer(__FILE__, line);
+ if (ctx->player)
+ {
+- if (bookmark_it)
+- SetBookmark(ctx,
+- (ctx->player->IsNearEnd() || getEndOfRecording())
+- && !StateIsRecording(GetState(ctx)));
++ if (bm_allowed)
++ {
++ // If we're exiting in the middle of the recording, we
++ // automatically save a bookmark when "Action on playback
++ // exit" is set to "Save position and exit".
++ bool allow_set_before_end =
++ (bookmark == kBookmarkAlways ||
++ (bookmark == kBookmarkAuto &&
++ db_playback_exit_prompt == 2));
++ // If we're exiting at the end of the recording, we
++ // automatically clear the bookmark when "Action on
++ // playback exit" is set to "Save position and exit" and
++ // "Clear bookmark on playback" is set to true.
++ bool allow_clear_at_end =
++ (bookmark == kBookmarkAlways ||
++ (bookmark == kBookmarkAuto &&
++ db_playback_exit_prompt == 2 &&
++ db_clear_saved_position));
++ // Whether to set/clear a bookmark depends on whether we're
++ // exiting at the end of a recording.
++ bool at_end = (ctx->player->IsNearEnd() || getEndOfRecording());
++ // Don't consider ourselves at the end if the recording is
++ // in-progress.
++ at_end &= !StateIsRecording(GetState(ctx));
++ if (at_end && allow_clear_at_end)
++ SetBookmark(ctx, true);
++ if (!at_end && allow_set_before_end)
++ SetBookmark(ctx, false);
++ }
+ if (db_auto_set_watched)
+ ctx->player->SetWatched();
+ }
+@@ -3709,6 +3734,34 @@ static bool has_action(QString action, const QStringList &actions)
return false;
}
@@ -58236,7 +59398,7 @@
bool TV::ProcessKeypress(PlayerContext *actx, QKeyEvent *e)
{
bool ignoreKeys = actx->IsPlayerChangingBuffers();
-@@ -3871,6 +3899,7 @@ bool TV::ProcessKeypress(PlayerContext *actx, QKeyEvent *e)
+@@ -3871,6 +3924,7 @@ bool TV::ProcessKeypress(PlayerContext *actx, QKeyEvent *e)
bool isDVD = actx->buffer && actx->buffer->IsDVD();
bool isMenuOrStill = actx->buffer && actx->buffer->IsInDiscMenuOrStillFrame();
@@ -58244,7 +59406,7 @@
handled = handled || BrowseHandleAction(actx, actions);
handled = handled || ManualZoomHandleAction(actx, actions);
handled = handled || PictureAttributeHandleAction(actx, actions);
-@@ -8062,7 +8091,7 @@ void TV::UpdateOSDSignal(const PlayerContext *ctx, const QStringList &strlist)
+@@ -8062,7 +8116,7 @@ void TV::UpdateOSDSignal(const PlayerContext *ctx, const QStringList &strlist)
ber = it->GetValue();
else if ("pos" == it->GetShortName())
pos = it->GetValue();
@@ -58253,7 +59415,7 @@
tuned = it->GetValue();
else if ("seen_pat" == it->GetShortName())
pat = it->IsGood() ? "a" : "_";
-@@ -8574,7 +8603,7 @@ void TV::DoEditSchedule(int editType)
+@@ -8574,7 +8628,7 @@ void TV::DoEditSchedule(int editType)
const ProgramInfo pginfo(*actx->playingInfo);
uint chanid = pginfo.GetChanID();
QString channum = pginfo.GetChanNum();
@@ -58262,7 +59424,7 @@
actx->UnlockPlayingInfo(__FILE__, __LINE__);
ClearOSD(actx);
-@@ -11623,7 +11652,7 @@ bool TV::MenuItemDisplayPlayback(const MenuItemContext &c)
+@@ -11623,7 +11677,7 @@ bool TV::MenuItemDisplayPlayback(const MenuItemContext &c)
{
if (ctx->recorder)
{
@@ -58271,7 +59433,7 @@
uint cardid = ctx->GetCardID();
vector<uint> excluded_cardids;
stable_sort(cardids.begin(), cardids.end());
-@@ -11673,7 +11702,7 @@ bool TV::MenuItemDisplayPlayback(const MenuItemContext &c)
+@@ -11673,7 +11727,7 @@ bool TV::MenuItemDisplayPlayback(const MenuItemContext &c)
uint cardid = 0;
vector<uint> excluded_cardids;
uint sourceid = 0;
@@ -58280,6 +59442,18 @@
cardid = ctx->GetCardID();
excluded_cardids.push_back(cardid);
InfoMap info;
+diff --git a/mythtv/libs/libmythtv/tv_play.h b/mythtv/libs/libmythtv/tv_play.h
+index c3bc859..8b110c1 100644
+--- a/mythtv/libs/libmythtv/tv_play.h
++++ b/mythtv/libs/libmythtv/tv_play.h
+@@ -786,6 +786,7 @@ class MTV_PUBLIC TV : public QObject, public MenuItemDisplayer
+ bool db_use_gui_size_for_tv;
+ bool db_start_in_guide;
+ bool db_toggle_bookmark;
++ bool db_clear_saved_position;
+ bool db_run_jobs_on_remote;
+ bool db_continue_embedded;
+ bool db_use_fixed_size;
diff --git a/mythtv/libs/libmythtv/tv_rec.cpp b/mythtv/libs/libmythtv/tv_rec.cpp
index ced991b..9542baa 100644
--- a/mythtv/libs/libmythtv/tv_rec.cpp
@@ -60050,6 +61224,44 @@
int m_changrpid;
ChannelGroupList m_changrplist;
+diff --git a/mythtv/programs/mythfrontend/scheduleeditor.cpp b/mythtv/programs/mythfrontend/scheduleeditor.cpp
+index d8013b7..725c12c 100644
+--- a/mythtv/programs/mythfrontend/scheduleeditor.cpp
++++ b/mythtv/programs/mythfrontend/scheduleeditor.cpp
+@@ -1459,11 +1459,12 @@ void MetadataOptions::PerformQuery()
+
+ lookup->SetStep(kLookupSearch);
+ lookup->SetType(kMetadataRecording);
+- if (m_seasonSpin->GetIntValue() > 0 ||
+- m_episodeSpin->GetIntValue() > 0)
+- lookup->SetSubtype(kProbableTelevision);
++ if ((m_recInfo && m_recInfo->GetCategoryType() == ProgramInfo::kCategoryMovie) ||
++ (m_seasonSpin->GetIntValue() == 0 &&
++ m_episodeSpin->GetIntValue() == 0))
++ lookup->SetSubtype(kProbableMovie);
+ else
+- lookup->SetSubtype(kProbableMovie);
++ lookup->SetSubtype(kProbableTelevision);
+ lookup->SetAllowGeneric(true);
+ lookup->SetAutomatic(false);
+ lookup->SetHandleImages(false);
+@@ -1658,11 +1659,12 @@ void MetadataOptions::FindNetArt(VideoArtworkType type)
+ lookup->SetType(kMetadataVideo);
+ lookup->SetAutomatic(true);
+ lookup->SetHandleImages(false);
+- if (m_seasonSpin->GetIntValue() > 0 ||
+- m_episodeSpin->GetIntValue() > 0)
+- lookup->SetSubtype(kProbableTelevision);
++ if ((m_recInfo && m_recInfo->GetCategoryType() == ProgramInfo::kCategoryMovie) ||
++ (m_seasonSpin->GetIntValue() == 0 &&
++ m_episodeSpin->GetIntValue() == 0))
++ lookup->SetSubtype(kProbableMovie);
+ else
+- lookup->SetSubtype(kProbableMovie);
++ lookup->SetSubtype(kProbableTelevision);
+ lookup->SetAllowGeneric(true);
+ lookup->SetData(qVariantFromValue<VideoArtworkType>(type));
+ lookup->SetHost(gCoreContext->GetMasterHostName());
diff --git a/mythtv/programs/mythtranscode/main.cpp b/mythtv/programs/mythtranscode/main.cpp
index 8993042..de5c2e9 100644
--- a/mythtv/programs/mythtranscode/main.cpp
@@ -60116,6 +61328,230 @@
}
}
if (MythDate::current() > statustime)
+diff --git a/mythtv/programs/mythtv-setup/importicons.cpp b/mythtv/programs/mythtv-setup/importicons.cpp
+index 9eac506..6cceb04 100644
+--- a/mythtv/programs/mythtv-setup/importicons.cpp
++++ b/mythtv/programs/mythtv-setup/importicons.cpp
+@@ -10,6 +10,8 @@
+ #include "importicons.h"
+ #include "mythdate.h"
+ #include "mythdownloadmanager.h"
++#include "remotefile.h"
++#include "mythcorecontext.h"
+
+ // MythUI
+ #include "mythuitext.h"
+@@ -58,10 +60,6 @@ ImportIconsWizard::~ImportIconsWizard()
+
+ bool ImportIconsWizard::Create()
+ {
+- if (!initialLoad(m_strChannelname))
+- return false;
+-
+-
+ bool foundtheme = false;
+
+ // Load the theme for this screen
+@@ -109,6 +107,12 @@ bool ImportIconsWizard::Create()
+ return true;
+ }
+
++void ImportIconsWizard::Load()
++{
++ if (!initialLoad(m_strChannelname))
++ Close();
++}
++
+ void ImportIconsWizard::Init()
+ {
+ if (m_nMaxCount > 0)
+@@ -263,6 +267,7 @@ void ImportIconsWizard::itemChanged(MythUIButtonListItem *item)
+
+ bool ImportIconsWizard::initialLoad(QString name)
+ {
++
+ QString dirpath = GetConfDir();
+ QDir configDir(dirpath);
+ if (!configDir.exists() && !configDir.mkdir(dirpath))
+@@ -314,6 +319,7 @@ bool ImportIconsWizard::initialLoad(QString name)
+ {
+ m_popupStack->AddScreen(m_progressDialog);
+ m_progressDialog->SetTotal(query.size());
++ QCoreApplication::processEvents();
+ }
+ else
+ {
+@@ -324,40 +330,50 @@ bool ImportIconsWizard::initialLoad(QString name)
+ while(query.next())
+ {
+ CSVEntry entry;
++ QString relativeIconPath = query.value(11).toString();
++ QString absoluteIconPath = QString("%1%2").arg(m_strChannelDir)
++ .arg(relativeIconPath);
+
+- if (m_fRefresh)
++ if (m_fRefresh && !relativeIconPath.isEmpty() &&
++ QFile(absoluteIconPath).exists() &&
++ !QImage(absoluteIconPath).isNull())
++ {
++ LOG(VB_GENERAL, LOG_NOTICE, QString("Icon already exists, skipping (%1)").arg(absoluteIconPath));
++ }
++ else
+ {
+- if (QFile(query.value(11).toString()).exists())
+- continue;
++ entry.strChanId=query.value(0).toString();
++ entry.strName=query.value(1).toString();
++ entry.strXmlTvId=query.value(2).toString();
++ entry.strCallsign=query.value(3).toString();
++ entry.strTransportId=query.value(4).toString();
++ entry.strAtscMajorChan=query.value(5).toString();
++ entry.strAtscMinorChan=query.value(6).toString();
++ entry.strNetworkId=query.value(7).toString();
++ entry.strServiceId=query.value(8).toString();
++ entry.strIconCSV= QString("%1,%2,%3,%4,%5,%6,%7,%8,%9\n").
++ arg(escape_csv(entry.strChanId)).
++ arg(escape_csv(entry.strName)).
++ arg(escape_csv(entry.strXmlTvId)).
++ arg(escape_csv(entry.strCallsign)).
++ arg(escape_csv(entry.strTransportId)).
++ arg(escape_csv(entry.strAtscMajorChan)).
++ arg(escape_csv(entry.strAtscMinorChan)).
++ arg(escape_csv(entry.strNetworkId)).
++ arg(escape_csv(entry.strServiceId));
++ entry.strNameCSV=escape_csv(entry.strName);
++ LOG(VB_CHANNEL, LOG_INFO,
++ QString("chanid %1").arg(entry.strIconCSV));
++
++ m_listEntries.append(entry);
+ }
+
+- entry.strChanId=query.value(0).toString();
+- entry.strName=query.value(1).toString();
+- entry.strXmlTvId=query.value(2).toString();
+- entry.strCallsign=query.value(3).toString();
+- entry.strTransportId=query.value(4).toString();
+- entry.strAtscMajorChan=query.value(5).toString();
+- entry.strAtscMinorChan=query.value(6).toString();
+- entry.strNetworkId=query.value(7).toString();
+- entry.strServiceId=query.value(8).toString();
+- entry.strIconCSV= QString("%1,%2,%3,%4,%5,%6,%7,%8,%9\n").
+- arg(escape_csv(entry.strChanId)).
+- arg(escape_csv(entry.strName)).
+- arg(escape_csv(entry.strXmlTvId)).
+- arg(escape_csv(entry.strCallsign)).
+- arg(escape_csv(entry.strTransportId)).
+- arg(escape_csv(entry.strAtscMajorChan)).
+- arg(escape_csv(entry.strAtscMinorChan)).
+- arg(escape_csv(entry.strNetworkId)).
+- arg(escape_csv(entry.strServiceId));
+- entry.strNameCSV=escape_csv(entry.strName);
+- LOG(VB_CHANNEL, LOG_INFO,
+- QString("chanid %1").arg(entry.strIconCSV));
+-
+- m_listEntries.append(entry);
+ m_nMaxCount++;
+ if (m_progressDialog)
++ {
+ m_progressDialog->SetProgress(m_nMaxCount);
++ QCoreApplication::processEvents();
++ }
+ }
+
+ if (m_progressDialog)
+@@ -377,6 +393,7 @@ bool ImportIconsWizard::initialLoad(QString name)
+ {
+ m_popupStack->AddScreen(m_progressDialog);
+ m_progressDialog->SetTotal(m_listEntries.size());
++ QCoreApplication::processEvents();
+ }
+ else
+ {
+@@ -384,16 +401,18 @@ bool ImportIconsWizard::initialLoad(QString name)
+ m_progressDialog = NULL;
+ }
+
++ QString downloadMessage = tr("Downloading %1 of %2");
++
+ while (!closeDialog && (m_iter != m_listEntries.end()))
+ {
+ /*: %1 is the current channel position,
+ * %2 is the total number of channels,
+ * %3 is the channel name
+ */
+- QString message = tr("Downloading %1 / %2 : %3")
+- .arg(m_nCount+1)
+- .arg(m_listEntries.size())
+- .arg((*m_iter).strName);
++ QString message = downloadMessage.arg(m_nCount+1)
++ .arg(m_listEntries.size());
++
++ LOG(VB_GENERAL, LOG_NOTICE, message);
+
+ if (m_missingEntries.size() > 0)
+ {
+@@ -414,6 +433,7 @@ bool ImportIconsWizard::initialLoad(QString name)
+ {
+ m_progressDialog->SetMessage(message);
+ m_progressDialog->SetProgress(m_nCount);
++ QCoreApplication::processEvents();
+ }
+ }
+
+@@ -543,11 +563,10 @@ bool ImportIconsWizard::checkAndDownload(const QString& url, const QString& loca
+ QString filename = url.section('/', -1);
+ QFileInfo file(m_strChannelDir+filename);
+
+- bool fRet;
+- if (!file.exists())
+- fRet = GetMythDownloadManager()->download(iconUrl, file.absoluteFilePath());
+- else
+- fRet = true;
++ // If we get to this point we've already checked whether the icon already
++ // exist locally, we want to download anyway to fix a broken image or
++ // get the latest version of the icon
++ bool fRet = GetMythDownloadManager()->download(iconUrl, file.absoluteFilePath());
+
+ if (fRet)
+ {
+@@ -564,7 +583,6 @@ bool ImportIconsWizard::checkAndDownload(const QString& url, const QString& loca
+ MythDB::DBError("Error inserting channel icon", query);
+ return false;
+ }
+-
+ }
+
+ return fRet;
+@@ -633,13 +651,14 @@ bool ImportIconsWizard::search(const QString& strParam)
+ // HACK HACK HACK -- begin
+ // This is needed since the user can't escape out of the progress dialog
+ // and the result set may contain thousands of channels.
+- if (strSplit.size() > 36*3)
++ if (strSplit.size() > 150)
+ {
+ LOG(VB_GENERAL, LOG_WARNING,
+ QString("Warning: Result set contains %1 items, "
+ "truncating to the first %2 results")
+- .arg(strSplit.size()).arg(18*3));
+- while (strSplit.size() > 18*3) strSplit.removeLast();
++ .arg(strSplit.size()).arg(150));
++ while (strSplit.size() > 150)
++ strSplit.removeLast();
+ }
+ // HACK HACK HACK -- end
+
+diff --git a/mythtv/programs/mythtv-setup/importicons.h b/mythtv/programs/mythtv-setup/importicons.h
+index 33b9145..56f2d38 100644
+--- a/mythtv/programs/mythtv-setup/importicons.h
++++ b/mythtv/programs/mythtv-setup/importicons.h
+@@ -35,6 +35,7 @@ class ImportIconsWizard : public MythScreenType
+ ~ImportIconsWizard();
+
+ bool Create(void);
++ void Load(void);
+ // bool keyPressEvent(QKeyEvent *);
+ void customEvent(QEvent *event);
+
diff --git a/mythtv/programs/mythutil/commandlineparser.cpp b/mythtv/programs/mythutil/commandlineparser.cpp
index 141235d..902314d 100644
--- a/mythtv/programs/mythutil/commandlineparser.cpp
@@ -60404,6 +61840,137 @@
if (!cmdline.toBool("chanid"))
{
LOG(VB_GENERAL, LOG_ERR, "No chanid specified");
+diff --git a/mythtv/programs/mythwelcome/welcomedialog.cpp b/mythtv/programs/mythwelcome/welcomedialog.cpp
+index e152fb7..5b88219 100644
+--- a/mythtv/programs/mythwelcome/welcomedialog.cpp
++++ b/mythtv/programs/mythwelcome/welcomedialog.cpp
+@@ -129,7 +129,7 @@ void WelcomeDialog::checkAutoStart(void)
+ // 1 for manual startup
+ QString command = m_installDir + "/bin/mythshutdown --startup";
+ command += logPropagateArgs;
+- uint state = myth_system(command);
++ uint state = myth_system(command, kMSDontBlockInputDevs);
+
+ LOG(VB_GENERAL, LOG_NOTICE,
+ QString("mythshutdown --startup returned: %1").arg(state));
+@@ -212,7 +212,7 @@ void WelcomeDialog::customEvent(QEvent *e)
+ "MythWelcome is shutting this computer down now");
+ QString poweroff_cmd = gCoreContext->GetSetting("MythShutdownPowerOff", "");
+ if (!poweroff_cmd.isEmpty())
+- myth_system(poweroff_cmd);
++ myth_system(poweroff_cmd, kMSDontBlockInputDevs);
+ }
+ }
+ }
+@@ -274,16 +274,16 @@ bool WelcomeDialog::keyPressEvent(QKeyEvent *event)
+ m_installDir + "/bin/mythshutdown --lock";
+
+ uint statusCode;
+- statusCode = myth_system(mythshutdown_status + logPropagateArgs);
++ statusCode = myth_system(mythshutdown_status + logPropagateArgs, kMSDontBlockInputDevs);
+
+ // is shutdown locked by a user
+ if (!(statusCode & 0xFF00) && statusCode & 16)
+ {
+- myth_system(mythshutdown_unlock + logPropagateArgs);
++ myth_system(mythshutdown_unlock + logPropagateArgs, kMSDontBlockInputDevs);
+ }
+ else
+ {
+- myth_system(mythshutdown_lock + logPropagateArgs);
++ myth_system(mythshutdown_lock + logPropagateArgs, kMSDontBlockInputDevs);
+ }
+
+ updateStatusMessage();
+@@ -293,7 +293,7 @@ bool WelcomeDialog::keyPressEvent(QKeyEvent *event)
+ {
+ QString cmd = gCoreContext->GetSetting("MythShutdownXTermCmd", "");
+ if (!cmd.isEmpty())
+- myth_system(cmd);
++ myth_system(cmd, kMSDontBlockInputDevs);
+ }
+ else if (action == "STARTSETUP")
+ {
+@@ -455,7 +455,7 @@ void WelcomeDialog::runMythFillDatabase()
+ LOG(VB_GENERAL, LOG_INFO, QString("Grabbing EPG data using command: %1\n")
+ .arg(command));
+
+- myth_system(command);
++ myth_system(command, kMSDontBlockInputDevs);
+ }
+
+ void WelcomeDialog::updateAll(void)
+@@ -531,7 +531,7 @@ void WelcomeDialog::updateStatusMessage(void)
+ }
+
+ QString mythshutdown_status = m_installDir + "/bin/mythshutdown --status 0";
+- uint statusCode = myth_system(mythshutdown_status + logPropagateArgs);
++ uint statusCode = myth_system(mythshutdown_status + logPropagateArgs, kMSDontBlockInputDevs);
+
+ if (!(statusCode & 0xFF00))
+ {
+@@ -602,7 +602,7 @@ void WelcomeDialog::showMenu(void)
+ m_menuPopup->SetReturnEvent(this, "action");
+
+ QString mythshutdown_status = m_installDir + "/bin/mythshutdown --status 0";
+- uint statusCode = myth_system(mythshutdown_status + logPropagateArgs);
++ uint statusCode = myth_system(mythshutdown_status + logPropagateArgs, kMSDontBlockInputDevs);
+
+ if (!(statusCode & 0xFF00) && statusCode & 16)
+ m_menuPopup->AddButton(tr("Unlock Shutdown"), SLOT(unlockShutdown()));
+@@ -619,7 +619,7 @@ void WelcomeDialog::lockShutdown(void)
+ {
+ QString command = m_installDir + "/bin/mythshutdown --lock";
+ command += logPropagateArgs;
+- myth_system(command);
++ myth_system(command, kMSDontBlockInputDevs);
+ updateStatusMessage();
+ updateScreen();
+ }
+@@ -628,7 +628,7 @@ void WelcomeDialog::unlockShutdown(void)
+ {
+ QString command = m_installDir + "/bin/mythshutdown --unlock";
+ command += logPropagateArgs;
+- myth_system(command);
++ myth_system(command, kMSDontBlockInputDevs);
+ updateStatusMessage();
+ updateScreen();
+ }
+@@ -650,7 +650,7 @@ void WelcomeDialog::shutdownNow(void)
+ "MythWelcome is shutting this computer down now");
+ QString poweroff_cmd = gCoreContext->GetSetting("MythShutdownPowerOff", "");
+ if (!poweroff_cmd.isEmpty())
+- myth_system(poweroff_cmd);
++ myth_system(poweroff_cmd, kMSDontBlockInputDevs);
+ return;
+ }
+
+@@ -676,7 +676,7 @@ void WelcomeDialog::shutdownNow(void)
+ QString command = m_installDir + "/bin/mythshutdown --status 0";
+ command += logPropagateArgs;
+
+- uint statusCode = myth_system(command);
++ uint statusCode = myth_system(command, kMSDontBlockInputDevs);
+ if (!(statusCode & 0xFF00) && statusCode & 128)
+ {
+ ShowOkPopup(tr("Cannot shutdown because MythTV is about to start "
+@@ -712,7 +712,7 @@ void WelcomeDialog::shutdownNow(void)
+
+ if (!setwakeup_cmd.isEmpty())
+ {
+- myth_system(setwakeup_cmd);
++ myth_system(setwakeup_cmd, kMSDontBlockInputDevs);
+ }
+ }
+
+@@ -720,6 +720,6 @@ void WelcomeDialog::shutdownNow(void)
+ command = "sudo " + m_installDir + "/bin/mythshutdown --shutdown";
+ command += logPropagateArgs;
+
+- myth_system(command);
++ myth_system(command, kMSDontBlockInputDevs);
+ }
+
diff --git a/mythtv/programs/scripts/metadata/Movie/tmdb.py b/mythtv/programs/scripts/metadata/Movie/tmdb.py
deleted file mode 100755
index 9ad4fbc..0000000
Index: mythtv.spec
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-18/mythtv.spec,v
retrieving revision 1.114
retrieving revision 1.115
diff -u -r1.114 -r1.115
--- mythtv.spec 2 Dec 2013 19:15:54 -0000 1.114
+++ mythtv.spec 7 Jan 2014 20:05:46 -0000 1.115
@@ -60,7 +60,7 @@
%define desktop_vendor RPMFusion
# MythTV Version string -- preferably the output from git --describe
-%define vers_string v0.27-109-gcb744f8
+%define vers_string v0.27-130-gfac84fa
%define branch fixes/0.27
# Git revision and branch ID
@@ -79,7 +79,7 @@
%if "%{branch}" == "master"
Release: 0.1.git.%{_gitrev}%{?dist}
%else
-Release: 3%{?dist}
+Release: 4%{?dist}
%endif
# The primary license is GPLv2+, but bits are borrowed from a number of
@@ -223,7 +223,7 @@
BuildRequires: libdca-devel
BuildRequires: libdvdnav-devel
BuildRequires: libdvdread-devel >= 0.9.4
-BuildRequires: libcdio-devel
+BuildRequires: libcdio-devel libcdio-paranoia-devel
# nb: libdvdcss will be dynamically loaded if installed
#BuildRequires: libfame-devel >= 0.9.0
BuildRequires: libogg-devel
@@ -1471,6 +1471,10 @@
%changelog
+* Mon Jan 6 2014 Richard Shaw <hobbes1069(a)gmail.com> - 0.27-4
+- Update to latest fixes v0.27-130-gfac84fa.
+- Add libcdio-paranoia to build requirements for CD audio.
+
* Mon Dec 2 2013 Richard Shaw <hobbes1069(a)gmail.com> - 0.27-3
- Update to latest fixes, v0.27-109-gcb744f8.
- Disable mythlogserver as it is only really useful for developers.
10 years, 11 months
rpms/mythtv/F-20 ChangeLog, 1.13, 1.14 mythbackend.service, 1.8, 1.9 mythtv-0.27-fixes.patch, 1.2, 1.3 mythtv.spec, 1.134, 1.135
by Richard Shaw
Author: hobbes1069
Update of /cvs/free/rpms/mythtv/F-20
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv15277
Modified Files:
ChangeLog mythbackend.service mythtv-0.27-fixes.patch
mythtv.spec
Log Message:
* Mon Jan 6 2014 Richard Shaw <hobbes1069(a)gmail.com> - 0.27-4
- Update to latest fixes v0.27-130-gfac84fa.
- Add libcdio-paranoia to build requirements for CD audio.
Index: ChangeLog
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-20/ChangeLog,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- ChangeLog 2 Dec 2013 16:46:03 -0000 1.13
+++ ChangeLog 7 Jan 2014 20:01:40 -0000 1.14
@@ -1,3 +1,191 @@
+commit fac84fab9c8c6e43f51d3090e13e05e68db0ef6e
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Sat Jan 4 10:12:23 2014 +0000
+
+ MythMusic: avoid storing a pointer to the current playlist in the music player
+
+ Always get the current playlist from MusicData to avoid possibly referencing a
+ stale pointer. This can occur while doing a rescan.
+
+ Also add NULL checks everywhere just in case.
+
+ Refs #11906.
+
+ (cherry picked from commit 193dc636e5fa5ac5edd3589094a58e79a6ab779b)
+
+commit bd74a288f3a9fc8911c9507b27f8fe540bde54f4
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Fri Jan 3 18:11:45 2014 +0000
+
+ MythMusic: make sure we null check the returned tagger after 47217ca10a
+
+ Also make sure the tagger is deleted after use.
+
+ (cherry picked from commit b383c329417a4e4b0b786e51e0d24962728a738b)
+
+commit 70cc07f2d99dd4a2439e249a799c45ec54510991
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Fri Jan 3 18:21:07 2014 +0000
+
+ Bump the ABI version after f359a4ebd3c
+
+commit f359a4ebd3c8a8fff18cdf21813c9d12da8c6c4e
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Fri Jan 3 17:38:39 2014 +0000
+
+ MetaIO: validate the files extension before creating a tagger
+
+ This checks the file extension is one we know how to handle before
+ creating the tagger. Return NULL if not valid.
+
+ This fixes a bug with the music file scanner trying to add files with an
+ unknown file extension.
+
+ NOTE: bumps the ABI version so compile and install myth core before compiling
+ the plugins
+
+ (cherry picked from commit 47217ca10adae1e03a37b396d64b605c8f18e6b0)
+
+commit f984e29cc92a9bc88f2d2e4b72a6f822380efa64
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Fri Jan 3 15:56:47 2014 +0000
+
+ MetaIOAVFComment: don't call av_estimate_timings() in getTrackLength()
+
+ It's not needed with current ffmpeg and was causing a segfault while scanning
+ for music files.
+
+ (cherry picked from commit c2128934644892df613590dda7e6017b72c14f94)
+
+commit 7f548de029ed84870538c87193b8b9f650cf0c5a
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Mon Dec 30 11:28:50 2013 +0000
+
+ MythMusic: fix playback of some radio stations
+
+ Make sure the maximum size of the QTCPSocket read buffer is set appropriately.
+
+ This seems to throttle the sending of readyRead() signals sent to us from
+ QTCPSocket better otherwise once we fill our buffer and don't read anything in the
+ readyRead() slot the QTCPSocket will eventually not send any more signals causing
+ us to run out of data.
+
+ Fixes #11872.
+
+ (cherry picked from commit 6ddaba216d8f6a7e178d4acfe6930458fb532d05)
+
+commit d96506156c2b200d3c6658e578d7b7fbd4014bad
+Author: Jim Stichnoth <jstichnoth(a)mythtv.org>
+Date: Sat Dec 21 21:59:46 2013 -0800
+
+ Update binary version after 525ac31dd2215e5ce46fc3b70f7ba883d99b736a.
+
+commit 525ac31dd2215e5ce46fc3b70f7ba883d99b736a
+Author: Jim Stichnoth <jstichnoth(a)mythtv.org>
+Date: Sat Dec 21 21:14:49 2013 -0800
+
+ Be less aggressive about clearing the bookmark on exit.
+
+ Refs #7994. We shouldn't automatically clear the bookmark at the end
+ of the recording if the "Clear bookmark on playback" setting is false.
+ (cherry picked from commit 670cb2d55c36f57ca056babccef1d99ae4c4bad0)
+
+ Conflicts:
+
+ mythtv/libs/libmythtv/tv_play.cpp
+
+commit 9d4b5e2313ea0b1eb7718264782f529bd88c555d
+Author: Karl Dietz <dekarl(a)mythtv.org>
+Date: Thu Aug 29 23:00:14 2013 +0200
+
+ extend IPTV hack to handle PAT with two entries but only one program
+
+ Fixes #11791
+
+ (cherry picked from commit 3bd3c71551a938eec2bb50feb48501136704392d)
+
+commit 39171be37ab8d63f0f44e5dbd5a78ca6893ceafa
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Sun Dec 15 21:47:04 2013 +0000
+
+ Icon Downloader: Check that the existing icon is actually a valid image.
+
+commit 65c0eb2c4ab660fcabb5b491dac8e88b6dd10d9e
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Sun Dec 15 20:54:57 2013 +0000
+
+ Metadata Lookup: We want to use the first (best) result, not the last.
+
+commit 5dc9d15856ab6cc7a1f39c191a2bd577a26e4fc8
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Sun Dec 15 13:53:44 2013 +0000
+
+ Fix display for progress dialog in Icon Importer
+ (cherry picked from commit 243420f6c1e043530fbe919ec85ae9f41af56323)
+
+commit 8f7c8aa6581e7afacd7e71a3566430e2119ce0b7
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Sun Dec 15 13:34:32 2013 +0000
+
+ Make the check for an existing icon more robust.
+ (cherry picked from commit 8b1d8159331e85569d78f5637df49366e5198f40)
+
+commit fa5599d185014db32dd9a34582d090cb5c7121c9
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Fri Dec 13 15:03:50 2013 +0000
+
+ Icon Downloader: Fix 'Re-scan for missing' to check the Channel Icon storage group
+ (cherry picked from commit 19f6b618045e9ac9bb7657e90f915e09dc63ba14)
+
+commit 866d1fe713116c7ff665157784b3ca7ae2c9d9b4
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Wed Dec 11 09:31:34 2013 +0000
+
+ Fix segfault in Schedule Editor. Not all recording rules are associated with a program and this pointer therefore needs to be checked first
+
+commit f7852552a089a87d7dd53b5da59958205fbae6fd
+Author: Richard Hulme <peper03(a)mythtv.org>
+Date: Thu Dec 5 00:06:42 2013 +0100
+
+ Fix python bindings to store updates to video markup data.
+ (cherry picked from commit 13ae25f5c86bd29a4e854cd5d438436f26d7345e)
+
+commit 26052f483996e28d87e77f5e879eded1e7c727a4
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Wed Dec 4 19:04:05 2013 +0000
+
+ Use category type as a hint in the Schedule Editor Metadata/Artwork searches
+
+commit 15199917e881861add0ab5a21862dd599da45c75
+Author: Stuart Morgan <smorgan(a)mythtv.org>
+Date: Wed Dec 4 18:19:49 2013 +0000
+
+ Fix ordering of Artwork in selection dialogs. Best matches should now appear first, not last.
+ (cherry picked from commit d95a237d6cf7e79b4b5f807600fd635f37337e2f)
+
+commit ba15be9a30d6ce02c3bc6c8b330dbde8373f008a
+Author: Jim Stichnoth <jstichnoth(a)mythtv.org>
+Date: Sun Sep 15 06:25:13 2013 -0700
+
+ Reduce logging level for GetKeyframePositions and GetKeyframeDurations.
+ (cherry picked from commit 3c90e595d998e563c7a97a39f9541c157762755e)
+
+commit aea561a518cfa1b638341ab4f42db92fcd379b75
+Author: Richard Hulme <peper03(a)mythtv.org>
+Date: Mon Dec 2 22:29:20 2013 +0100
+
+ Prevent MythWelcome blocking input devices when calling mythshutdown to avoid resetting the idle timer (see [cac1413]) when trying to determine whether the backend is idle, thereby preventing shutdown.
+ (cherry picked from commit 1431eecd20c020b9c0ad826993015bc8957e82d6)
+
+commit 339d1ceb1733c0f36182260d0b1a691b0d05cbb3
+Author: Richard Hulme <peper03(a)mythtv.org>
+Date: Mon Dec 2 22:27:25 2013 +0100
+
+ Only jump back in a menu to the nearest previous block with subpictures if a seek operation is already in progress.
+
+ This should prevent infinite loops on some discs (e.g. Independence Day) where the menu highlight packets are somehow not processed before the navigation data indicates that buttons must be shown.
+ (cherry picked from commit e37383db1f55ad21f200903c18f9750753e05f00)
+
commit cb744f810c6133aa293ad95d65225890371951f0
Author: Raymond Wagner <rwagner(a)mythtv.org>
Date: Fri Nov 29 14:35:54 2013 -0500
mythtv-0.27-fixes.patch:
0 files changed
10 years, 11 months
rpms/lpf-flash-plugin/devel .cvsignore, NONE, 1.1 Makefile, NONE, 1.1 sources, NONE, 1.1
by Nicolas Chauvet
Author: kwizart
Update of /cvs/nonfree/rpms/lpf-flash-plugin/devel
In directory old02.ovh.rpmfusion.lan:/home/rpmfusion/kwizart/nonfree/owners/tmpcvsI11089/rpms/lpf-flash-plugin/devel
Added Files:
.cvsignore Makefile sources
Log Message:
Setup of module lpf-flash-plugin
--- NEW FILE .cvsignore ---
--- NEW FILE Makefile ---
# Makefile for source rpm: lpf-flash-plugin
# $Id: Makefile,v 1.1 2014/01/07 17:00:29 kwizart Exp $
NAME := lpf-flash-plugin
SPECFILE = $(firstword $(wildcard *.spec))
define find-makefile-common
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
endef
MAKEFILE_COMMON := $(shell $(find-makefile-common))
ifeq ($(MAKEFILE_COMMON),)
# attept a checkout
define checkout-makefile-common
test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
endef
MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
endif
include $(MAKEFILE_COMMON)
--- NEW FILE sources ---
10 years, 11 months
rpms/lpf-flash-plugin Makefile, NONE, 1.1 import.log, NONE, 1.1 pkg.acl, NONE, 1.1
by Nicolas Chauvet
Author: kwizart
Update of /cvs/nonfree/rpms/lpf-flash-plugin
In directory old02.ovh.rpmfusion.lan:/home/rpmfusion/kwizart/nonfree/owners/tmpcvsI11089/rpms/lpf-flash-plugin
Added Files:
Makefile import.log pkg.acl
Log Message:
Setup of module lpf-flash-plugin
--- NEW FILE Makefile ---
# Top level Makefile for module lpf-flash-plugin
all : CVS/Root common-update
@cvs update
common-update : common
@cd common && cvs update
common : CVS/Root
@cvs checkout common
CVS/Root :
@echo "ERROR: This does not look like a CVS checkout" && exit 1
clean :
@find . -type f -name *~ -exec rm -fv {} \;
--- NEW FILE import.log ---
--- NEW FILE pkg.acl ---
10 years, 11 months
rpms/lpf-flash-plugin/devel - New directory
by Nicolas Chauvet
Author: kwizart
Update of /cvs/nonfree/rpms/lpf-flash-plugin/devel
In directory old02.ovh.rpmfusion.lan:/home/rpmfusion/kwizart/nonfree/owners/tmpcvsI11089/rpms/lpf-flash-plugin/devel
Log Message:
Directory /cvs/nonfree/rpms/lpf-flash-plugin/devel added to the repository
10 years, 11 months
rpms/lpf-flash-plugin - New directory
by Nicolas Chauvet
Author: kwizart
Update of /cvs/nonfree/rpms/lpf-flash-plugin
In directory old02.ovh.rpmfusion.lan:/home/rpmfusion/kwizart/nonfree/owners/tmpcvsI11089/rpms/lpf-flash-plugin
Log Message:
Directory /cvs/nonfree/rpms/lpf-flash-plugin added to the repository
10 years, 11 months