Skip to content

Commit 7930dda

Browse files
committed
feat: integrate react-native-track-player for audio playback and enhance voice chat functionality
1 parent c13bf3c commit 7930dda

6 files changed

Lines changed: 198 additions & 130 deletions

File tree

index.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import "./gesture-handler";
22
import "@expo/metro-runtime";
33
import { registerRootComponent } from "expo";
44
import "fast-text-encoding";
5+
import TrackPlayer from "react-native-track-player";
6+
import { PlaybackService } from "./src/services/PlaybackService";
57

68
// Importa Insights
79
import * as Insights from 'expo-insights';
@@ -15,4 +17,7 @@ import App from "./src/navigation";
1517
// // Configurazione extra se necessaria in futuro
1618
// }
1719

18-
registerRootComponent(App);
20+
registerRootComponent(App);
21+
22+
// Registra il playback service per react-native-track-player
23+
TrackPlayer.registerPlaybackService(() => PlaybackService);

package-lock.json

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
"react-native-safe-area-context": "5.4.0",
8282
"react-native-screens": "~4.11.1",
8383
"react-native-svg": "15.11.2",
84+
"react-native-track-player": "^4.1.2",
8485
"react-native-vector-icons": "^10.2.0",
8586
"react-native-web": "^0.20.0",
8687
"react-native-webview": "13.13.5"

src/hooks/useVoiceChat.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,12 +244,14 @@ export function useVoiceChat() {
244244
break;
245245

246246
case 'audio_end':
247-
// Server ha finito di inviare chunk audio per questo segmento
247+
// Server ha finito di inviare chunk audio per questo segmento.
248+
// Con TrackPlayer la riproduzione è già in corso in streaming.
249+
// Segnaliamo che non arriveranno altri chunk per gestire il completamento.
248250
if (audioPlayerRef.current && audioPlayerRef.current.getChunksCount() > 0) {
249251
setState('speaking');
250-
console.log(`[useVoiceChat] Avvio riproduzione audio (${audioPlayerRef.current.getChunksCount()} chunk) - mantengo auto-mute`);
251-
audioPlayerRef.current.playPcm16Chunks(() => {
252-
console.log('[useVoiceChat] Riproduzione completata');
252+
console.log(`[useVoiceChat] audio_end ricevuto (${audioPlayerRef.current.getChunksCount()} chunk) - riproduzione streaming in corso`);
253+
audioPlayerRef.current.signalAllChunksReceived(() => {
254+
console.log('[useVoiceChat] Riproduzione streaming completata');
253255
// Riattiva il microfono SOLO se l'agent ha finito completamente
254256
if (agentEndedRef.current) {
255257
console.log('[useVoiceChat] Agent finito, auto-unmute e riavvio registrazione');
@@ -322,8 +324,14 @@ export function useVoiceChat() {
322324

323325
onAudioChunk: (audioData: string, chunkIndex: number) => {
324326
if (audioPlayerRef.current) {
325-
audioPlayerRef.current.addChunk(audioData, chunkIndex);
327+
// Aggiunge il chunk alla queue di TrackPlayer e avvia riproduzione streaming
328+
audioPlayerRef.current.addChunk(audioData, chunkIndex).catch(err => {
329+
console.error('[useVoiceChat] Errore aggiunta chunk a TrackPlayer:', err);
330+
});
326331
setChunksReceived(prev => prev + 1);
332+
333+
// Transiziona a 'speaking' al primo chunk ricevuto
334+
setState(prev => prev !== 'speaking' ? 'speaking' : prev);
327335
}
328336
},
329337

src/services/PlaybackService.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import TrackPlayer, { Event } from 'react-native-track-player';
2+
3+
/**
4+
* Playback service per react-native-track-player.
5+
* Gestisce gli eventi remoti (notifiche, lockscreen, bluetooth).
6+
*/
7+
export const PlaybackService = async function () {
8+
TrackPlayer.addEventListener(Event.RemotePlay, () => TrackPlayer.play());
9+
TrackPlayer.addEventListener(Event.RemotePause, () => TrackPlayer.pause());
10+
TrackPlayer.addEventListener(Event.RemoteStop, () => TrackPlayer.stop());
11+
};

0 commit comments

Comments
 (0)