summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmpdemux/demux_mkv.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 97e0e3866b..d4a3a8994a 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -2609,24 +2609,19 @@ static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
*((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration);
return DEMUXER_CTRL_OK;
- case DEMUXER_CTRL_SWITCH_AUDIO:
- if (demuxer->audio && demuxer->audio->sh) {
- sh_audio_t *sh = demuxer->a_streams[demuxer->audio->id];
- int aid = *(int *) arg;
- if (aid < 0)
- aid = (sh->aid + 1) % mkv_d->num_audio_tracks;
- if (aid != sh->aid) {
- mkv_track_t *track =
- find_track_by_num(mkv_d, aid, MATROSKA_TRACK_AUDIO);
- if (track) {
- demuxer->audio->id = track->id;
- sh = demuxer->a_streams[demuxer->audio->id];
- ds_free_packs(demuxer->audio);
- }
- }
- *(int *) arg = sh->aid;
- } else
- *(int *) arg = -2;
+ case DEMUXER_CTRL_SWITCH_AUDIO:;
+ int new_aid = *(int *) arg;
+ int current_aid = demuxer->audio->id;
+ if (current_aid < 0)
+ current_aid = -1;
+ if (new_aid == -1) // cycle to next
+ new_aid = (current_aid + 2) % (mkv_d->num_audio_tracks + 1) - 1;
+ if (new_aid < 0 || new_aid >= mkv_d->num_audio_tracks)
+ new_aid = -2;
+ *(int *) arg = new_aid;
+ if (current_aid != new_aid)
+ ds_free_packs(demuxer->audio);
+ demuxer->audio->id = new_aid;
return DEMUXER_CTRL_OK;
default: