1
0
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:
Klaus Schmidinger 2005-01-09 12:08:34 +01:00
parent f79f81dfd4
commit 264fa085bd
14 changed files with 145 additions and 30 deletions

View File

@ -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 - 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). 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 - 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 - Skins need to implement the new cSkinDisplayTrack class to display the audio
track menu. track menu.
- The ST:TNG skin now displays the current audio track description (if any) at the - 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" keys in the "Audio" menu can be used to switch between
the left and right stereo channels in case there are different audio tracks the left and right stereo channels in case there are different audio tracks
in these channels (see MANUAL for details). 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 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 - Fixed the default quality value when grabbing a JPEG image (thanks to Patrick
Gleichmann). Gleichmann).

4
MANUAL
View File

@ -200,7 +200,7 @@ Version 1.2
The "Left" and "Right" keys can be used to switch between "mono left", "stereo" 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 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 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. 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 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 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 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". codes in their PID data, not things like "dd" or "2ch".
* Switching through channel groups * Switching through channel groups

View File

@ -1493,13 +1493,15 @@ repectively.
<b>Audio selection</b> <b>Audio selection</b>
<p> <p>
If the device can provide more than a single audio track, it can implement the 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>&nbsp;</td><td width=100%>
<p><table><tr><td bgcolor=#F0F0F0><pre> <p><table><tr><td bgcolor=#F0F0F0><pre>
virtual int NumAudioTracksDevice(void) const; virtual void SetAudioTrackDevice(eTrackType Type);
virtual const char **GetAudioTracksDevice(int *CurrentTrack = NULL) const; virtual int GetAudioChannelDevice(void);
virtual void SetAudioTrackDevice(int Index); virtual void SetAudioChannelDevice(int AudioChannel);
</pre></td></tr></table><p> </pre></td></tr></table><p>
<!--X1.3.18--></td></tr></table>
<p> <p>
<b>Recording</b> <b>Recording</b>

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * 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> #include <ncurses.h>
@ -570,6 +570,7 @@ public:
cSkinCursesDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks); cSkinCursesDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
virtual ~cSkinCursesDisplayTracks(); virtual ~cSkinCursesDisplayTracks();
virtual void SetTrack(int Index, const char * const *Tracks); virtual void SetTrack(int Index, const char * const *Tracks);
virtual void SetAudioChannel(int AudioChannel) {}
virtual void Flush(void); virtual void Flush(void);
}; };

