Audio selection bug fixes

This commit is contained in:
tapframe 2025-09-17 12:30:47 +05:30
parent 2dd2b7fc0b
commit 8d488298cf
3 changed files with 46 additions and 38 deletions

View file

@ -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}
/>
<SubtitleModals
showSubtitleModal={showSubtitleModal}

View file

@ -3,7 +3,6 @@ import { View, Text, TouchableOpacity, Animated, StyleSheet, Platform } from 're
import { Ionicons } from '@expo/vector-icons';
import { LinearGradient } from 'expo-linear-gradient';
import Slider from '@react-native-community/slider';
import { SelectedTrack, SelectedTrackType } from 'react-native-video';
import { styles } from '../utils/playerStyles';
import { getTrackDisplayName } from '../utils/playerUtils';
import { useTheme } from '../../../contexts/ThemeContext';
@ -25,7 +24,7 @@ interface PlayerControlsProps {
zoomScale: number;
currentResizeMode?: string;
vlcAudioTracks: Array<{id: number, name: string, language?: string}>;
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<PlayerControlsProps> = ({
<Ionicons name="volume-high" size={20} color={vlcAudioTracks.length <= 1 ? 'grey' : 'white'} />
<Text style={[styles.bottomButtonText, vlcAudioTracks.length <= 1 && {color: 'grey'}]} numberOfLines={1}>
{(() => {
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;

View file

@ -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<AudioTrackModalProps> = ({
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<AudioTrackModalProps> = ({
<View style={{ gap: 8 }}>
{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 (
<TouchableOpacity
key={track.id}
@ -176,7 +165,7 @@ export const AudioTrackModal: React.FC<AudioTrackModalProps> = ({
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);