mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Implemented displaying audio channel
This commit is contained in:
parent
f79f81dfd4
commit
264fa085bd
5
HISTORY
5
HISTORY
@ -3262,7 +3262,8 @@ Video Disk Recorder Revision History
|
||||
- The format of the 'epg.data' files has been extended by the new tag 'X', which
|
||||
contains the stream components of an event (see man vdr(5) for details).
|
||||
- The cStatus class now has the new member function SetAudioTrack(), which can be
|
||||
used to get notified when the audio track has been switched.
|
||||
used to get notified when the audio track has been switched, and the new member
|
||||
function SetAudioChannel() which is called when the audio channel is changed.
|
||||
- Skins need to implement the new cSkinDisplayTrack class to display the audio
|
||||
track menu.
|
||||
- The ST:TNG skin now displays the current audio track description (if any) at the
|
||||
@ -3273,8 +3274,6 @@ Video Disk Recorder Revision History
|
||||
- The "Left" and "Right" keys in the "Audio" menu can be used to switch between
|
||||
the left and right stereo channels in case there are different audio tracks
|
||||
in these channels (see MANUAL for details).
|
||||
Currently there is no visual indicator of the audio channel, yet, and it
|
||||
doesn't work with the selected audio languages.
|
||||
- Fixed a possible race condition in cDevice::Action() (thanks to Mattias Grönlund).
|
||||
- Fixed the default quality value when grabbing a JPEG image (thanks to Patrick
|
||||
Gleichmann).
|
||||
|
4
MANUAL
4
MANUAL
@ -200,7 +200,7 @@ Version 1.2
|
||||
|
||||
The "Left" and "Right" keys can be used to switch between "mono left", "stereo"
|
||||
and "mono right" for channels that broadcast different audio tracks in the
|
||||
left and right stereo channels (as was often done in the old analog days).
|
||||
left and right stereo channels.
|
||||
|
||||
The "Ok" key explicitly switches to the selected track (in case the device
|
||||
for some reason doesn't play it) and closes the "Audio" menu.
|
||||
@ -211,7 +211,7 @@ Version 1.2
|
||||
Once a Dolby Digital track has been selected on any channel, further channel
|
||||
switches will first search for a Dolby Digital track of one of the preferred
|
||||
audio languages. If no such track can be found, a normal audio track will
|
||||
be selected. Note that this only works is the broadcasters use actual language
|
||||
be selected. Note that this only works if the broadcasters use actual language
|
||||
codes in their PID data, not things like "dd" or "2ch".
|
||||
|
||||
* Switching through channel groups
|
||||
|
10
PLUGINS.html
10
PLUGINS.html
@ -1493,13 +1493,15 @@ repectively.
|
||||
<b>Audio selection</b>
|
||||
<p>
|
||||
If the device can provide more than a single audio track, it can implement the
|
||||
following functions to make them available:
|
||||
following function to make them available:
|
||||
|
||||
<!--X1.3.18--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre>
|
||||
virtual int NumAudioTracksDevice(void) const;
|
||||
virtual const char **GetAudioTracksDevice(int *CurrentTrack = NULL) const;
|
||||
virtual void SetAudioTrackDevice(int Index);
|
||||
virtual void SetAudioTrackDevice(eTrackType Type);
|
||||
virtual int GetAudioChannelDevice(void);
|
||||
virtual void SetAudioChannelDevice(int AudioChannel);
|
||||
</pre></td></tr></table><p>
|
||||
<!--X1.3.18--></td></tr></table>
|
||||
|
||||
<p>
|
||||
<b>Recording</b>
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: skincurses.c 1.4 2005/01/02 15:11:29 kls Exp $
|
||||
* $Id: skincurses.c 1.5 2005/01/09 11:56:26 kls Exp $
|
||||
*/
|
||||
|
||||
#include <ncurses.h>
|
||||
@ -570,6 +570,7 @@ public:
|
||||
cSkinCursesDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
|
||||
virtual ~cSkinCursesDisplayTracks();
|
||||
virtual void SetTrack(int Index, const char * const *Tracks);
|
||||
virtual void SetAudioChannel(int AudioChannel) {}
|
||||
virtual void Flush(void);
|
||||
};
|
||||
|
||||
|
26
menu.c
26
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 1.331 2005/01/08 10:46:44 kls Exp $
|
||||
* $Id: menu.c 1.332 2005/01/09 11:55:12 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -2857,6 +2857,7 @@ cDisplayTracks::cDisplayTracks(void)
|
||||
SetTrackDescriptions();
|
||||
currentDisplayTracks = this;
|
||||
numTracks = track = 0;
|
||||
audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
|
||||
eTrackType CurrentAudioTrack = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
for (int i = ttAudioFirst; i <= ttDolbyLast; i++) {
|
||||
const tTrackId *TrackId = cDevice::PrimaryDevice()->GetTrack(eTrackType(i));
|
||||
@ -2884,9 +2885,12 @@ cDisplayTracks::~cDisplayTracks()
|
||||
|
||||
void cDisplayTracks::Show(void)
|
||||
{
|
||||
int ac = IS_AUDIO_TRACK(types[track]) ? audioChannel : -1;
|
||||
displayTracks->SetTrack(track, descriptions);
|
||||
displayTracks->SetAudioChannel(ac);
|
||||
displayTracks->Flush();
|
||||
cStatus::MsgSetAudioTrack(track, descriptions);
|
||||
cStatus::MsgSetAudioChannel(ac);
|
||||
}
|
||||
|
||||
cDisplayTracks *cDisplayTracks::Create(void)
|
||||
@ -2909,6 +2913,7 @@ void cDisplayTracks::Process(eKeys Key)
|
||||
eOSState cDisplayTracks::ProcessKey(eKeys Key)
|
||||
{
|
||||
int oldTrack = track;
|
||||
int oldAudioChannel = audioChannel;
|
||||
switch (Key) {
|
||||
case kUp|k_Repeat:
|
||||
case kUp:
|
||||
@ -2923,14 +2928,14 @@ eOSState cDisplayTracks::ProcessKey(eKeys Key)
|
||||
case kLeft|k_Repeat:
|
||||
case kLeft:
|
||||
case kRight|k_Repeat:
|
||||
case kRight: {
|
||||
case kRight: if (IS_AUDIO_TRACK(types[track])) {
|
||||
static int ac[] = { 1, 0, 2 };
|
||||
int AudioChannel = ac[cDevice::PrimaryDevice()->GetAudioChannel()];
|
||||
if (NORMALKEY(Key) == kLeft && AudioChannel > 0)
|
||||
AudioChannel--;
|
||||
else if (NORMALKEY(Key) == kRight && AudioChannel < 2)
|
||||
AudioChannel++;
|
||||
cDevice::PrimaryDevice()->SetAudioChannel(ac[AudioChannel]);
|
||||
audioChannel = ac[cDevice::PrimaryDevice()->GetAudioChannel()];
|
||||
if (NORMALKEY(Key) == kLeft && audioChannel > 0)
|
||||
audioChannel--;
|
||||
else if (NORMALKEY(Key) == kRight && audioChannel < 2)
|
||||
audioChannel++;
|
||||
audioChannel = ac[audioChannel];
|
||||
timeout.Set(TRACKTIMEOUT);
|
||||
}
|
||||
break;
|
||||
@ -2948,11 +2953,14 @@ eOSState cDisplayTracks::ProcessKey(eKeys Key)
|
||||
default: if ((Key & k_Release) == 0)
|
||||
return osEnd;
|
||||
}
|
||||
if (track != oldTrack) {
|
||||
if (track != oldTrack || audioChannel != oldAudioChannel)
|
||||
Show();
|
||||
if (track != oldTrack) {
|
||||
cDevice::PrimaryDevice()->SetCurrentAudioTrack(types[track]);
|
||||
Setup.CurrentDolby = IS_DOLBY_TRACK(types[track]);
|
||||
}
|
||||
if (audioChannel != oldAudioChannel)
|
||||
cDevice::PrimaryDevice()->SetAudioChannel(audioChannel);
|
||||
return timeout.TimedOut() ? osEnd : osContinue;
|
||||
}
|
||||
|
||||
|
4
menu.h
4
menu.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.h 1.67 2005/01/06 14:29:46 kls Exp $
|
||||
* $Id: menu.h 1.68 2005/01/08 15:48:57 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __MENU_H
|
||||
@ -81,7 +81,7 @@ private:
|
||||
cTimeMs timeout;
|
||||
eTrackType types[ttMaxTrackTypes];
|
||||
char *descriptions[ttMaxTrackTypes];
|
||||
int numTracks, track;
|
||||
int numTracks, track, audioChannel;
|
||||
static cDisplayTracks *currentDisplayTracks;
|
||||
virtual void Show(void);
|
||||
cDisplayTracks(void);
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skinclassic.c 1.10 2005/01/02 14:41:08 kls Exp $
|
||||
* $Id: skinclassic.c 1.11 2005/01/09 11:56:29 kls Exp $
|
||||
*/
|
||||
|
||||
#include "skinclassic.h"
|
||||
@ -516,6 +516,7 @@ public:
|
||||
cSkinClassicDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
|
||||
virtual ~cSkinClassicDisplayTracks();
|
||||
virtual void SetTrack(int Index, const char * const *Tracks);
|
||||
virtual void SetAudioChannel(int AudioChannel) {}
|
||||
virtual void Flush(void);
|
||||
};
|
||||
|
||||
|
6
skins.h
6
skins.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skins.h 1.5 2005/01/02 14:36:19 kls Exp $
|
||||
* $Id: skins.h 1.6 2005/01/09 11:49:37 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __SKINS_H
|
||||
@ -66,7 +66,6 @@ public:
|
||||
Red = Video options
|
||||
Green = Info now
|
||||
Yellow = Info next
|
||||
VideoOptions
|
||||
*/
|
||||
};
|
||||
|
||||
@ -227,6 +226,9 @@ public:
|
||||
virtual void SetTrack(int Index, const char * const *Tracks) = 0;
|
||||
///< Sets the current track to the one given by Index, which
|
||||
///< points into the Tracks array of strings.
|
||||
virtual void SetAudioChannel(int AudioChannel) = 0;
|
||||
///< Sets the audio channel indicator.
|
||||
///< 0=stereo, 1=left, 2=right, -1=don't display the audio channel indicator.
|
||||
};
|
||||
|
||||
class cSkinDisplayMessage : public cSkinDisplay {
|
||||
|
25
skinsttng.c
25
skinsttng.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skinsttng.c 1.11 2005/01/08 10:15:00 kls Exp $
|
||||
* $Id: skinsttng.c 1.12 2005/01/08 15:37:55 kls Exp $
|
||||
*/
|
||||
|
||||
// Star Trek: The Next Generation® is a registered trademark of Paramount Pictures
|
||||
@ -20,6 +20,9 @@
|
||||
#include "symbols/arrowdown.xpm"
|
||||
#include "symbols/arrowup.xpm"
|
||||
#include "symbols/audio.xpm"
|
||||
#include "symbols/audioleft.xpm"
|
||||
#include "symbols/audioright.xpm"
|
||||
#include "symbols/audiostereo.xpm"
|
||||
#include "symbols/dolbydigital.xpm"
|
||||
#include "symbols/encrypted.xpm"
|
||||
#include "symbols/ffwd.xpm"
|
||||
@ -835,14 +838,20 @@ private:
|
||||
int lineHeight;
|
||||
tColor frameColor;
|
||||
int currentIndex;
|
||||
static cBitmap bmAudioLeft, bmAudioRight, bmAudioStereo;
|
||||
void SetItem(const char *Text, int Index, bool Current);
|
||||
public:
|
||||
cSkinSTTNGDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
|
||||
virtual ~cSkinSTTNGDisplayTracks();
|
||||
virtual void SetTrack(int Index, const char * const *Tracks);
|
||||
virtual void SetAudioChannel(int AudioChannel);
|
||||
virtual void Flush(void);
|
||||
};
|
||||
|
||||
cBitmap cSkinSTTNGDisplayTracks::bmAudioLeft(audioleft_xpm);
|
||||
cBitmap cSkinSTTNGDisplayTracks::bmAudioRight(audioright_xpm);
|
||||
cBitmap cSkinSTTNGDisplayTracks::bmAudioStereo(audiostereo_xpm);
|
||||
|
||||
cSkinSTTNGDisplayTracks::cSkinSTTNGDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks)
|
||||
{
|
||||
const cFont *font = cFont::GetFont(fontOsd);
|
||||
@ -954,6 +963,20 @@ void cSkinSTTNGDisplayTracks::SetTrack(int Index, const char * const *Tracks)
|
||||
SetItem(Tracks[Index], Index, true);
|
||||
}
|
||||
|
||||
void cSkinSTTNGDisplayTracks::SetAudioChannel(int AudioChannel)
|
||||
{
|
||||
cBitmap *bm = NULL;
|
||||
switch (AudioChannel) {
|
||||
case 0: bm = &bmAudioStereo; break;
|
||||
case 1: bm = &bmAudioLeft; break;
|
||||
case 2: bm = &bmAudioRight; break;
|
||||
}
|
||||
if (bm)
|
||||
osd->DrawBitmap(x3 + 5, y6 + (y7 - y6 - bm->Height()) / 2, *bm, Theme.Color(clrChannelSymbolOn), frameColor);
|
||||
else
|
||||
osd->DrawRectangle(x3, y6, x4 - 1, y7 - 1, frameColor);
|
||||
}
|
||||
|
||||
void cSkinSTTNGDisplayTracks::Flush(void)
|
||||
{
|
||||
osd->Flush();
|
||||
|
8
status.c
8
status.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: status.c 1.6 2005/01/02 12:09:12 kls Exp $
|
||||
* $Id: status.c 1.7 2005/01/09 11:51:04 kls Exp $
|
||||
*/
|
||||
|
||||
#include "status.h"
|
||||
@ -53,6 +53,12 @@ void cStatus::MsgSetAudioTrack(int Index, const char * const *Tracks)
|
||||
sm->SetAudioTrack(Index, Tracks);
|
||||
}
|
||||
|
||||
void cStatus::MsgSetAudioChannel(int AudioChannel)
|
||||
{
|
||||
for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
|
||||
sm->SetAudioChannel(AudioChannel);
|
||||
}
|
||||
|
||||
void cStatus::MsgOsdClear(void)
|
||||
{
|
||||
for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
|
||||
|
6
status.h
6
status.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: status.h 1.7 2005/01/02 12:08:12 kls Exp $
|
||||
* $Id: status.h 1.8 2005/01/09 11:50:21 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __STATUS_H
|
||||
@ -39,6 +39,9 @@ protected:
|
||||
virtual void SetAudioTrack(int Index, const char * const *Tracks) {}
|
||||
// The audio track has been set to the one given by Index, which
|
||||
// points into the Tracks array of strings.
|
||||
virtual void SetAudioChannel(int AudioChannel) {}
|
||||
// The audio channel has been set to the given value.
|
||||
// 0=stereo, 1=left, 2=right, -1=no information available.
|
||||
virtual void OsdClear(void) {}
|
||||
// The OSD has been cleared.
|
||||
virtual void OsdTitle(const char *Title) {}
|
||||
@ -71,6 +74,7 @@ public:
|
||||
static void MsgReplaying(const cControl *Control, const char *Name);
|
||||
static void MsgSetVolume(int Volume, bool Absolute);
|
||||
static void MsgSetAudioTrack(int Index, const char * const *Tracks);
|
||||
static void MsgSetAudioChannel(int AudioChannel);
|
||||
static void MsgOsdClear(void);
|
||||
static void MsgOsdTitle(const char *Title);
|
||||
static void MsgOsdStatusMessage(const char *Message);
|
||||
|
23
symbols/audioleft.xpm
Normal file
23
symbols/audioleft.xpm
Normal file
@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static char * audioleft_xpm[] = {
|
||||
"27 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
".....++++.........++++.....",
|
||||
"...++++++++.....++++++++...",
|
||||
"...++++++++.....++....++...",
|
||||
"..++++++++++...++......++..",
|
||||
"..++++++++++...++......++..",
|
||||
"..++++++++++...++......++..",
|
||||
"..++++++++++...++......++..",
|
||||
"...++++++++.....++....++...",
|
||||
"...++++++++.....++++++++...",
|
||||
".....++++.........++++.....",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"..........................."};
|
23
symbols/audioright.xpm
Normal file
23
symbols/audioright.xpm
Normal file
@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static char * audioright_xpm[] = {
|
||||
"27 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
".....++++.........++++.....",
|
||||
"...++++++++.....++++++++...",
|
||||
"...++....++.....++++++++...",
|
||||
"..++......++...++++++++++..",
|
||||
"..++......++...++++++++++..",
|
||||
"..++......++...++++++++++..",
|
||||
"..++......++...++++++++++..",
|
||||
"...++....++.....++++++++...",
|
||||
"...++++++++.....++++++++...",
|
||||
".....++++.........++++.....",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"..........................."};
|
23
symbols/audiostereo.xpm
Normal file
23
symbols/audiostereo.xpm
Normal file
@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static char * audiostereo_xpm[] = {
|
||||
"27 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
".....++++.........++++.....",
|
||||
"...++++++++.....++++++++...",
|
||||
"...++++++++.....++++++++...",
|
||||
"..++++++++++...++++++++++..",
|
||||
"..++++++++++...++++++++++..",
|
||||
"..++++++++++...++++++++++..",
|
||||
"..++++++++++...++++++++++..",
|
||||
"...++++++++.....++++++++...",
|
||||
"...++++++++.....++++++++...",
|
||||
".....++++.........++++.....",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"...........................",
|
||||
"..........................."};
|
Loading…
Reference in New Issue
Block a user