/
useRecorder.tsx
49 lines (41 loc) · 1.1 KB
/
useRecorder.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import { Recorder, Types } from "expo-audio-streaming";
import { useState, useCallback, useEffect } from "react";
export const useRecorder = ({
onNewBuffer,
}: {
/**
* Callback when a new buffer is recorded
* @param event.buffer The base64 encoded buffer
*/
onNewBuffer?: (event: Types.RecorderNewBufferEvent) => void;
} = {}) => {
const [recording, setRecording] = useState(false);
const [buffer, setBuffer] = useState<string[]>([]);
const start = useCallback(async () => {
Recorder.start();
setRecording(true);
}, [setRecording]);
const stop = useCallback(() => {
Recorder.stop();
setRecording(false);
}, [setRecording]);
const _onNewBuffer = useCallback(
(event: Types.RecorderNewBufferEvent) => {
setBuffer((prev) => [...prev, event.buffer]);
onNewBuffer?.(event);
},
[onNewBuffer, setBuffer]
);
useEffect(() => {
const onNewBufferListener = Recorder.addOnNewBufferListener(_onNewBuffer);
return () => {
onNewBufferListener.remove();
};
}, [_onNewBuffer]);
return {
start,
stop,
buffer,
recording,
};
};