1414import org .videolan .libvlc .MediaPlayer ;
1515import org .videolan .libvlc .RendererDiscoverer ;
1616import org .videolan .libvlc .RendererItem ;
17+ import org .videolan .libvlc .interfaces .IMedia ;
18+ import java .util .Random ;
19+ import android .util .Log ;
1720
1821import java .io .ByteArrayOutputStream ;
1922import java .io .IOException ;
@@ -166,7 +169,10 @@ public void onEvent(MediaPlayer.Event event) {
166169 eventObject .put ("width" , width );
167170 eventObject .put ("speed" , mediaPlayer .getRate ());
168171 eventObject .put ("duration" , mediaPlayer .getLength ());
169- // Track methods removed for VLC 4.0 compatibility
172+ eventObject .put ("audioTracksCount" , getAudioTracksCount ());
173+ eventObject .put ("activeAudioTrack" , getAudioTrack ());
174+ eventObject .put ("spuTracksCount" , getSpuTracksCount ());
175+ eventObject .put ("activeSpuTrack" , getSpuTrack ());
170176 mediaEventSink .success (eventObject .clone ());
171177 break ;
172178
@@ -188,7 +194,10 @@ public void onEvent(MediaPlayer.Event event) {
188194 eventObject .put ("position" , mediaPlayer .getTime ());
189195 eventObject .put ("duration" , mediaPlayer .getLength ());
190196 eventObject .put ("buffer" , event .getBuffering ());
191- // Track methods removed for VLC 4.0 compatibility
197+ eventObject .put ("audioTracksCount" , getAudioTracksCount ());
198+ eventObject .put ("activeAudioTrack" , getAudioTrack ());
199+ eventObject .put ("spuTracksCount" , getSpuTracksCount ());
200+ eventObject .put ("activeSpuTrack" , getSpuTrack ());
192201 eventObject .put ("isPlaying" , mediaPlayer .isPlaying ());
193202 mediaEventSink .success (eventObject );
194203 break ;
@@ -343,94 +352,181 @@ long getDuration() {
343352 return mediaPlayer .getLength ();
344353 }
345354
346- // Track methods commented out for VLC 4.0 compatibility
347- // These will need to be reimplemented using the new VLC 4.0 API
348-
349355 int getSpuTracksCount () {
350356 if (mediaPlayer == null ) return -1 ;
351- return 0 ; // Placeholder - needs VLC 4.0 implementation
357+
358+ IMedia .Track [] spuTracks = mediaPlayer .getTracks (IMedia .Track .Type .Text );
359+ return spuTracks != null ? spuTracks .length : 0 ;
352360 }
353361
354362 HashMap <Integer , String > getSpuTracks () {
355- return new HashMap <Integer , String >(); // Placeholder
363+ if (mediaPlayer == null ) return new HashMap <Integer , String >();
364+
365+ IMedia .Track [] spuTracks = mediaPlayer .getTracks (IMedia .Track .Type .Text );
366+ HashMap <Integer , String > subtitles = new HashMap <>();
367+ if (spuTracks != null )
368+ for (IMedia .Track trackDescription : spuTracks ) {
369+ subtitles .put (Integer .parseInt (trackDescription .id .replaceAll ("\\ D" , "" )), trackDescription .name );
370+ }
371+ return subtitles ;
356372 }
357373
358374 void setSpuTrack (int index ) {
359375 if (mediaPlayer == null ) return ;
360- // VLC 4.0 implementation needed
376+
377+ try {
378+
379+ if ( index >= 0 ) {
380+ // Select the track by its ID
381+ mediaPlayer .selectTrack ("spu/" +index );
382+ } else if (index == -1 ) {
383+ // Unselect all text tracks
384+ mediaPlayer .unselectTrackType (IMedia .Track .Type .Text );
385+ }
386+ } catch (Exception e ) {
387+ Log .e (TAG , "setAudioTrack failed: " + e .getMessage ());
388+ }
361389 }
362390
363391 int getSpuTrack () {
364392 if (mediaPlayer == null ) return -1 ;
365- return -1 ; // Placeholder
393+
394+ IMedia .Track track = mediaPlayer .getSelectedTrack (IMedia .Track .Type .Text );
395+ if (track == null ) {
396+ return -1 ;
397+ }
398+ return Integer .parseInt (track .id .replaceAll ("\\ D" , "" ));
366399 }
367400
368401 void setSpuDelay (long delay ) {
369402 if (mediaPlayer == null ) return ;
370- // VLC 4.0 implementation needed
403+
404+ mediaPlayer .setSpuDelay (delay );
371405 }
372406
373407 long getSpuDelay () {
374408 if (mediaPlayer == null ) return -1 ;
375- return -1 ; // Placeholder
409+
410+ return mediaPlayer .getSpuDelay ();
376411 }
377412
378413 void addSubtitleTrack (String url , boolean isSelected ) {
379414 if (mediaPlayer == null ) return ;
380- // VLC 4.0 implementation needed
415+
416+ mediaPlayer .addSlave (Media .Slave .Type .Subtitle , Uri .parse (url ), isSelected );
381417 }
382418
383419 int getAudioTracksCount () {
384420 if (mediaPlayer == null ) return -1 ;
385- return 0 ; // Placeholder
421+
422+ IMedia .Track [] audioTracks = mediaPlayer .getTracks (IMedia .Track .Type .Audio );
423+ return audioTracks != null ? audioTracks .length : 0 ;
386424 }
387425
388426 HashMap <Integer , String > getAudioTracks () {
389- return new HashMap <Integer , String >(); // Placeholder
427+ if (mediaPlayer == null ) return new HashMap <Integer , String >();
428+
429+ IMedia .Track [] audioTracks = mediaPlayer .getTracks (IMedia .Track .Type .Audio );
430+ HashMap <Integer , String > audios = new HashMap <>();
431+ Random random = new Random ();
432+ if (audioTracks != null )
433+ for (IMedia .Track trackDescription : audioTracks ) {
434+ audios .put (Integer .parseInt (trackDescription .id .replaceAll ("\\ D" , "" )), trackDescription .name );
435+ }
436+ return audios ;
390437 }
391438
392439 void setAudioTrack (int index ) {
393440 if (mediaPlayer == null ) return ;
394- // VLC 4.0 implementation needed
441+
442+ try {
443+
444+ if ( index >= 0 ) {
445+ // Select the track by its ID
446+ mediaPlayer .selectTrack ("audio/" +index );
447+ } else if (index == -1 ) {
448+ // Unselect all audio tracks
449+ mediaPlayer .unselectTrackType (IMedia .Track .Type .Audio );
450+ }
451+ } catch (Exception e ) {
452+ Log .e (TAG , "setAudioTrack failed: " + e .getMessage ());
453+ }
395454 }
396455
397456 int getAudioTrack () {
398457 if (mediaPlayer == null ) return -1 ;
399- return -1 ; // Placeholder
458+
459+ IMedia .Track track = mediaPlayer .getSelectedTrack (IMedia .Track .Type .Audio );
460+ if (track == null ) {
461+ return -1 ;
462+ }
463+ return Integer .parseInt (track .id .replaceAll ("\\ D" , "" ));
400464 }
401465
402466 void setAudioDelay (long delay ) {
403467 if (mediaPlayer == null ) return ;
404- // VLC 4.0 implementation needed
468+
469+ mediaPlayer .setAudioDelay (delay );
405470 }
406471
407472 long getAudioDelay () {
408473 if (mediaPlayer == null ) return -1 ;
409- return -1 ; // Placeholder
474+
475+ return mediaPlayer .getAudioDelay ();
410476 }
411477
412478 void addAudioTrack (String url , boolean isSelected ) {
413479 if (mediaPlayer == null ) return ;
414- // VLC 4.0 implementation needed
480+
481+ mediaPlayer .addSlave (Media .Slave .Type .Audio , Uri .parse (url ), isSelected );
415482 }
416483
417484 int getVideoTracksCount () {
418485 if (mediaPlayer == null ) return -1 ;
419- return 0 ; // Placeholder
486+
487+ IMedia .Track [] videoTracks = mediaPlayer .getTracks (IMedia .Track .Type .Video );
488+ return videoTracks != null ? videoTracks .length : 0 ;
489+
420490 }
421491
422492 HashMap <Integer , String > getVideoTracks () {
423- return new HashMap <Integer , String >(); // Placeholder
493+ if (mediaPlayer == null ) return new HashMap <Integer , String >();
494+
495+ IMedia .Track [] videoTracks = mediaPlayer .getTracks (IMedia .Track .Type .Video );
496+ HashMap <Integer , String > videos = new HashMap <>();
497+ if (videoTracks != null )
498+ for (IMedia .Track trackDescription : videoTracks ) {
499+ videos .put (Integer .parseInt (trackDescription .id .replaceAll ("\\ D" , "" )), trackDescription .name );
500+ }
501+ return videos ;
424502 }
425503
426504 void setVideoTrack (int index ) {
427505 if (mediaPlayer == null ) return ;
428- // VLC 4.0 implementation needed
506+
507+ try {
508+
509+ if ( index >= 0 ) {
510+ // Select the track by its ID
511+ mediaPlayer .selectTrack ("video/" +index );
512+ } else if (index == -1 ) {
513+ // Unselect all video tracks
514+ mediaPlayer .unselectTrackType (IMedia .Track .Type .Video );
515+ }
516+ } catch (Exception e ) {
517+ Log .e (TAG , "setAudioTrack failed: " + e .getMessage ());
518+ }
429519 }
430520
431521 int getVideoTrack () {
432522 if (mediaPlayer == null ) return -1 ;
433- return -1 ; // Placeholder
523+
524+ IMedia .Track track = mediaPlayer .getSelectedTrack (IMedia .Track .Type .Video );
525+ if (track == null ) {
526+ return -1 ;
527+ }
528+ return Integer .parseInt (track .id .replaceAll ("\\ D" , "" ));
529+
434530 }
435531
436532 void setVideoScale (float scale ) {
@@ -567,7 +663,6 @@ void castToRenderer(String rendererDevice) {
567663 String getSnapshot () {
568664 if (textureView == null ) return null ;
569665 if (!mediaPlayer .isPlaying ()) return null ;
570-
571666 Bitmap bitmap = textureView .getBitmap ();
572667 if (bitmap == null ) return null ;
573668
0 commit comments