118 lines
3.3 KiB
TypeScript
118 lines
3.3 KiB
TypeScript
import {audio} from '@kit.AudioKit';
|
|
import { hilog } from '@kit.PerformanceAnalysisKit';
|
|
|
|
const TAG = 'AudioCapturer';
|
|
|
|
/**
|
|
* Audio collector tool
|
|
*/
|
|
export default class AudioCapturer {
|
|
/**
|
|
* Collector object
|
|
*/
|
|
private mAudioCapturer = null;
|
|
|
|
/**
|
|
* Audio Data Callback Method
|
|
*/
|
|
private mDataCallBack: (data: ArrayBuffer) => void = null;
|
|
|
|
/**
|
|
* Indicates whether recording data can be obtained.
|
|
*/
|
|
private mCanWrite: boolean = true;
|
|
|
|
/**
|
|
* Audio stream information
|
|
*/
|
|
private audioStreamInfo = {
|
|
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
|
|
channels: audio.AudioChannel.CHANNEL_1,
|
|
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
|
|
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
|
|
}
|
|
|
|
/**
|
|
* Audio collector information
|
|
*/
|
|
private audioCapturerInfo = {
|
|
source: audio.SourceType.SOURCE_TYPE_MIC,
|
|
capturerFlags: 0
|
|
}
|
|
|
|
/**
|
|
* Audio Collector Option Information
|
|
*/
|
|
private audioCapturerOptions = {
|
|
streamInfo: this.audioStreamInfo,
|
|
capturerInfo: this.audioCapturerInfo
|
|
}
|
|
|
|
/**
|
|
* Initialize
|
|
* @param audioListener
|
|
*/
|
|
public async init(dataCallBack: (data: ArrayBuffer) => void) {
|
|
if (null != this.mAudioCapturer) {
|
|
hilog.error(0x0000, TAG, 'AudioCapturerUtil already init');
|
|
return;
|
|
}
|
|
this.mDataCallBack = dataCallBack;
|
|
this.mAudioCapturer = await audio.createAudioCapturer(this.audioCapturerOptions).catch(error => {
|
|
hilog.error(0x0000, TAG, `AudioCapturerUtil init createAudioCapturer failed, code is ${error.code}, message is ${error.message}`);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* start recording
|
|
*/
|
|
public async start() {
|
|
hilog.error(0x0000, TAG, `AudioCapturerUtil start`);
|
|
let stateGroup = [audio.AudioState.STATE_PREPARED, audio.AudioState.STATE_PAUSED, audio.AudioState.STATE_STOPPED];
|
|
if (stateGroup.indexOf(this.mAudioCapturer.state) === -1) {
|
|
hilog.error(0x0000, TAG, `AudioCapturerUtil start failed`);
|
|
return;
|
|
}
|
|
this.mCanWrite = true;
|
|
await this.mAudioCapturer.start();
|
|
while (this.mCanWrite) {
|
|
let bufferSize = await this.mAudioCapturer.getBufferSize();
|
|
let buffer = await this.mAudioCapturer.read(bufferSize, true);
|
|
this.mDataCallBack(buffer)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* stop recording
|
|
*/
|
|
public async stop() {
|
|
if (this.mAudioCapturer.state !== audio.AudioState.STATE_RUNNING && this.mAudioCapturer.state !== audio.AudioState.STATE_PAUSED) {
|
|
hilog.error(0x0000, TAG, `AudioCapturerUtil stop Capturer is not running or paused`);
|
|
return;
|
|
}
|
|
this.mCanWrite = false;
|
|
await this.mAudioCapturer.stop();
|
|
if (this.mAudioCapturer.state === audio.AudioState.STATE_STOPPED) {
|
|
hilog.info(0x0000, TAG, `AudioCapturerUtil Capturer stopped`);
|
|
} else {
|
|
hilog.error(0x0000, TAG, `Capturer stop failed`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* release
|
|
*/
|
|
public async release() {
|
|
if (this.mAudioCapturer.state === audio.AudioState.STATE_RELEASED || this.mAudioCapturer.state === audio.AudioState.STATE_NEW) {
|
|
hilog.error(0x0000, TAG, `Capturer already released`);
|
|
return;
|
|
}
|
|
await this.mAudioCapturer.release();
|
|
this.mAudioCapturer = null;
|
|
if (this.mAudioCapturer.state == audio.AudioState.STATE_RELEASED) {
|
|
hilog.info(0x0000, TAG, `Capturer released`);
|
|
} else {
|
|
hilog.error(0x0000, TAG, `Capturer release failed`);
|
|
}
|
|
}
|
|
} |