diff -urN main/help/help_mp-en.h main_audioid7/help/help_mp-en.h --- main/help/help_mp-en.h 2005-12-01 00:33:45.794300064 +0100 +++ main_audioid7/help/help_mp-en.h 2005-12-01 02:19:01.172216688 +0100 @@ -207,6 +207,7 @@ #define MSGTR_OSDnone "none" #define MSGTR_OSDunknown "unknown" #define MSGTR_OSDDVDNAV "DVDNAV: %s" +#define MSGTR_OSDAudioLanguage "Audio: (%d) %s" #define MSGTR_OSDChannel "Channel: %s" #define MSGTR_OSDSubtitles "Subtitles: %s" #define MSGTR_OSDSubtitlesOff "Subtitles: off" diff -urN main/libmpdemux/demux_mkv.c main_audioid7/libmpdemux/demux_mkv.c --- main/libmpdemux/demux_mkv.c 2005-11-18 18:56:06.227708808 +0100 +++ main_audioid7/libmpdemux/demux_mkv.c 2005-12-01 02:20:01.305075104 +0100 @@ -3444,6 +3444,40 @@ } } +/** \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", diff -urN main/libmpdemux/matroska.h main_audioid7/libmpdemux/matroska.h --- main/libmpdemux/matroska.h 2005-10-22 12:19:11.789732016 +0200 +++ main_audioid7/libmpdemux/matroska.h 2005-12-01 02:20:33.578168848 +0100 @@ -70,6 +70,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); diff -urN main/libmpdemux/stream_dvd.c main_audioid7/libmpdemux/stream_dvd.c --- main/libmpdemux/stream_dvd.c 2005-11-18 18:56:07.356537200 +0100 +++ main_audioid7/libmpdemux/stream_dvd.c 2005-12-01 02:21:07.233052528 +0100 @@ -136,6 +136,19 @@ 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;inr_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; diff -urN main/libmpdemux/stream.h main_audioid7/libmpdemux/stream.h --- main/libmpdemux/stream.h 2005-11-18 18:56:07.350538112 +0100 +++ main_audioid7/libmpdemux/stream.h 2005-12-01 02:21:32.591197504 +0100 @@ -325,6 +325,7 @@ } 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); diff -urN main/mplayer.c main_audioid7/mplayer.c --- main/mplayer.c 2005-11-28 17:31:54.000461304 +0100 +++ main_audioid7/mplayer.c 2005-12-01 02:42:49.197123904 +0100 @@ -1056,6 +1056,7 @@ #define OSD_MSG_SUB_ALIGN 106 #define OSD_MSG_SUB_VISIBLE 107 #define OSD_MSG_SUB_CHANGED 108 +#define OSD_MSG_AUDIO_CHANGED 109 typedef struct mp_osd_msg mp_osd_msg_t; struct mp_osd_msg { @@ -1305,7 +1306,8 @@ // movie info: -// still needed for the subtitles mess +// still needed for the audio/subtitles mess +int osd_show_audio_changed = 0; int osd_show_vobsub_changed = 0; int osd_show_sub_changed = 0; @@ -3903,9 +3905,10 @@ mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_TIME_POSITION=%.1f\n", pos); } break; case MP_CMD_SWITCH_AUDIO : { - int v = demuxer_switch_audio(demuxer, cmd->args[0].v.i); + audio_id = demuxer_switch_audio(demuxer, cmd->args[0].v.i); if (identify) - mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_TRACK=%d\n", v); + mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_TRACK=%d\n", audio_id); + osd_show_audio_changed = sh_video->fps; } break; case MP_CMD_RUN : { #ifndef __MINGW32__ @@ -4348,8 +4351,37 @@ strlen(tmp) < 20 ? "" : "...", strlen(tmp) < 20 ? tmp : tmp+strlen(tmp)-19); osd_show_sub_changed = 0; - } + } else +#endif + if (osd_show_audio_changed) { +#ifdef USE_DVDREAD + if (sh_audio && (demuxer->type != DEMUXER_TYPE_MATROSKA)) { + 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(osd_text_tmp, 63, MSGTR_OSDAudioLanguage, audio_id, code ? lang : MSGTR_OSDunknown); + } + } #endif +#ifdef HAVE_MATROSKA + if (demuxer->type == DEMUXER_TYPE_MATROSKA) { + char lang[40] = MSGTR_OSDunknown; + if (audio_id >= 0) { + demux_mkv_get_audio_lang(demuxer, audio_id, lang, 39); + lang[39] = 0; + } + snprintf(osd_text_tmp, 63, MSGTR_OSDAudioLanguage, audio_id, lang); + } +#endif + set_osd_msg(OSD_MSG_AUDIO_CHANGED,1,osd_duration, + "%s",osd_text_tmp); + osd_show_audio_changed = 0; + } } // for(i=1;i<=11;i++) osd_text_buffer[10+i]=i;osd_text_buffer[10+i]=0; // vo_osd_text=osd_text_buffer;