mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Add support for attach/detach plugin.
This commit is contained in:
parent
b5e9077c74
commit
6a28064dce
@ -1,6 +1,7 @@
|
|||||||
User johns
|
User johns
|
||||||
Date:
|
Date:
|
||||||
|
|
||||||
|
Add support for attach/detach plugin.
|
||||||
OSS needs bigger audio buffers.
|
OSS needs bigger audio buffers.
|
||||||
Improved audio drift correction support.
|
Improved audio drift correction support.
|
||||||
Experimental audio drift correction support.
|
Experimental audio drift correction support.
|
||||||
|
@ -224,8 +224,9 @@ Commandline:
|
|||||||
SVDRP:
|
SVDRP:
|
||||||
------
|
------
|
||||||
|
|
||||||
Use 'svdrpsend.pl plug softhddevice HELP' to see the SVDRP commands
|
Use 'svdrpsend.pl plug softhddevice HELP'
|
||||||
help and which are supported by the plugin.
|
or 'svdrpsend plug softhddevice HELP' to see the SVDRP commands help
|
||||||
|
and which are supported by the plugin.
|
||||||
|
|
||||||
Keymacros:
|
Keymacros:
|
||||||
----------
|
----------
|
||||||
|
18
softhddev.c
18
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;
|
bits_per_sample = (((p[5] >> 6) & 0x3) + 4) * 4;
|
||||||
if (bits_per_sample != 16) {
|
if (bits_per_sample != 16) {
|
||||||
Error(_
|
Error(_
|
||||||
("softhddev: LPCM %d bits per sample aren't supported\n"),
|
("[softhddev] LPCM %d bits per sample aren't supported\n"),
|
||||||
bits_per_sample);
|
bits_per_sample);
|
||||||
// FIXME: handle unsupported formats.
|
// FIXME: handle unsupported formats.
|
||||||
}
|
}
|
||||||
@ -951,12 +951,12 @@ int PlayAudio(const uint8_t * data, int size, uint8_t id)
|
|||||||
AudioSetBufferTime(400);
|
AudioSetBufferTime(400);
|
||||||
AudioSetup(&samplerate, &channels, 0);
|
AudioSetup(&samplerate, &channels, 0);
|
||||||
if (samplerate != samplerates[p[5] >> 4]) {
|
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]);
|
samplerates[p[5] >> 4]);
|
||||||
// FIXME: support resample
|
// FIXME: support resample
|
||||||
}
|
}
|
||||||
if (channels != (p[5] & 0x7) + 1) {
|
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);
|
(p[5] & 0x7) + 1);
|
||||||
// FIXME: support resample
|
// FIXME: support resample
|
||||||
}
|
}
|
||||||
@ -1079,7 +1079,7 @@ int PlayTsAudio(const uint8_t * data, int size)
|
|||||||
if (NewAudioStream) {
|
if (NewAudioStream) {
|
||||||
// FIXME: does this clear the audio ringbuffer?
|
// FIXME: does this clear the audio ringbuffer?
|
||||||
CodecAudioClose(MyAudioDecoder);
|
CodecAudioClose(MyAudioDecoder);
|
||||||
AudioSetBufferTime(216);
|
AudioSetBufferTime(264);
|
||||||
AudioCodecID = CODEC_ID_NONE;
|
AudioCodecID = CODEC_ID_NONE;
|
||||||
NewAudioStream = 0;
|
NewAudioStream = 0;
|
||||||
PesReset(PesDemuxAudio);
|
PesReset(PesDemuxAudio);
|
||||||
@ -1144,7 +1144,7 @@ static void VideoPacketInit(void)
|
|||||||
avpkt = &VideoPacketRb[i];
|
avpkt = &VideoPacketRb[i];
|
||||||
// build a clean ffmpeg av packet
|
// build a clean ffmpeg av packet
|
||||||
if (av_new_packet(avpkt, VIDEO_BUFFER_SIZE)) {
|
if (av_new_packet(avpkt, VIDEO_BUFFER_SIZE)) {
|
||||||
Fatal(_("[softhddev]: out of memory\n"));
|
Fatal(_("[softhddev] out of memory\n"));
|
||||||
}
|
}
|
||||||
avpkt->priv = NULL;
|
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)
|
int SetPlayMode(int play_mode)
|
||||||
{
|
{
|
||||||
if (ConfigStartSuspended) { // ignore first call, if start suspended
|
|
||||||
ConfigStartSuspended = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
Resume();
|
|
||||||
VideoDisplayWakeup();
|
VideoDisplayWakeup();
|
||||||
if (MyVideoDecoder) { // tell video parser we have new stream
|
if (MyVideoDecoder) { // tell video parser we have new stream
|
||||||
if (VideoCodecID != CODEC_ID_NONE) {
|
if (VideoCodecID != CODEC_ID_NONE) {
|
||||||
@ -2342,6 +2337,7 @@ void Start(void)
|
|||||||
|
|
||||||
if (!ConfigStartSuspended) {
|
if (!ConfigStartSuspended) {
|
||||||
// FIXME: AudioInit for HDMI after X11 startup
|
// FIXME: AudioInit for HDMI after X11 startup
|
||||||
|
// StartAudio();
|
||||||
AudioInit();
|
AudioInit();
|
||||||
av_new_packet(AudioAvPkt, AUDIO_BUFFER_SIZE);
|
av_new_packet(AudioAvPkt, AUDIO_BUFFER_SIZE);
|
||||||
MyAudioDecoder = CodecAudioNewDecoder();
|
MyAudioDecoder = CodecAudioNewDecoder();
|
||||||
@ -2360,6 +2356,7 @@ void Start(void)
|
|||||||
#ifdef USE_TS_AUDIO
|
#ifdef USE_TS_AUDIO
|
||||||
PesInit(PesDemuxAudio);
|
PesInit(PesDemuxAudio);
|
||||||
#endif
|
#endif
|
||||||
|
// FIXME: some good message here.
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2448,6 +2445,7 @@ void Resume(void)
|
|||||||
StartVideo();
|
StartVideo();
|
||||||
}
|
}
|
||||||
if (!MyAudioDecoder) { // audio not running
|
if (!MyAudioDecoder) { // audio not running
|
||||||
|
// StartAudio();
|
||||||
AudioInit();
|
AudioInit();
|
||||||
av_new_packet(AudioAvPkt, AUDIO_BUFFER_SIZE);
|
av_new_packet(AudioAvPkt, AUDIO_BUFFER_SIZE);
|
||||||
MyAudioDecoder = CodecAudioNewDecoder();
|
MyAudioDecoder = CodecAudioNewDecoder();
|
||||||
|
@ -102,6 +102,11 @@ static char ConfigSuspendX11; ///< suspend should stop x11
|
|||||||
|
|
||||||
static volatile char DoMakePrimary; ///< flag switch primary
|
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)
|
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) {
|
if (Player) {
|
||||||
delete Player;
|
delete Player;
|
||||||
|
|
||||||
Player = NULL;
|
Player = NULL;
|
||||||
}
|
}
|
||||||
Resume();
|
Resume();
|
||||||
|
SuspendMode = 0;
|
||||||
return osEnd;
|
return osEnd;
|
||||||
}
|
}
|
||||||
return osContinue;
|
return osContinue;
|
||||||
@ -703,7 +710,9 @@ cSoftHdControl::~cSoftHdControl()
|
|||||||
|
|
||||||
Player = NULL;
|
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)
|
bool cSoftHdDevice::SetPlayMode(ePlayMode play_mode)
|
||||||
{
|
{
|
||||||
@ -974,6 +985,14 @@ bool cSoftHdDevice::SetPlayMode(ePlayMode play_mode)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (SuspendMode) {
|
||||||
|
if (SuspendMode != SUSPEND_EXTERNAL) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Resume();
|
||||||
|
SuspendMode = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return::SetPlayMode(play_mode);
|
return::SetPlayMode(play_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1625,6 +1644,8 @@ const char **cPluginSoftHdDevice::SVDRPHelpPages(void)
|
|||||||
static const char *text[] = {
|
static const char *text[] = {
|
||||||
"SUSP\n" " Suspend plugin.\n",
|
"SUSP\n" " Suspend plugin.\n",
|
||||||
"RESU\n" " Resume plugin.\n",
|
"RESU\n" " Resume plugin.\n",
|
||||||
|
"DETA\n" " Detach plugin.\n",
|
||||||
|
"ATTA\n" " Attach plugin.\n",
|
||||||
"HOTK key\n" " Execute hotkey.\n",
|
"HOTK key\n" " Execute hotkey.\n",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -1648,12 +1669,15 @@ cString cPluginSoftHdDevice::SVDRPCommand(const char *command,
|
|||||||
return "SoftHdDevice already suspended";
|
return "SoftHdDevice already suspended";
|
||||||
}
|
}
|
||||||
// should be after suspend, but SetPlayMode resumes
|
// should be after suspend, but SetPlayMode resumes
|
||||||
|
Suspend(ConfigSuspendClose, ConfigSuspendClose, ConfigSuspendX11);
|
||||||
cControl::Launch(new cSoftHdControl);
|
cControl::Launch(new cSoftHdControl);
|
||||||
cControl::Attach();
|
cControl::Attach();
|
||||||
Suspend(ConfigSuspendClose, ConfigSuspendClose, ConfigSuspendX11);
|
|
||||||
return "SoftHdDevice is suspended";
|
return "SoftHdDevice is suspended";
|
||||||
}
|
}
|
||||||
if (!strcasecmp(command, "RESU")) {
|
if (!strcasecmp(command, "RESU")) {
|
||||||
|
if (SuspendMode != SUSPEND_NORMAL) {
|
||||||
|
return "can't resume SoftHdDevice";
|
||||||
|
}
|
||||||
if (ShutdownHandler.GetUserInactiveTime()) {
|
if (ShutdownHandler.GetUserInactiveTime()) {
|
||||||
ShutdownHandler.SetUserInactiveTimeout();
|
ShutdownHandler.SetUserInactiveTimeout();
|
||||||
}
|
}
|
||||||
@ -1661,8 +1685,38 @@ cString cPluginSoftHdDevice::SVDRPCommand(const char *command,
|
|||||||
cControl::Shutdown(); // not need, if not suspended
|
cControl::Shutdown(); // not need, if not suspended
|
||||||
}
|
}
|
||||||
Resume();
|
Resume();
|
||||||
|
SuspendMode = 0;
|
||||||
return "SoftHdDevice is resumed";
|
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")) {
|
if (!strcasecmp(command, "HOTK")) {
|
||||||
int hotk;
|
int hotk;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user