Fixed a deadlock in the SVDRP command PLAY in case there is currently a recording being replayed

This commit is contained in:
Klaus Schmidinger 2017-04-04 11:05:38 +02:00
parent 7170c20c7e
commit 63a32ce483
2 changed files with 33 additions and 22 deletions

View File

@ -8961,3 +8961,5 @@ Video Disk Recorder Revision History
Thanks to Sergey Chernyavskiy.
- Changed 'number' to 'id' in the help texts of SVDRP commands that deal with
timers.
- Fixed a deadlock in the SVDRP command PLAY in case there is currently a
recording being replayed.

53
svdrp.c
View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
* $Id: svdrp.c 4.14 2017/04/04 09:39:36 kls Exp $
* $Id: svdrp.c 4.15 2017/04/04 11:01:10 kls Exp $
*/
#include "svdrp.h"
@ -2057,29 +2057,38 @@ void cSVDRPServer::CmdPLAY(const char *Option)
char c = *option;
*option = 0;
if (isnumber(num)) {
LOCK_RECORDINGS_READ;
if (const cRecording *Recording = Recordings->GetById(strtol(num, NULL, 10))) {
if (c)
option = skipspace(++option);
cReplayControl::SetRecording(NULL);
cControl::Shutdown();
if (*option) {
int pos = 0;
if (strcasecmp(option, "BEGIN") != 0)
pos = HMSFToIndex(option, Recording->FramesPerSecond());
cResumeFile Resume(Recording->FileName(), Recording->IsPesRecording());
if (pos <= 0)
Resume.Delete();
else
Resume.Save(pos);
cStateKey StateKey;
if (const cRecordings *Recordings = cRecordings::GetRecordingsRead(StateKey)) {
if (const cRecording *Recording = Recordings->GetById(strtol(num, NULL, 10))) {
cString FileName = Recording->FileName();
cString Title = Recording->Title();
int FramesPerSecond = Recording->FramesPerSecond();
bool IsPesRecording = Recording->IsPesRecording();
StateKey.Remove(); // must give up the lock for the call to cControl::Shutdown()
if (c)
option = skipspace(++option);
cReplayControl::SetRecording(NULL);
cControl::Shutdown();
if (*option) {
int pos = 0;
if (strcasecmp(option, "BEGIN") != 0)
pos = HMSFToIndex(option, FramesPerSecond);
cResumeFile Resume(FileName, IsPesRecording);
if (pos <= 0)
Resume.Delete();
else
Resume.Save(pos);
}
cReplayControl::SetRecording(FileName);
cControl::Launch(new cReplayControl);
cControl::Attach();
Reply(250, "Playing recording \"%s\" [%s]", num, *Title);
}
else {
StateKey.Remove();
Reply(550, "Recording \"%s\" not found", num);
}
cReplayControl::SetRecording(Recording->FileName());
cControl::Launch(new cReplayControl);
cControl::Attach();
Reply(250, "Playing recording \"%s\" [%s]", num, Recording->Title());
}
else
Reply(550, "Recording \"%s\" not found", num);
}
else
Reply(501, "Error in recording number \"%s\"", num);