From 8d488298cf4c8bea83178cbfe0c770936a1d0461 Mon Sep 17 00:00:00 2001 From: tapframe Date: Wed, 17 Sep 2025 12:30:47 +0530 Subject: [PATCH] Audio selection bug fixes --- src/components/player/AndroidVideoPlayer.tsx | 50 +++++++++++++------ .../player/controls/PlayerControls.tsx | 7 +-- .../player/modals/AudioTrackModal.tsx | 27 +++------- 3 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/components/player/AndroidVideoPlayer.tsx b/src/components/player/AndroidVideoPlayer.tsx index 1e60937..0a70b1c 100644 --- a/src/components/player/AndroidVideoPlayer.tsx +++ b/src/components/player/AndroidVideoPlayer.tsx @@ -1185,14 +1185,26 @@ const AndroidVideoPlayer: React.FC = () => { }; }); setRnVideoAudioTracks(formattedAudioTracks); - - // Use system auto-selection + + // Auto-select audio track if none is selected (similar to iOS behavior) if (selectedAudioTrack?.type === SelectedTrackType.SYSTEM && formattedAudioTracks.length > 0) { + // Look for English track first + const englishTrack = formattedAudioTracks.find((track: {id: number, name: string, language?: string}) => { + const lang = (track.language || '').toLowerCase(); + return lang === 'english' || lang === 'en' || lang === 'eng' || + (track.name && track.name.toLowerCase().includes('english')); + }); + + const selectedTrack = englishTrack || formattedAudioTracks[0]; + setSelectedAudioTrack({ type: SelectedTrackType.INDEX, value: selectedTrack.id }); + if (DEBUG_MODE) { - logger.log(`[AndroidVideoPlayer] Using system auto-selection for ${formattedAudioTracks.length} audio tracks`); - logger.log(`[AndroidVideoPlayer] Available tracks:`, formattedAudioTracks.map((t: any) => `${t.name} (${t.language})`)); + if (englishTrack) { + logger.log(`[AndroidVideoPlayer] Auto-selected English audio track: ${selectedTrack.name} (ID: ${selectedTrack.id})`); + } else { + logger.log(`[AndroidVideoPlayer] No English track found, auto-selected first audio track: ${selectedTrack.name} (ID: ${selectedTrack.id})`); + } } - // Keep using system selection } if (DEBUG_MODE) { @@ -1771,7 +1783,7 @@ const AndroidVideoPlayer: React.FC = () => { logger.log(`[AndroidVideoPlayer] Selecting audio track:`, trackSelection); logger.log(`[AndroidVideoPlayer] Available tracks:`, rnVideoAudioTracks); } - + // Validate track selection if (trackSelection.type === SelectedTrackType.INDEX) { const trackExists = rnVideoAudioTracks.some(track => track.id === trackSelection.value); @@ -1779,34 +1791,34 @@ const AndroidVideoPlayer: React.FC = () => { logger.error(`[AndroidVideoPlayer] Audio track ${trackSelection.value} not found in available tracks`); return; } - + // Check if the selected track might have codec compatibility issues const selectedTrack = rnVideoAudioTracks.find(track => track.id === trackSelection.value); if (selectedTrack) { const trackName = (selectedTrack.name || '').toLowerCase(); - const hasHeavyCodec = trackName.includes('truehd') || trackName.includes('dts') || trackName.includes('atmos') || + const hasHeavyCodec = trackName.includes('truehd') || trackName.includes('dts') || trackName.includes('atmos') || trackName.includes('eac3') || trackName.includes('dolby') || trackName.includes('hdma'); - + if (hasHeavyCodec) { // Show toast warning about potential codec issues showCodecUnsupportedToast(`Audio codec may not be supported on this device. Try selecting a different track if playback fails.`); } } } - + // If changing tracks, briefly pause to allow smooth transition const wasPlaying = !paused; if (wasPlaying) { setPaused(true); } - + // Set the new audio track setSelectedAudioTrack(trackSelection); - + if (DEBUG_MODE) { logger.log(`[AndroidVideoPlayer] Audio track changed to:`, trackSelection); } - + // Resume playback after a brief delay if it was playing if (wasPlaying) { setTimeout(() => { @@ -1820,6 +1832,12 @@ const AndroidVideoPlayer: React.FC = () => { } }; + // Wrapper function to convert number to SelectedTrack for modal usage + const selectAudioTrackById = (trackId: number) => { + const trackSelection: SelectedTrack = { type: SelectedTrackType.INDEX, value: trackId }; + selectAudioTrack(trackSelection); + }; + const selectTextTrack = (trackId: number) => { if (trackId === -999) { setUseCustomSubtitles(true); @@ -2982,7 +3000,7 @@ const AndroidVideoPlayer: React.FC = () => { zoomScale={zoomScale} currentResizeMode={resizeMode} vlcAudioTracks={rnVideoAudioTracks} - selectedAudioTrack={selectedAudioTrack} + selectedAudioTrack={selectedAudioTrack?.type === SelectedTrackType.INDEX && selectedAudioTrack.value !== undefined ? Number(selectedAudioTrack.value) : null} availableStreams={availableStreams} togglePlayback={togglePlayback} skip={skip} @@ -3621,8 +3639,8 @@ const AndroidVideoPlayer: React.FC = () => { showAudioModal={showAudioModal} setShowAudioModal={setShowAudioModal} vlcAudioTracks={rnVideoAudioTracks} - selectedAudioTrack={selectedAudioTrack} - selectAudioTrack={selectAudioTrack} + selectedAudioTrack={selectedAudioTrack?.type === SelectedTrackType.INDEX && selectedAudioTrack.value !== undefined ? Number(selectedAudioTrack.value) : null} + selectAudioTrack={selectAudioTrackById} /> ; - selectedAudioTrack: SelectedTrack | null; + selectedAudioTrack: number | null; availableStreams?: { [providerId: string]: { streams: any[]; addonName: string } }; togglePlayback: () => void; skip: (seconds: number) => void; @@ -180,7 +179,9 @@ export const PlayerControls: React.FC = ({ {(() => { - const trackName = getTrackDisplayName(vlcAudioTracks.find(t => t.id === (selectedAudioTrack?.type === SelectedTrackType.INDEX ? selectedAudioTrack.value : null)) || {id: -1, name: 'Default'}); + const trackName = getTrackDisplayName( + vlcAudioTracks.find(t => t.id === selectedAudioTrack) || { id: -1, name: 'Default' } + ); // Truncate long audio track names to prevent UI cramping const maxLength = 12; // Limit to 12 characters return trackName.length > maxLength ? `${trackName.substring(0, maxLength)}...` : trackName; diff --git a/src/components/player/modals/AudioTrackModal.tsx b/src/components/player/modals/AudioTrackModal.tsx index f9dff24..58fade0 100644 --- a/src/components/player/modals/AudioTrackModal.tsx +++ b/src/components/player/modals/AudioTrackModal.tsx @@ -9,14 +9,13 @@ import Animated, { } from 'react-native-reanimated'; import { getTrackDisplayName, DEBUG_MODE } from '../utils/playerUtils'; import { logger } from '../../../utils/logger'; -import { SelectedTrack, SelectedTrackType } from 'react-native-video'; interface AudioTrackModalProps { showAudioModal: boolean; setShowAudioModal: (show: boolean) => void; vlcAudioTracks: Array<{id: number, name: string, language?: string}>; - selectedAudioTrack: SelectedTrack | null; - selectAudioTrack: (trackSelection: SelectedTrack) => void; + selectedAudioTrack: number | null; + selectAudioTrack: (trackId: number) => void; } const { width } = Dimensions.get('window'); @@ -38,15 +37,13 @@ export const AudioTrackModal: React.FC = ({ if (showAudioModal && DEBUG_MODE) { logger.log(`[AudioTrackModal] Modal opened with selectedAudioTrack:`, selectedAudioTrack); logger.log(`[AudioTrackModal] Available tracks:`, vlcAudioTracks); - if (selectedAudioTrack?.type === 'index' && selectedAudioTrack.value !== undefined) { - const selectedTrack = vlcAudioTracks.find(track => track.id === selectedAudioTrack.value); + if (typeof selectedAudioTrack === 'number') { + const selectedTrack = vlcAudioTracks.find(track => track.id === selectedAudioTrack); if (selectedTrack) { logger.log(`[AudioTrackModal] Selected track found: ${selectedTrack.name} (${selectedTrack.language})`); } else { - logger.warn(`[AudioTrackModal] Selected track ${selectedAudioTrack.value} not found in available tracks`); + logger.warn(`[AudioTrackModal] Selected track ${selectedAudioTrack} not found in available tracks`); } - } else if (selectedAudioTrack?.type === 'system') { - logger.log(`[AudioTrackModal] Using system auto-selection`); } } }, [showAudioModal, selectedAudioTrack, vlcAudioTracks]); @@ -152,16 +149,8 @@ export const AudioTrackModal: React.FC = ({ {vlcAudioTracks.map((track) => { // Determine if track is selected - let isSelected = false; - if (selectedAudioTrack?.type === 'index' && selectedAudioTrack.value === track.id) { - isSelected = true; - } else if (selectedAudioTrack?.type === 'system' && track.id === vlcAudioTracks[0]?.id) { - // Show first track as selected when using system selection - isSelected = true; - } - - // All tracks are now available for selection - + const isSelected = selectedAudioTrack === track.id; + return ( = ({ if (DEBUG_MODE) { logger.log(`[AudioTrackModal] Selecting track: ${track.id} (${track.name})`); } - selectAudioTrack({ type: SelectedTrackType.INDEX, value: track.id }); + selectAudioTrack(track.id); // Close modal after selection setTimeout(() => { setShowAudioModal(false);