mirror of
https://github.com/mpv-player/mpv
synced 2024-10-22 08:51:57 +02:00
added OSD audio switching visualization
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@20162 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
d0947a5bb7
commit
68613bbee7
@ -207,6 +207,7 @@ static char help_text[]=
|
||||
|
||||
#define MSGTR_OSDenabled "enabled"
|
||||
#define MSGTR_OSDdisabled "disabled"
|
||||
#define MSGTR_OSDAudio "Audio: %s"
|
||||
#define MSGTR_OSDChannel "Channel: %s"
|
||||
#define MSGTR_OSDSubDelay "Sub delay: %d ms"
|
||||
#define MSGTR_OSDSpeed "Speed: x %6.2f"
|
||||
|
@ -3954,6 +3954,40 @@ demux_mkv_get_sub_lang(demuxer_t *demuxer, int track_num, char *lang,
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Get the language code for an audio track.
|
||||
|
||||
Retrieves the language code for an audio track if it is known.
|
||||
If the language code is "und" then do not copy it ("und" = "undefined").
|
||||
|
||||
\param demuxer The demuxer to work on
|
||||
\param track_num The n'th audio track to get the language from
|
||||
\param lang Store the language here
|
||||
\param maxlen The maximum number of characters to copy into lang
|
||||
*/
|
||||
void
|
||||
demux_mkv_get_audio_lang(demuxer_t *demuxer, int track_num, char *lang,
|
||||
int maxlen)
|
||||
{
|
||||
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
|
||||
mkv_track_t *track;
|
||||
int i, num;
|
||||
|
||||
num = 0;
|
||||
for (i = 0; i < mkv_d->num_tracks; i++)
|
||||
{
|
||||
track = mkv_d->tracks[i];
|
||||
if (track->type == MATROSKA_TRACK_AUDIO)
|
||||
num++;
|
||||
if (num == (track_num + 1))
|
||||
{
|
||||
if ((track->language != NULL) &&
|
||||
strcmp(track->language, "und"))
|
||||
strlcpy(lang, track->language, maxlen);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
demuxer_desc_t demuxer_desc_matroska = {
|
||||
"Matroska demuxer",
|
||||
|
@ -63,6 +63,8 @@
|
||||
|
||||
int demux_mkv_num_subs(demuxer_t *demuxer);
|
||||
int demux_mkv_change_subs(demuxer_t *demuxer, int new_num);
|
||||
void demux_mkv_get_audio_lang(demuxer_t *demuxer, int track_num, char *lang,
|
||||
int maxlen);
|
||||
void demux_mkv_get_sub_lang(demuxer_t *demuxer, int track_num, char *lang,
|
||||
int maxlen);
|
||||
|
||||
|
84
mplayer.c
84
mplayer.c
@ -192,6 +192,10 @@ static int max_framesize=0;
|
||||
#include "libmpcodecs/vf.h"
|
||||
#include "libmpcodecs/vd.h"
|
||||
|
||||
//**************************************************************************//
|
||||
|
||||
static void reinit_audio_chain(void);
|
||||
|
||||
//**************************************************************************//
|
||||
//**************************************************************************//
|
||||
|
||||
@ -1781,6 +1785,68 @@ static int mp_property_channels(m_option_t* prop,int action,void* arg) {
|
||||
return m_property_int_ro(prop,action,arg,sh_audio->channels);
|
||||
}
|
||||
|
||||
/// Selected audio id (RW)
|
||||
static int mp_property_audio(m_option_t* prop,int action,void* arg) {
|
||||
int current_id = -1;
|
||||
|
||||
if(!sh_audio) return M_PROPERTY_UNAVAILABLE;
|
||||
|
||||
switch(action) {
|
||||
case M_PROPERTY_GET:
|
||||
if(!arg) return 0;
|
||||
*(int*)arg = audio_id;
|
||||
return 1;
|
||||
case M_PROPERTY_PRINT:
|
||||
if(!arg) return 0;
|
||||
*(char**)arg = malloc(64);
|
||||
(*(char**)arg)[63] = 0;
|
||||
|
||||
if (demuxer->type == DEMUXER_TYPE_MATROSKA && audio_id >= 0) {
|
||||
char lang[40] = MSGTR_Unknown;
|
||||
demux_mkv_get_audio_lang(demuxer, audio_id, lang, 9);
|
||||
lang[39] = 0;
|
||||
snprintf(*(char**)arg, 63, "(%d) %s", audio_id, lang);
|
||||
return 1;
|
||||
}
|
||||
#ifdef USE_DVDREAD
|
||||
if (audio_id >= 0) {
|
||||
char lang[3] = "\0\0\0";
|
||||
int code = 0;
|
||||
code = dvd_lang_from_aid(stream, audio_id);
|
||||
if (code) {
|
||||
lang[0] = code >> 8;
|
||||
lang[1] = code;
|
||||
}
|
||||
snprintf(*(char**)arg, 63, "(%d) %s", audio_id, code ? lang : MSGTR_Unknown);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
snprintf(*(char**)arg, 63, MSGTR_Disabled);
|
||||
return 1;
|
||||
|
||||
case M_PROPERTY_STEP_UP:
|
||||
current_id = demuxer->audio->id;
|
||||
audio_id = demuxer_switch_audio(demuxer, -1);
|
||||
if(audio_id > -1 && demuxer->audio->id != current_id) {
|
||||
sh_audio_t *sh2;
|
||||
uninit_player(INITED_AO | INITED_ACODEC);
|
||||
sh2 = demuxer->a_streams[demuxer->audio->id];
|
||||
if(sh2) {
|
||||
sh2->ds = demuxer->audio;
|
||||
sh_audio = sh2;
|
||||
reinit_audio_chain();
|
||||
}
|
||||
}
|
||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_TRACK=%d\n", audio_id);
|
||||
|
||||
break;
|
||||
default:
|
||||
return M_PROPERTY_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
///@}
|
||||
|
||||
/// \defgroup VideoProperties Video properties
|
||||
@ -2352,6 +2418,8 @@ static m_option_t mp_properties[] = {
|
||||
0, 0, 0, NULL },
|
||||
{ "channels", mp_property_channels, CONF_TYPE_INT,
|
||||
0, 0, 0, NULL },
|
||||
{ "switch_audio", mp_property_audio, CONF_TYPE_INT,
|
||||
-1, -1, 0, NULL },
|
||||
|
||||
// Video
|
||||
{ "fullscreen", mp_property_fullscreen, CONF_TYPE_FLAG,
|
||||
@ -2471,6 +2539,7 @@ static struct {
|
||||
{ "volume", MP_CMD_VOLUME, 0, OSD_VOLUME, -1, MSGTR_Volume },
|
||||
{ "mute", MP_CMD_MUTE, 1, 0, -1, MSGTR_MuteStatus },
|
||||
{ "audio_delay", MP_CMD_AUDIO_DELAY, 0, 0, -1, MSGTR_AVDelayStatus },
|
||||
{ "switch_audio", MP_CMD_SWITCH_AUDIO, 1, 0, -1, MSGTR_OSDAudio },
|
||||
// video
|
||||
{ "fullscreen", MP_CMD_VO_FULLSCREEN, 1, 0, -1, NULL },
|
||||
{ "panscan", MP_CMD_PANSCAN, 0, OSD_PANSCAN, -1, MSGTR_Panscan },
|
||||
@ -5107,21 +5176,6 @@ if(step_sec>0) {
|
||||
pos = playing_audio_pts(sh_audio, d_audio, audio_out);
|
||||
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_TIME_POSITION=%.1f\n", pos);
|
||||
} break;
|
||||
case MP_CMD_SWITCH_AUDIO : {
|
||||
int current_id = demuxer->audio->id;
|
||||
int v = demuxer_switch_audio(demuxer, cmd->args[0].v.i);
|
||||
if(v > -1 && demuxer->audio->id != current_id) {
|
||||
sh_audio_t *sh2;
|
||||
uninit_player(INITED_AO | INITED_ACODEC);
|
||||
sh2 = demuxer->a_streams[demuxer->audio->id];
|
||||
if(sh2) {
|
||||
sh2->ds = demuxer->audio;
|
||||
sh_audio = sh2;
|
||||
reinit_audio_chain();
|
||||
}
|
||||
}
|
||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_TRACK=%d\n", v);
|
||||
} break;
|
||||
case MP_CMD_RUN : {
|
||||
#ifndef __MINGW32__
|
||||
if(!fork()) {
|
||||
|
@ -140,6 +140,19 @@ int dvd_chapter_from_cell(dvd_priv_t* dvd,int title,int cell)
|
||||
return chapter;
|
||||
}
|
||||
|
||||
int dvd_lang_from_aid(stream_t *stream, int id) {
|
||||
dvd_priv_t *d;
|
||||
if (!stream) return 0;
|
||||
d = stream->priv;
|
||||
if (!d) return 0;
|
||||
int i;
|
||||
for(i=0;i<d->nr_of_channels;i++) {
|
||||
if(d->audio_streams[i].id==id)
|
||||
return d->audio_streams[i].language;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvd_aid_from_lang(stream_t *stream, unsigned char* lang) {
|
||||
dvd_priv_t *d=stream->priv;
|
||||
int code,i;
|
||||
|
@ -45,6 +45,7 @@ typedef struct {
|
||||
} dvd_priv_t;
|
||||
|
||||
int dvd_number_of_subs(stream_t *stream);
|
||||
int dvd_lang_from_aid(stream_t *stream, int id);
|
||||
int dvd_lang_from_sid(stream_t *stream, int id);
|
||||
int dvd_aid_from_lang(stream_t *stream, unsigned char* lang);
|
||||
int dvd_sid_from_lang(stream_t *stream, unsigned char* lang);
|
||||
|
Loading…
Reference in New Issue
Block a user