Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (3)
......@@ -1585,39 +1585,55 @@ vlc_player_SelectEsIdList(vlc_player_t *player,
enum es_format_category_e cat,
vlc_es_id_t *const es_id_list[]);
/**
* Select the next track
* Cycle through the tracks
*
* If the last track is already selected, a call to this function will disable
* this last track. And a second call will select the first track.
*
* @warning This function has no effects if there are several tracks selected
* for a same category. Therefore the default policy is
* VLC_PLAYER_SELECT_EXCLUSIVE.
* Unless called on the PRIMARY with a SECONDARY selected, it will cycle through
*
* @param player locked player instance
* @param cat VIDEO_ES, AUDIO_ES or SPU_ES
* @param next the cycle order
*/
VLC_API void
vlc_player_SelectNextTrack(vlc_player_t *player,
enum es_format_category_e cat);
vlc_player_CycleTrack(vlc_player_t *player, enum es_format_category_e cat,
enum vlc_vout_order vout_order, bool next);
/**
* Select the Previous track
* Helper to select the next track
*
* If the last track is already selected, a call to this function will disable
* this last track. And a second call will select the first track.
* Unless called on the PRIMARY with a SECONDARY selected, it will cycle through
*
* @param player locked player instance
* @param cat VIDEO_ES, AUDIO_ES or SPU_ES
*/
static inline void
vlc_player_SelectNextTrack(vlc_player_t *player, enum es_format_category_e cat,
enum vlc_vout_order vout_order)
{
vlc_player_CycleTrack(player, cat, vout_order, true);
}
/**
* Helper to select the Previous track
*
* If the first track is already selected, a call to this function will disable
* this first track. And a second call will select the last track.
*
* @warning This function has no effects if there are several tracks selected
* for a same category. Therefore the default policy is
* VLC_PLAYER_SELECT_EXCLUSIVE.
* Unless called on the PRIMARY with a SECONDARY selected, it will cycle through
*
* @param player locked player instance
* @param cat VIDEO_ES, AUDIO_ES or SPU_ES
*/
VLC_API void
vlc_player_SelectPrevTrack(vlc_player_t *player,
enum es_format_category_e cat);
static inline void
vlc_player_SelectPrevTrack(vlc_player_t *player, enum es_format_category_e cat,
enum vlc_vout_order vout_order)
{
vlc_player_CycleTrack(player, cat, vout_order, false);
}
/**
* Unselect a track from an ES identifier
......
......@@ -274,7 +274,7 @@ static void ProcessGesture( intf_thread_t *p_intf )
enum es_format_category_e cat =
p_sys->i_pattern == GESTURE(UP,RIGHT,NONE,NONE) ?
AUDIO_ES : SPU_ES;
vlc_player_SelectNextTrack(player, cat);
vlc_player_SelectNextTrack(player, cat, VLC_VOUT_ORDER_PRIMARY);
break;
}
......
......@@ -365,109 +365,17 @@ PLAYER_ACTION_HANDLER(NavigateMedia)
}
}
static void CycleSecondarySubtitles(intf_thread_t *intf, vlc_player_t *player,
bool next)
{
intf_sys_t *sys = intf->p_sys;
const enum es_format_category_e cat = SPU_ES;
size_t count = vlc_player_GetTrackCount(player, cat);
if (!count)
return;
vlc_es_id_t *cycle_id = NULL;
vlc_es_id_t *keep_id = NULL;
/* Check how many subtitle tracks are already selected */
size_t selected_count = 0;
for (size_t i = 0; i < count; ++i)
{
const struct vlc_player_track *track =
vlc_player_GetTrackAt(player, cat, i);
assert(track);
if (track->selected)
{
enum vlc_vout_order order;
if (vlc_player_GetEsIdVout(player, track->es_id, &order)
&& order == sys->spu_channel_order)
cycle_id = track->es_id;
else
keep_id = track->es_id;
++selected_count;
}
}
if ((sys->spu_channel_order == VLC_VOUT_ORDER_PRIMARY
&& selected_count == 1) || selected_count == 0)
{
/* Only cycle the primary subtitle track */
if (next)
vlc_player_SelectNextTrack(player, cat);
else
vlc_player_SelectPrevTrack(player, cat);
}
else
{
/* Find out the current selected index.
If no track selected, select the first or the last track */
size_t index = next ? 0 : count - 1;
for (size_t i = 0; i < count; ++i)
{
const struct vlc_player_track *track =
vlc_player_GetTrackAt(player, cat, i);
assert(track);
if (track->es_id == cycle_id)
{
index = i;
break;
}
}
/* Look for the next free (unselected) track */
while (true)
{
const struct vlc_player_track *track =
vlc_player_GetTrackAt(player, cat, index);
if (!track->selected)
{
cycle_id = track->es_id;
break;
}
/* Unselect if we reach the end of the cycle */
else if ((next && index + 1 == count) || (!next && index == 0))
{
cycle_id = NULL;
break;
}
else /* Switch to the next or previous track */
index = index + (next ? 1 : -1);
}
/* Make sure the list never contains NULL before a valid id */
if ( !keep_id )
{
keep_id = cycle_id;
cycle_id = NULL;
}
vlc_es_id_t *esIds[] = { keep_id, cycle_id, NULL };
vlc_player_SelectEsIdList(player, cat, esIds);
}
}
PLAYER_ACTION_HANDLER(Track)
{
switch (action_id)
{
case ACTIONID_AUDIO_TRACK:
vlc_player_SelectNextTrack(player, AUDIO_ES);
vlc_player_SelectNextTrack(player, AUDIO_ES, VLC_VOUT_ORDER_PRIMARY);
break;
case ACTIONID_SUBTITLE_REVERSE_TRACK:
case ACTIONID_SUBTITLE_TRACK:
CycleSecondarySubtitles(intf, player,
action_id == ACTIONID_SUBTITLE_TRACK);
vlc_player_CycleTrack(player, SPU_ES, intf->p_sys->spu_channel_order,
action_id == ACTIONID_SUBTITLE_TRACK);
break;
default:
vlc_assert_unreachable();
......
......@@ -1423,14 +1423,14 @@ static int BossCallback(vlc_object_t *p_this,
- (void)selectPreviousTrackForCategory:(enum es_format_category_e)category
{
vlc_player_Lock(_p_player);
vlc_player_SelectPrevTrack(_p_player, category);
vlc_player_SelectPrevTrack(_p_player, category, VLC_VOUT_ORDER_PRIMARY);
vlc_player_Unlock(_p_player);
}
- (void)selectNextTrackForCategory:(enum es_format_category_e)category
{
vlc_player_Lock(_p_player);
vlc_player_SelectNextTrack(_p_player, category);
vlc_player_SelectNextTrack(_p_player, category, VLC_VOUT_ORDER_PRIMARY);
vlc_player_Unlock(_p_player);
}
......
......@@ -1503,17 +1503,17 @@ static void HandleCommonKey(intf_thread_t *intf, vlc_player_t *player, int key)
case 'c':
vlc_player_Lock(player);
vlc_player_SelectNextTrack(player, AUDIO_ES);
vlc_player_SelectNextTrack(player, AUDIO_ES, VLC_VOUT_ORDER_PRIMARY);
vlc_player_Unlock(player);
break;
case 'v':
vlc_player_Lock(player);
vlc_player_SelectNextTrack(player, SPU_ES);
vlc_player_SelectNextTrack(player, SPU_ES, VLC_VOUT_ORDER_PRIMARY);
vlc_player_Unlock(player);
break;
case 'b':
vlc_player_Lock(player);
vlc_player_SelectNextTrack(player, VIDEO_ES);
vlc_player_SelectNextTrack(player, VIDEO_ES, VLC_VOUT_ORDER_PRIMARY);
vlc_player_Unlock(player);
break;
......
......@@ -251,7 +251,7 @@ static void EsOutUpdateInfo(es_out_sys_t *, es_out_id_t *es, const vlc_m
static int EsOutSetRecord(es_out_sys_t *, bool b_record, const char *dir_path);
static bool EsIsSelected( es_out_id_t *es );
static void EsOutSelectEs(es_out_sys_t *out, es_out_id_t *es, bool b_force);
static void EsOutSelectEs(es_out_sys_t *out, es_out_id_t *es, bool b_force, enum vlc_vout_order vout_order);
static void EsOutDeleteInfoEs(es_out_sys_t *, es_out_id_t *es);
static void EsOutUnselectEs(es_out_sys_t *out, es_out_id_t *es, bool b_update);
static void EsOutDecoderChangeDelay(es_out_sys_t *out, es_out_id_t *p_es);
......@@ -1206,7 +1206,7 @@ static vlc_tick_t EsOutGetBuffering(es_out_sys_t *p_sys)
}
static void EsOutSendEsEvent(es_out_sys_t *p_sys, es_out_id_t *es, int action,
bool forced)
bool forced, enum vlc_vout_order vout_order)
{
input_thread_t *p_input = p_sys->p_input;
......@@ -1234,6 +1234,7 @@ static void EsOutSendEsEvent(es_out_sys_t *p_sys, es_out_id_t *es, int action,
.title = es->psz_title ? es->psz_title : "",
.fmt = es->fmt_out.i_cat != UNKNOWN_ES ? &es->fmt_out : &es->fmt,
.forced = forced,
.vout_order = vout_order,
});
}
......@@ -1391,7 +1392,7 @@ static void EsOutProgramSelect(es_out_sys_t *p_sys, es_out_pgrm_t *p_pgrm)
/* ES tracks are deleted (and unselected) when their programs
* are unselected (they will be added back when their programs
* are selected back). */
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_DELETED, false);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_DELETED, false, VLC_VOUT_ORDER_PRIMARY);
}
}
......@@ -1426,7 +1427,7 @@ static void EsOutProgramSelect(es_out_sys_t *p_sys, es_out_pgrm_t *p_pgrm)
}
else if (es->p_pgrm == p_sys->p_pgrm)
{
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_ADDED, false);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_ADDED, false, VLC_VOUT_ORDER_PRIMARY);
EsOutUpdateInfo(p_sys, es, NULL);
}
......@@ -2192,7 +2193,7 @@ static es_out_id_t *EsOutAddLocked(es_out_sys_t *p_sys,
vlc_atomic_rc_init(&es->rc);
if( es->p_pgrm == p_sys->p_pgrm )
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_ADDED, false);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_ADDED, false, VLC_VOUT_ORDER_PRIMARY);
EsOutUpdateInfo(p_sys, es, NULL);
EsOutSelect(p_sys, es, false);
......@@ -2400,7 +2401,7 @@ static void EsOutDestroyDecoder(es_out_sys_t *sys,
es_format_Clean( &p_es->fmt_out );
}
static void EsOutSelectEs(es_out_sys_t *p_sys, es_out_id_t *es, bool b_force)
static void EsOutSelectEs(es_out_sys_t *p_sys, es_out_id_t *es, bool b_force, enum vlc_vout_order vout_order)
{
input_thread_t *p_input = p_sys->p_input;
bool b_thumbnailing = p_sys->input_type == INPUT_TYPE_THUMBNAILING;
......@@ -2456,7 +2457,7 @@ static void EsOutSelectEs(es_out_sys_t *p_sys, es_out_id_t *es, bool b_force)
return;
/* Mark it as selected */
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_SELECTED, b_force);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_SELECTED, b_force, vout_order);
/* Special case of the zvbi decoder for teletext: send the initial selected
* page and transparency */
......@@ -2505,7 +2506,7 @@ static void EsOutUnselectEs(es_out_sys_t *p_sys, es_out_id_t *es, bool b_update)
return;
/* Mark it as unselected */
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_UNSELECTED, false);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_UNSELECTED, false, VLC_VOUT_ORDER_PRIMARY);
}
static bool EsOutSelectMatchPrioritized( const es_out_es_props_t *p_esprops,
......@@ -2602,7 +2603,7 @@ static void EsOutSelect(es_out_sys_t *p_sys, es_out_id_t *es, bool b_force)
if( b_auto_unselect )
EsOutUnselectEs(p_sys, p_esprops->p_main_es, true);
EsOutSelectEs(p_sys, es, b_force);
EsOutSelectEs(p_sys, es, b_force, VLC_VOUT_ORDER_PRIMARY);
}
}
else if( p_sys->i_mode == ES_OUT_MODE_PARTIAL )
......@@ -2619,7 +2620,7 @@ static void EsOutSelect(es_out_sys_t *p_sys, es_out_id_t *es, bool b_force)
if( atoi( prgm ) == es->p_pgrm->i_id )
{
if( !EsIsSelected( es ) )
EsOutSelectEs(p_sys, es, b_force);
EsOutSelectEs(p_sys, es, b_force, VLC_VOUT_ORDER_PRIMARY);
break;
}
}
......@@ -2690,7 +2691,7 @@ static void EsOutSelect(es_out_sys_t *p_sys, es_out_id_t *es, bool b_force)
if( b_auto_unselect )
EsOutUnselectEs(p_sys, p_esprops->p_main_es, true);
EsOutSelectEs(p_sys, es, b_force);
EsOutSelectEs(p_sys, es, b_force, VLC_VOUT_ORDER_PRIMARY);
}
}
......@@ -2735,7 +2736,7 @@ static void EsOutSelectListFromProps(es_out_sys_t *p_sys, enum es_format_categor
strcpy( buffer, esprops->str_ids );
if( EsOutIdMatchStrIds( other, buffer ) && !EsIsSelected( other ) )
{
EsOutSelectEs(p_sys, other, true);
EsOutSelectEs(p_sys, other, true, VLC_VOUT_ORDER_PRIMARY);
if( esprops->e_policy == ES_OUT_ES_POLICY_EXCLUSIVE )
break;
......@@ -2784,7 +2785,11 @@ static void EsOutSelectList(es_out_sys_t *p_sys, enum es_format_category_e cat,
continue;
}
EsOutSelectEs(p_sys, other, true);
/* First ID is considered to be the PRIMARY */
enum vlc_vout_order vout_oder = ( es_id_list[0] == &other->id )
? VLC_VOUT_ORDER_PRIMARY
: VLC_VOUT_ORDER_SECONDARY;
EsOutSelectEs(p_sys, other, true, vout_oder);
if (p_esprops->e_policy == ES_OUT_ES_POLICY_EXCLUSIVE)
break;
......@@ -2967,7 +2972,7 @@ static int EsOutSend(es_out_t *out, es_out_id_t *es, block_t *p_block )
if (ret == VLC_SUCCESS)
{
EsOutUpdateInfo(p_sys, es, status.format.meta);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_UPDATED, false);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_UPDATED, false, VLC_VOUT_ORDER_PRIMARY);
}
es_format_Clean( &status.format.fmt );
......@@ -3030,7 +3035,7 @@ static void EsOutDelLocked(es_out_sys_t *p_sys, es_out_id_t *es)
EsTerminate(es);
if( es->p_pgrm == p_sys->p_pgrm )
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_DELETED, false);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_DELETED, false, VLC_VOUT_ORDER_PRIMARY);
EsOutDeleteInfoEs(p_sys, es);
......@@ -3067,7 +3072,7 @@ static void EsOutDelLocked(es_out_sys_t *p_sys, es_out_id_t *es)
{
if (EsIsSelected(other))
{
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_SELECTED, false);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_SELECTED, false, VLC_VOUT_ORDER_PRIMARY);
if( p_esprops->p_main_es == NULL )
p_esprops->p_main_es = other;
}
......@@ -3156,7 +3161,7 @@ static int EsOutVaControlLocked(es_out_sys_t *p_sys, input_source_t *source,
bool is_selected = EsIsSelected(es);
if(request_select && !is_selected)
{
EsOutSelectEs(p_sys, es, true);
EsOutSelectEs(p_sys, es, true, VLC_VOUT_ORDER_PRIMARY);
return EsIsSelected( es ) ? VLC_SUCCESS : VLC_EGENERIC;
}
......@@ -3488,7 +3493,7 @@ static int EsOutVaControlLocked(es_out_sys_t *p_sys, input_source_t *source,
if(b_was_selected)
EsOutCreateDecoder(p_sys, es);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_UPDATED, false);
EsOutSendEsEvent(p_sys, es, VLC_INPUT_ES_UPDATED, false, VLC_VOUT_ORDER_PRIMARY);
return VLC_SUCCESS;
}
......
......@@ -245,6 +245,8 @@ struct vlc_input_event_es {
* the user.
*/
bool forced;
enum vlc_vout_order vout_order;
};
struct vlc_input_event_signal {
......
......@@ -854,6 +854,7 @@ vlc_player_aout_RemoveListener
vlc_player_aout_SetVolume
vlc_player_ChangeRate
vlc_player_CondWait
vlc_player_CycleTrack
vlc_player_DisplayPosition
vlc_player_DecrementRate
vlc_player_Delete
......@@ -916,11 +917,9 @@ vlc_player_SelectEsId
vlc_player_SelectEsIdList
vlc_player_SelectNextChapter
vlc_player_SelectNextTitle
vlc_player_SelectNextTrack
vlc_player_SelectNextProgram
vlc_player_SelectPrevChapter
vlc_player_SelectPrevTitle
vlc_player_SelectPrevTrack
vlc_player_SelectPrevProgram
vlc_player_SelectProgram
vlc_player_SelectTeletextPage
......
......@@ -640,6 +640,7 @@ vlc_player_input_HandleEsEvent(struct vlc_player_input *input,
{
trackpriv->t.selected = true;
trackpriv->selected_by_user = ev->forced;
trackpriv->vout_order = ev->vout_order;
vlc_player_SendEvent(player, on_track_selection_changed,
NULL, trackpriv->t.es_id);
vlc_player_input_HandleTeletextMenu(input, ev, trackpriv);
......
......@@ -596,69 +596,77 @@ vlc_player_SelectTracksByStringIds(vlc_player_t *player,
vlc_player_input_SelectTracksByStringIds(input, cat, str_ids);
}
static void
void
vlc_player_CycleTrack(vlc_player_t *player, enum es_format_category_e cat,
bool next)
enum vlc_vout_order vout_order, bool next)
{
size_t count = vlc_player_GetTrackCount(player, cat);
if (!count)
return;
size_t index;
bool selected = false;
for (size_t i = 0; i < count; ++i)
vlc_es_id_t *keep_id = NULL;
/* Check how many tracks are already selected */
size_t selected_count = 0;
/* Find out the current selected index.
* If no track selected, select the first or the last track */
size_t cycle_index = next ? count-1 : count;
for (size_t i = 0; i < count && selected_count < 2; ++i)
{
const struct vlc_player_track *track =
vlc_player_GetTrackAt(player, cat, i);
assert(track);
if (track->selected)
{
if (selected)
{
/* Can't cycle through tracks if there are more than one
* selected */
return;
}
index = i;
selected = true;
enum vlc_vout_order order;
vlc_player_GetEsIdVout(player, track->es_id, &order);
if (order == vout_order)
cycle_index = i;
else
keep_id = track->es_id;
++selected_count;
}
}
if (!selected)
vlc_es_id_t * cycle_id = NULL;
/* Look for the next free (unselected) track */
for (size_t i = 0; i < count; ++i)
{
/* No track selected: select the first or the last track */
index = next ? 0 : count - 1;
selected = true;
cycle_index = (cycle_index + (next ? 1 : -1) + count) % count;
/* Unselect if we reach the end of the cycle
* Unless cycling PRIMARY with a selected SECONDARY then wrap around */
if (((next && cycle_index == 0) || (!next && cycle_index + 1 == count))
&& ((selected_count == 1 && vout_order == VLC_VOUT_ORDER_PRIMARY)
|| (selected_count == 2 && vout_order == VLC_VOUT_ORDER_SECONDARY)))
break;
const struct vlc_player_track *track =
vlc_player_GetTrackAt(player, cat, cycle_index);
if (!track->selected)
{
cycle_id = track->es_id;
break;
}
}
else
// We want the PRIMARY in first position
vlc_es_id_t *esIds[] = { cycle_id, keep_id, NULL };
if (vout_order == VLC_VOUT_ORDER_SECONDARY)
{
/* Unselect if we reach the end of the cycle */
if ((next && index + 1 == count) || (!next && index == 0))
selected = false;
else /* Switch to the next or previous track */
index = index + (next ? 1 : -1);
esIds[0] = keep_id;
esIds[1] = cycle_id;
}
if (!esIds[0])
{
esIds[0] = esIds[1];
esIds[1] = NULL;
}
const struct vlc_player_track *track =
vlc_player_GetTrackAt(player, cat, index);
if (selected)
vlc_player_SelectTrack(player, track, VLC_PLAYER_SELECT_EXCLUSIVE);
else
vlc_player_UnselectTrack(player, track);
}
void
vlc_player_SelectNextTrack(vlc_player_t *player,
enum es_format_category_e cat)
{
vlc_player_CycleTrack(player, cat, true);
}
void
vlc_player_SelectPrevTrack(vlc_player_t *player,
enum es_format_category_e cat)
{
vlc_player_CycleTrack(player, cat, false);
vlc_player_SelectEsIdList(player, cat, esIds);
}
void
......
......@@ -1421,7 +1421,7 @@ test_tracks(struct ctx *ctx, bool packetized)
/* Select all track via next calls */
for (size_t j = 0; j < params.track_count[cat]; ++j)
{
vlc_player_SelectNextTrack(player, cat);
vlc_player_SelectNextTrack(player, cat, VLC_VOUT_ORDER_PRIMARY);
/* Wait that the next track is selected */
const struct vlc_player_track *track =
......@@ -1435,7 +1435,7 @@ test_tracks(struct ctx *ctx, bool packetized)
/* Select all track via previous calls */
for (size_t j = params.track_count[cat] - 1; j > 0; --j)
{
vlc_player_SelectPrevTrack(player, cat);
vlc_player_SelectPrevTrack(player, cat, VLC_VOUT_ORDER_PRIMARY);
const struct vlc_player_track *track =
vlc_player_GetTrackAt(player, cat, j - 1);
......@@ -1448,7 +1448,7 @@ test_tracks(struct ctx *ctx, bool packetized)
}
/* Current track index is 0, a previous will unselect the track */
vlc_player_SelectPrevTrack(player, cat);
vlc_player_SelectPrevTrack(player, cat, VLC_VOUT_ORDER_PRIMARY);
const struct vlc_player_track *track =
vlc_player_GetTrackAt(player, cat, 0);
/* Wait that the track is unselected */
......