4
4
AudioBuffer ,
5
5
AudioContext ,
6
6
AudioBufferSourceNode ,
7
- AudioBufferStreamSourceNode ,
8
7
AudioManager ,
9
8
} from 'react-native-audio-api' ;
10
9
@@ -26,16 +25,13 @@ const AudioFile: FC = () => {
26
25
const [ isLoading , setIsLoading ] = useState ( false ) ;
27
26
28
27
const [ offset , setOffset ] = useState ( 0 ) ;
29
- const [ playbackRate , setPlaybackRate ] = useState ( INITIAL_RATE * 1.5 ) ;
28
+ const [ playbackRate , setPlaybackRate ] = useState ( INITIAL_RATE ) ;
30
29
const [ detune , setDetune ] = useState ( INITIAL_DETUNE ) ;
31
30
32
- const [ audioBuffers , setAudioBuffers ] = useState < AudioBuffer [ ] > ( [ ] ) ;
31
+ const [ audioBuffer , setAudioBuffer ] = useState < AudioBuffer | null > ( null ) ;
33
32
34
33
const audioContextRef = useRef < AudioContext | null > ( null ) ;
35
34
const bufferSourceRef = useRef < AudioBufferSourceNode | null > ( null ) ;
36
- const bufferStreamSourceRef = useRef < AudioBufferStreamSourceNode | null > (
37
- null
38
- ) ;
39
35
40
36
const handlePlaybackRateChange = ( newValue : number ) => {
41
37
setPlaybackRate ( newValue ) ;
@@ -59,28 +55,39 @@ const AudioFile: FC = () => {
59
55
}
60
56
61
57
if ( isPlaying ) {
62
- bufferStreamSourceRef . current ?. stop ( audioContextRef . current . currentTime ) ;
58
+ bufferSourceRef . current ?. stop ( audioContextRef . current . currentTime ) ;
63
59
AudioManager . setLockScreenInfo ( {
64
60
state : 'state_paused' ,
65
61
} ) ;
66
62
} else {
67
- if ( ! audioBuffers ) {
63
+ if ( ! audioBuffer ) {
68
64
fetchAudioBuffer ( ) ;
69
65
}
70
66
71
- const now = audioContextRef . current . currentTime ;
67
+ AudioManager . setLockScreenInfo ( {
68
+ state : 'state_playing' ,
69
+ } ) ;
72
70
73
- bufferStreamSourceRef . current =
74
- audioContextRef . current . createBufferStreamSource ( ) ;
75
- for ( let i = 0 ; i < audioBuffers . length ; i ++ ) {
76
- bufferStreamSourceRef . current . enqueueAudioBuffer ( audioBuffers [ i ] ) ;
77
- }
71
+ AudioManager . observeAudioInterruptions ( true ) ;
78
72
79
- bufferStreamSourceRef . current . connect (
80
- audioContextRef . current . destination
73
+ bufferSourceRef . current = audioContextRef . current . createBufferSource ( {
74
+ pitchCorrection : true ,
75
+ } ) ;
76
+ bufferSourceRef . current . buffer = audioBuffer ;
77
+ bufferSourceRef . current . loop = true ;
78
+ bufferSourceRef . current . onended = ( event ) => {
79
+ setOffset ( ( _prev ) => event . value || 0 ) ;
80
+ } ;
81
+ bufferSourceRef . current . loopStart = LOOP_START ;
82
+ bufferSourceRef . current . loopEnd = LOOP_END ;
83
+ bufferSourceRef . current . playbackRate . value = playbackRate ;
84
+ bufferSourceRef . current . detune . value = detune ;
85
+ bufferSourceRef . current . connect ( audioContextRef . current . destination ) ;
86
+
87
+ bufferSourceRef . current . start (
88
+ audioContextRef . current . currentTime ,
89
+ offset
81
90
) ;
82
- bufferStreamSourceRef . current . playbackRate . value = playbackRate ;
83
- bufferStreamSourceRef . current . start ( now ) ;
84
91
}
85
92
86
93
setIsPlaying ( ( prev ) => ! prev ) ;
@@ -99,37 +106,7 @@ const AudioFile: FC = () => {
99
106
return null ;
100
107
} ) ;
101
108
102
- if ( ! buffer ) {
103
- setIsLoading ( false ) ;
104
- return ;
105
- }
106
-
107
- const data = buffer . getChannelData ( 0 ) ;
108
- const buffers : AudioBuffer [ ] = [ ] ;
109
-
110
- for ( let i = 0 ; i < 25 ; i ++ ) {
111
- const buffer1 = audioContextRef . current ! . createBuffer (
112
- buffer . numberOfChannels ,
113
- buffer . sampleRate ,
114
- buffer . sampleRate
115
- ) ;
116
-
117
- const channelData = buffer1 . getChannelData ( 0 ) ;
118
-
119
- for ( let j = 0 ; j < buffer . sampleRate ; j ++ ) {
120
- channelData [ j ] = data [ j + i * buffer . sampleRate ] ;
121
- }
122
-
123
- // if (i === 1) {
124
- // for (let j = 0; j < 1000; j++) {
125
- // console.log(channelData[j]);
126
- // }
127
- // }
128
-
129
- buffers . push ( buffer1 ) ;
130
- }
131
-
132
- setAudioBuffers ( buffers ) ;
109
+ setAudioBuffer ( buffer ) ;
133
110
134
111
setIsLoading ( false ) ;
135
112
} , [ ] ) ;
@@ -194,7 +171,7 @@ const AudioFile: FC = () => {
194
171
< Button
195
172
title = { isPlaying ? 'Stop' : 'Play' }
196
173
onPress = { handlePress }
197
- disabled = { audioBuffers . length === 0 }
174
+ disabled = { ! audioBuffer }
198
175
/>
199
176
< Spacer . Vertical size = { 49 } />
200
177
< Slider
0 commit comments