26
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "menu.h"
@ -2857,6 +2857,7 @@ cDisplayTracks::cDisplayTracks(void)
SetTrackDescriptions(); SetTrackDescriptions();
currentDisplayTracks = this; currentDisplayTracks = this;
numTracks = track = 0; numTracks = track = 0;
audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
eTrackType CurrentAudioTrack = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); eTrackType CurrentAudioTrack = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
for (int i = ttAudioFirst; i <= ttDolbyLast; i++) { for (int i = ttAudioFirst; i <= ttDolbyLast; i++) {
const tTrackId *TrackId = cDevice::PrimaryDevice()->GetTrack(eTrackType(i)); const tTrackId *TrackId = cDevice::PrimaryDevice()->GetTrack(eTrackType(i));
@ -2884,9 +2885,12 @@ cDisplayTracks::~cDisplayTracks()
void cDisplayTracks::Show(void) void cDisplayTracks::Show(void)
{ {
int ac = IS_AUDIO_TRACK(types[track]) ? audioChannel : -1;
displayTracks->SetTrack(track, descriptions); displayTracks->SetTrack(track, descriptions);
displayTracks->SetAudioChannel(ac);
displayTracks->Flush(); displayTracks->Flush();
cStatus::MsgSetAudioTrack(track, descriptions); cStatus::MsgSetAudioTrack(track, descriptions);
cStatus::MsgSetAudioChannel(ac);
} }
cDisplayTracks *cDisplayTracks::Create(void) cDisplayTracks *cDisplayTracks::Create(void)
@ -2909,6 +2913,7 @@ void cDisplayTracks::Process(eKeys Key)
eOSState cDisplayTracks::ProcessKey(eKeys Key) eOSState cDisplayTracks::ProcessKey(eKeys Key)
{ {
int oldTrack = track; int oldTrack = track;
int oldAudioChannel = audioChannel;
switch (Key) { switch (Key) {
case kUp|k_Repeat: case kUp|k_Repeat:
case kUp: case kUp:
@ -2923,14 +2928,14 @@ eOSState cDisplayTracks::ProcessKey(eKeys Key)
case kLeft|k_Repeat: case kLeft|k_Repeat:
case kLeft: case kLeft:
case kRight|k_Repeat: case kRight|k_Repeat:
case kRight: { case kRight: if (IS_AUDIO_TRACK(types[track])) {
static int ac[] = { 1, 0, 2 }; static int ac[] = { 1, 0, 2 };
int AudioChannel = ac[cDevice::PrimaryDevice()->GetAudioChannel()]; audioChannel = ac[cDevice::PrimaryDevice()->GetAudioChannel()];
if (NORMALKEY(Key) == kLeft && AudioChannel > 0) if (NORMALKEY(Key) == kLeft && audioChannel > 0)
AudioChannel--; audioChannel--;
else if (NORMALKEY(Key) == kRight && AudioChannel < 2) else if (NORMALKEY(Key) == kRight && audioChannel < 2)
AudioChannel++; audioChannel++;
cDevice::PrimaryDevice()->SetAudioChannel(ac[AudioChannel]); audioChannel = ac[audioChannel];
timeout.Set(TRACKTIMEOUT); timeout.Set(TRACKTIMEOUT);
} }
break; break;
@ -2948,11 +2953,14 @@ eOSState cDisplayTracks::ProcessKey(eKeys Key)
default: if ((Key & k_Release) == 0) default: if ((Key & k_Release) == 0)
return osEnd; return osEnd;
} }
if (track != oldTrack) { if (track != oldTrack || audioChannel != oldAudioChannel)
Show(); Show();
if (track != oldTrack) {
cDevice::PrimaryDevice()->SetCurrentAudioTrack(types[track]); cDevice::PrimaryDevice()->SetCurrentAudioTrack(types[track]);
Setup.CurrentDolby = IS_DOLBY_TRACK(types[track]); Setup.CurrentDolby = IS_DOLBY_TRACK(types[track]);
} }
if (audioChannel != oldAudioChannel)
cDevice::PrimaryDevice()->SetAudioChannel(audioChannel);
return timeout.TimedOut() ? osEnd : osContinue; return timeout.TimedOut() ? osEnd : osContinue;
} }

4
menu.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __MENU_H
@ -81,7 +81,7 @@ private:
cTimeMs timeout; cTimeMs timeout;
eTrackType types[ttMaxTrackTypes]; eTrackType types[ttMaxTrackTypes];
char *descriptions[ttMaxTrackTypes]; char *descriptions[ttMaxTrackTypes];
int numTracks, track; int numTracks, track, audioChannel;
static cDisplayTracks *currentDisplayTracks; static cDisplayTracks *currentDisplayTracks;
virtual void Show(void); virtual void Show(void);
cDisplayTracks(void); cDisplayTracks(void);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "skinclassic.h"
@ -516,6 +516,7 @@ public:
cSkinClassicDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks); cSkinClassicDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
virtual ~cSkinClassicDisplayTracks(); virtual ~cSkinClassicDisplayTracks();
virtual void SetTrack(int Index, const char * const *Tracks); virtual void SetTrack(int Index, const char * const *Tracks);
virtual void SetAudioChannel(int AudioChannel) {}
virtual void Flush(void); virtual void Flush(void);
}; };

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __SKINS_H
@ -66,7 +66,6 @@ public:
Red = Video options Red = Video options
Green = Info now Green = Info now
Yellow = Info next Yellow = Info next
VideoOptions
*/ */
}; };
@ -227,6 +226,9 @@ public:
virtual void SetTrack(int Index, const char * const *Tracks) = 0; virtual void SetTrack(int Index, const char * const *Tracks) = 0;
///< Sets the current track to the one given by Index, which ///< Sets the current track to the one given by Index, which
///< points into the Tracks array of strings. ///< 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 { class cSkinDisplayMessage : public cSkinDisplay {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 // Star Trek: The Next Generation® is a registered trademark of Paramount Pictures
@ -20,6 +20,9 @@
#include "symbols/arrowdown.xpm" #include "symbols/arrowdown.xpm"
#include "symbols/arrowup.xpm" #include "symbols/arrowup.xpm"
#include "symbols/audio.xpm" #include "symbols/audio.xpm"
#include "symbols/audioleft.xpm"
#include "symbols/audioright.xpm"
#include "symbols/audiostereo.xpm"
#include "symbols/dolbydigital.xpm" #include "symbols/dolbydigital.xpm"
#include "symbols/encrypted.xpm" #include "symbols/encrypted.xpm"
#include "symbols/ffwd.xpm" #include "symbols/ffwd.xpm"
@ -835,14 +838,20 @@ private:
int lineHeight; int lineHeight;
tColor frameColor; tColor frameColor;
int currentIndex; int currentIndex;
static cBitmap bmAudioLeft, bmAudioRight, bmAudioStereo;
void SetItem(const char *Text, int Index, bool Current); void SetItem(const char *Text, int Index, bool Current);
public: public:
cSkinSTTNGDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks); cSkinSTTNGDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
virtual ~cSkinSTTNGDisplayTracks(); virtual ~cSkinSTTNGDisplayTracks();
virtual void SetTrack(int Index, const char * const *Tracks); virtual void SetTrack(int Index, const char * const *Tracks);
virtual void SetAudioChannel(int AudioChannel);
virtual void Flush(void); 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) cSkinSTTNGDisplayTracks::cSkinSTTNGDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks)
{ {
const cFont *font = cFont::GetFont(fontOsd); const cFont *font = cFont::GetFont(fontOsd);
@ -954,6 +963,20 @@ void cSkinSTTNGDisplayTracks::SetTrack(int Index, const char * const *Tracks)
SetItem(Tracks[Index], Index, true); 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) void cSkinSTTNGDisplayTracks::Flush(void)
{ {
osd->Flush(); osd->Flush();

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "status.h"
@ -53,6 +53,12 @@ void cStatus::MsgSetAudioTrack(int Index, const char * const *Tracks)
sm->SetAudioTrack(Index, 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) void cStatus::MsgOsdClear(void)
{ {
for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __STATUS_H
@ -39,6 +39,9 @@ protected:
virtual void SetAudioTrack(int Index, const char * const *Tracks) {} virtual void SetAudioTrack(int Index, const char * const *Tracks) {}
// The audio track has been set to the one given by Index, which // The audio track has been set to the one given by Index, which
// points into the Tracks array of strings. // 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) {} virtual void OsdClear(void) {}
// The OSD has been cleared. // The OSD has been cleared.
virtual void OsdTitle(const char *Title) {} virtual void OsdTitle(const char *Title) {}
@ -71,6 +74,7 @@ public:
static void MsgReplaying(const cControl *Control, const char *Name); static void MsgReplaying(const cControl *Control, const char *Name);
static void MsgSetVolume(int Volume, bool Absolute); static void MsgSetVolume(int Volume, bool Absolute);
static void MsgSetAudioTrack(int Index, const char * const *Tracks); static void MsgSetAudioTrack(int Index, const char * const *Tracks);
static void MsgSetAudioChannel(int AudioChannel);
static void MsgOsdClear(void); static void MsgOsdClear(void);
static void MsgOsdTitle(const char *Title); static void MsgOsdTitle(const char *Title);
static void MsgOsdStatusMessage(const char *Message); static void MsgOsdStatusMessage(const char *Message);

23
symbols/audioleft.xpm Normal file
View File

@ -0,0 +1,23 @@
/* XPM */
static char * audioleft_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
"...........................",
"...........................",
"...........................",
"...........................",
".....++++.........++++.....",
"...++++++++.....++++++++...",
"...++++++++.....++....++...",
"..++++++++++...++......++..",
"..++++++++++...++......++..",
"..++++++++++...++......++..",
"..++++++++++...++......++..",
"...++++++++.....++....++...",
"...++++++++.....++++++++...",
".....++++.........++++.....",
"...........................",
"...........................",
"...........................",
"..........................."};

23
symbols/audioright.xpm Normal file
View File

@ -0,0 +1,23 @@
/* XPM */
static char * audioright_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
"...........................",
"...........................",
"...........................",
"...........................",
".....++++.........++++.....",
"...++++++++.....++++++++...",
"...++....++.....++++++++...",
"..++......++...++++++++++..",
"..++......++...++++++++++..",
"..++......++...++++++++++..",
"..++......++...++++++++++..",
"...++....++.....++++++++...",
"...++++++++.....++++++++...",
".....++++.........++++.....",
"...........................",
"...........................",
"...........................",
"..........................."};

23
symbols/audiostereo.xpm Normal file
View File

@ -0,0 +1,23 @@
/* XPM */
static char * audiostereo_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
"...........................",
"...........................",
"...........................",
"...........................",
".....++++.........++++.....",
"...++++++++.....++++++++...",
"...++++++++.....++++++++...",
"..++++++++++...++++++++++..",
"..++++++++++...++++++++++..",
"..++++++++++...++++++++++..",
"..++++++++++...++++++++++..",
"...++++++++.....++++++++...",
"...++++++++.....++++++++...",
".....++++.........++++.....",
"...........................",
"...........................",
"...........................",
"..........................."};