Skip to content

Commit f4c4206

Browse files
zhangmengjiaZhangMeng
andauthored
fix:修复音频播放、录制相关状态问题 (#11)
Co-authored-by: ZhangMeng <n030236@archermind.com>
1 parent 7a4f17b commit f4c4206

File tree

2 files changed

+42
-23
lines changed

2 files changed

+42
-23
lines changed

harmony/audio_toolkit/src/main/ets/RNCAudioPlayerTurboModule.ts

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ interface PlayConfig {
3636
looping?: boolean;
3737
speed?: number;
3838
autoDestroy?: boolean;
39-
continueToPlayInBackground?: boolean;
39+
continuesToPlayInBackground?: boolean;
4040
}
4141

4242
interface PlayInfo {
@@ -45,7 +45,7 @@ interface PlayInfo {
4545
}
4646

4747
interface Error {
48-
err: string;
48+
err?: string;
4949
message?: string;
5050
}
5151

@@ -143,10 +143,13 @@ export class RCTAudioPlayerTurboModule extends TurboModule {
143143

144144
pauseOnBackground(): void {
145145
this.playConfigMap.forEach((config, playerId) => {
146-
if (!config.continueToPlayInBackground) {
146+
if (!config.continuesToPlayInBackground) {
147147
const player = this.playerMap.get(playerId);
148148
if (player) {
149149
player.pause();
150+
this.toEmit(playerId, 'pause', {
151+
message: 'Playback paused due toBackground',
152+
});
150153
}
151154
}
152155
});
@@ -163,7 +166,7 @@ export class RCTAudioPlayerTurboModule extends TurboModule {
163166
});
164167
}
165168

166-
setAVPlayerCallback(avPlayer: media.AVPlayer, playerId: number): void {
169+
setAVPlayerCallback(avPlayer: media.AVPlayer, playerId: number, next: (object?) => void): void {
167170
// seek操作结果回调函数
168171
avPlayer.on('seekDone', (seekDoneTime: number) => {
169172
logger.debug(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
@@ -178,7 +181,7 @@ export class RCTAudioPlayerTurboModule extends TurboModule {
178181
avPlayer.reset(); // 调用reset重置资源,触发idle状态
179182
});
180183
// 状态机变化回调函数
181-
this.avPlayerStateChangeCallback(avPlayer, playerId);
184+
this.avPlayerStateChangeCallback(avPlayer, playerId, next);
182185
avPlayer.on('seekDone', () => {
183186
const call = this.playSeekCallbacks.get(playerId);
184187
if (call) {
@@ -229,7 +232,7 @@ export class RCTAudioPlayerTurboModule extends TurboModule {
229232
});
230233
}
231234

232-
avPlayerStateChangeCallback(avPlayer: media.AVPlayer, playerId: number): void {
235+
avPlayerStateChangeCallback(avPlayer: media.AVPlayer, playerId: number, next: (object?) => void): void {
233236
avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
234237
logger.debug(`stateChange:${state}`);
235238
switch (state) {
@@ -242,6 +245,7 @@ export class RCTAudioPlayerTurboModule extends TurboModule {
242245
case StateChange.PREPARED: // prepare调用成功后上报该状态机
243246
logger.debug(`prepared called.to and apply config and play`);
244247
this.applyConfig(playerId);
248+
next(null);
245249
break;
246250
case StateChange.PLAYING: // play成功调用后触发该状态机上报
247251
break;
@@ -272,11 +276,11 @@ export class RCTAudioPlayerTurboModule extends TurboModule {
272276
});
273277
}
274278

275-
async createPlayer(pathStr: string, playerId: number): Promise<void> {
279+
async createPlayer(pathStr: string, playerId: number, next: (object?) => void): Promise<void> {
276280
logger.debug(`createPlayer path:${pathStr}`);
277281
try {
278282
const avPlayer: media.AVPlayer = await media.createAVPlayer();
279-
this.setAVPlayerCallback(avPlayer, playerId);
283+
this.setAVPlayerCallback(avPlayer, playerId, next);
280284
if (pathStr.startsWith(this.HTTP_START)) {
281285
avPlayer.url = pathStr;
282286
} else {
@@ -312,39 +316,47 @@ export class RCTAudioPlayerTurboModule extends TurboModule {
312316
}
313317
}
314318

315-
prepare(playerId: number, path: string, option: PlayConfig, next: () => void): void {
319+
prepare(playerId: number, path: string, option: PlayConfig, next: (object?) => void): void {
316320
logger.debug(`prepare start`);
317321
this.setConfig(playerId, option);
318-
this.createPlayer(path, playerId).then(() => {
319-
next();
322+
this.createPlayer(path, playerId, next).then(() => {
320323
});
321324
}
322325

323-
checkPlayer(playerId: number, next: (err?: string) => void): boolean {
326+
checkPlayer(playerId: number, next: (object?) => void): boolean {
324327
const hasPlayer = this.playerMap.has(playerId);
325328
if (hasPlayer) {
326329
return true;
327330
} else {
328-
next?.('not found player');
331+
logger.debug('not found player')
332+
let err: Error = {
333+
err: 'not found player',
334+
message: 'not found media player',
335+
};
336+
next?.(err);
329337
return false;
330338
}
331339
}
332340

333-
async play(playerId: number, callback: (err: string, result?: PlayInfo) => void): Promise<void> {
341+
async play(playerId: number, callback: (object?, result?: PlayInfo) => void): Promise<void> {
334342
try {
335343
logger.debug(`play start`);
336344
if (!this.checkPlayer(playerId, callback)) {
337345
return;
338346
}
339347
const player = this.getPlayer(playerId);
340348
await player.play();
341-
callback('', this.getInfo(playerId));
349+
callback(null, this.getInfo(playerId));
342350
} catch (e) {
343-
callback?.(`player call play function err:${JSON.stringify(e)}`);
351+
let err: Error = {
352+
err: 'player function err',
353+
message: `player call play function err:${JSON.stringify(e)}`,
354+
};
355+
callback?.(err, this.getInfo(playerId));
344356
}
345357
}
346358

347-
async pause(playerId: number, callback: (err: string, result?: PlayInfo) => void): Promise<void> {
359+
async pause(playerId: number, callback: (object?, result?: PlayInfo) => void): Promise<void> {
348360
logger.debug(`pause start`);
349361
if (!this.checkPlayer(playerId, callback)) {
350362
return;
@@ -354,7 +366,7 @@ export class RCTAudioPlayerTurboModule extends TurboModule {
354366
this.toEmit(playerId, 'pause', {
355367
message: 'player paused',
356368
});
357-
callback('', this.getInfo(playerId));
369+
callback(null, this.getInfo(playerId));
358370
}
359371

360372
async stop(playerId: number, callback: () => void): Promise<void> {

harmony/audio_toolkit/src/main/ets/RNCAudioRecorderTurboModule.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,18 @@ const PERMISSIONS: Array<Permissions> = [
3737
'ohos.permission.MICROPHONE',
3838
];
3939

40+
interface Error {
41+
err?: string;
42+
message?: string;
43+
}
44+
4045
export class RCTAudioRecorderTurboModule extends TurboModule {
4146
private _file: fs.File;
4247
// 音频参数
4348
private avRecorder: media.AVRecorder | undefined = undefined;
4449
private avProfile: media.AVRecorderProfile;
4550
private avConfig: media.AVRecorderConfig;
46-
private readonly AUDIOBITRATE_DEFAULT = 100000;
51+
private readonly AUDIOBITRATE_DEFAULT = 48000;
4752
private readonly AUDIOCHANNELS_DEFAULT = 2;
4853
private readonly AUDIOSAMPLERATE = 48000;
4954
private readonly FD_PATH = 'fd://';
@@ -107,11 +112,13 @@ export class RCTAudioRecorderTurboModule extends TurboModule {
107112
await this.avRecorder.prepare(this.avConfig);
108113
await this.avRecorder.start();
109114
next(null, audioSaveResult[0]);
115+
} else {
116+
next(null);
110117
}
111118
});
112119
});
113120
} catch (error) {
114-
next(error);
121+
next(null);
115122
}
116123
}
117124

@@ -134,10 +141,10 @@ export class RCTAudioRecorderTurboModule extends TurboModule {
134141
this.avRecorder = await media.createAVRecorder();
135142
this.setAudioRecorderCallback(recorderId);
136143
this.avProfile = {
137-
audioBitrate: option.bitRate || this.AUDIOBITRATE_DEFAULT, // 音频比特率
138-
audioChannels: option.channels || this.AUDIOCHANNELS_DEFAULT, // 音频声道数
144+
audioBitrate: option.bitRate ?? this.AUDIOBITRATE_DEFAULT, // 音频比特率
145+
audioChannels: option.channels ?? this.AUDIOCHANNELS_DEFAULT, // 音频声道数
139146
audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前只支持aac
140-
audioSampleRate: this.AUDIOSAMPLERATE, // 音频采样率
147+
audioSampleRate: option.sampleRate ?? this.AUDIOSAMPLERATE, // 音频采样率
141148
fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前只支持m4a
142149
};
143150
this.avConfig = {

0 commit comments

Comments
 (0)