mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-01-11 20:10:25 +00:00
Audio selection bug fixes
This commit is contained in:
parent
2dd2b7fc0b
commit
8d488298cf
3 changed files with 46 additions and 38 deletions
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue