summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--README.txt5
-rw-r--r--softhddev.c18
-rw-r--r--softhddevice.cpp62
4 files changed, 70 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index c86c451..f0bcfb7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
User johns
Date:
+ Add support for attach/detach plugin.
OSS needs bigger audio buffers.
Improved audio drift correction support.
Experimental audio drift correction support.
diff --git a/README.txt b/README.txt
index 65aeea2..dae09d8 100644
--- a/README.txt
+++ b/README.txt
@@ -224,8 +224,9 @@ Commandline:
SVDRP:
------
- Use 'svdrpsend.pl plug softhddevice HELP' to see the SVDRP commands
- help and which are supported by the plugin.
+ Use 'svdrpsend.pl plug softhddevice HELP'
+ or 'svdrpsend plug softhddevice HELP' to see the SVDRP commands help
+ and which are supported by the plugin.
Keymacros:
----------
diff --git a/softhddev.c b/softhddev.c
index 1ae550c..a9c3910 100644
--- a/softhddev.c
+++ b/softhddev.c
@@ -941,7 +941,7 @@ int PlayAudio(const uint8_t * data, int size, uint8_t id)
bits_per_sample = (((p[5] >> 6) & 0x3) + 4) * 4;
if (bits_per_sample != 16) {
Error(_
- ("softhddev: LPCM %d bits per sample aren't supported\n"),
+ ("[softhddev] LPCM %d bits per sample aren't supported\n"),
bits_per_sample);
// FIXME: handle unsupported formats.
}
@@ -951,12 +951,12 @@ int PlayAudio(const uint8_t * data, int size, uint8_t id)
AudioSetBufferTime(400);
AudioSetup(&samplerate, &channels, 0);
if (samplerate != samplerates[p[5] >> 4]) {
- Error(_("softhddev: LPCM %d sample-rate is unsupported\n"),
+ Error(_("[softhddev] LPCM %d sample-rate is unsupported\n"),
samplerates[p[5] >> 4]);
// FIXME: support resample
}
if (channels != (p[5] & 0x7) + 1) {
- Error(_("softhddev: LPCM %d channels are unsupported\n"),
+ Error(_("[softhddev] LPCM %d channels are unsupported\n"),
(p[5] & 0x7) + 1);
// FIXME: support resample
}
@@ -1079,7 +1079,7 @@ int PlayTsAudio(const uint8_t * data, int size)
if (NewAudioStream) {
// FIXME: does this clear the audio ringbuffer?
CodecAudioClose(MyAudioDecoder);
- AudioSetBufferTime(216);
+ AudioSetBufferTime(264);
AudioCodecID = CODEC_ID_NONE;
NewAudioStream = 0;
PesReset(PesDemuxAudio);
@@ -1144,7 +1144,7 @@ static void VideoPacketInit(void)
avpkt = &VideoPacketRb[i];
// build a clean ffmpeg av packet
if (av_new_packet(avpkt, VIDEO_BUFFER_SIZE)) {
- Fatal(_("[softhddev]: out of memory\n"));
+ Fatal(_("[softhddev] out of memory\n"));
}
avpkt->priv = NULL;
}
@@ -1846,11 +1846,6 @@ uint8_t *GrabImage(int *size, int jpeg, int quality, int width, int height)
*/
int SetPlayMode(int play_mode)
{
- if (ConfigStartSuspended) { // ignore first call, if start suspended
- ConfigStartSuspended = 0;
- return 1;
- }
- Resume();
VideoDisplayWakeup();
if (MyVideoDecoder) { // tell video parser we have new stream
if (VideoCodecID != CODEC_ID_NONE) {
@@ -2342,6 +2337,7 @@ void Start(void)
if (!ConfigStartSuspended) {
// FIXME: AudioInit for HDMI after X11 startup
+ // StartAudio();
AudioInit();
av_new_packet(AudioAvPkt, AUDIO_BUFFER_SIZE);
MyAudioDecoder = CodecAudioNewDecoder();
@@ -2360,6 +2356,7 @@ void Start(void)
#ifdef USE_TS_AUDIO
PesInit(PesDemuxAudio);
#endif
+ // FIXME: some good message here.
}
/**
@@ -2448,6 +2445,7 @@ void Resume(void)
StartVideo();
}
if (!MyAudioDecoder) { // audio not running
+ // StartAudio();
AudioInit();
av_new_packet(AudioAvPkt, AUDIO_BUFFER_SIZE);
MyAudioDecoder = CodecAudioNewDecoder();
diff --git a/softhddevice.cpp b/softhddevice.cpp
index a9213d5..97c252a 100644
--- a/softhddevice.cpp
+++ b/softhddevice.cpp
@@ -102,6 +102,11 @@ static char ConfigSuspendX11; ///< suspend should stop x11
static volatile char DoMakePrimary; ///< flag switch primary
+#define SUSPEND_EXTERNAL -1 ///< play external suspend mode
+#define SUSPEND_NORMAL 0 ///< normal suspend mode
+#define SUSPEND_DETACHED 1 ///< detached suspend mode
+static char SuspendMode; ///< suspend mode
+
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -673,13 +678,15 @@ cSoftHdPlayer *cSoftHdControl::Player;
*/
eOSState cSoftHdControl::ProcessKey(eKeys key)
{
- if (!ISMODELESSKEY(key) || key == kBack || key == kStop) {
+ if (SuspendMode == SUSPEND_NORMAL && (!ISMODELESSKEY(key)
+ || key == kMenu || key == kBack || key == kStop)) {
if (Player) {
delete Player;
Player = NULL;
}
Resume();
+ SuspendMode = 0;
return osEnd;
}
return osContinue;
@@ -703,7 +710,9 @@ cSoftHdControl::~cSoftHdControl()
Player = NULL;
}
- Resume();
+
+ dsyslog("[softhddev]%s: resume\n", __FUNCTION__);
+ //Resume();
}
//////////////////////////////////////////////////////////////////////////////
@@ -949,7 +958,9 @@ bool cSoftHdDevice::CanReplay(void) const
}
/**
-** Sets the device into the given play mode.
+** Sets the device into the given play mode.
+**
+** @param play_mode new play mode (Audio/Video/External...)
*/
bool cSoftHdDevice::SetPlayMode(ePlayMode play_mode)
{
@@ -974,6 +985,14 @@ bool cSoftHdDevice::SetPlayMode(ePlayMode play_mode)
break;
}
+ if (SuspendMode) {
+ if (SuspendMode != SUSPEND_EXTERNAL) {
+ return true;
+ }
+ Resume();
+ SuspendMode = 0;
+ }
+
return::SetPlayMode(play_mode);
}
@@ -1625,6 +1644,8 @@ const char **cPluginSoftHdDevice::SVDRPHelpPages(void)
static const char *text[] = {
"SUSP\n" " Suspend plugin.\n",
"RESU\n" " Resume plugin.\n",
+ "DETA\n" " Detach plugin.\n",
+ "ATTA\n" " Attach plugin.\n",
"HOTK key\n" " Execute hotkey.\n",
NULL
};
@@ -1648,12 +1669,15 @@ cString cPluginSoftHdDevice::SVDRPCommand(const char *command,
return "SoftHdDevice already suspended";
}
// should be after suspend, but SetPlayMode resumes
+ Suspend(ConfigSuspendClose, ConfigSuspendClose, ConfigSuspendX11);
cControl::Launch(new cSoftHdControl);
cControl::Attach();
- Suspend(ConfigSuspendClose, ConfigSuspendClose, ConfigSuspendX11);
return "SoftHdDevice is suspended";
}
if (!strcasecmp(command, "RESU")) {
+ if (SuspendMode != SUSPEND_NORMAL) {
+ return "can't resume SoftHdDevice";
+ }
if (ShutdownHandler.GetUserInactiveTime()) {
ShutdownHandler.SetUserInactiveTimeout();
}
@@ -1661,8 +1685,38 @@ cString cPluginSoftHdDevice::SVDRPCommand(const char *command,
cControl::Shutdown(); // not need, if not suspended
}
Resume();
+ SuspendMode = 0;
return "SoftHdDevice is resumed";
}
+ if (!strcasecmp(command, "DETA")) {
+ if (cSoftHdControl::Player) { // already suspended
+ if (SuspendMode == SUSPEND_DETACHED) {
+ return "SoftHdDevice already detached";
+ }
+ return "can't suspend SoftHdDevice already suspended";
+ }
+ Suspend(1, 1, 0);
+ cControl::Launch(new cSoftHdControl);
+ cControl::Attach();
+ return "SoftHdDevice is detached";
+ }
+ if (!strcasecmp(command, "ATTA")) {
+ if (SuspendMode) {
+ if (SuspendMode != SUSPEND_DETACHED) {
+ return "SoftHdDevice already detached";
+ }
+ return "can't attach SoftHdDevice not detached";
+ }
+ if (ShutdownHandler.GetUserInactiveTime()) {
+ ShutdownHandler.SetUserInactiveTimeout();
+ }
+ if (cSoftHdControl::Player) { // suspended
+ cControl::Shutdown(); // not need, if not suspended
+ }
+ Resume();
+ SuspendMode = 0;
+ return "SoftHdDevice is attached";
+ }
if (!strcasecmp(command, "HOTK")) {
int hotk;