1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import media from '@ohos.multimedia.media'; 17import Logger from './Logger'; 18import resourceManager from '@ohos.resourceManager'; 19import { BusinessError } from '@ohos.base'; 20 21const TAG = '[AudioPlayer]'; 22 23class AudioPlayer { 24 private avPlayer; 25 26 private setAVPlayerCallback(): void { 27 this.avPlayer.reset(); 28 this.avPlayer.on('stateChange', async (state) => { 29 switch (state) { 30 case 'idle': 31 Logger.info(TAG, 'state idle called'); 32 break; 33 case 'initialized': 34 Logger.info(TAG, 'state initialized called '); 35 this.avPlayer.prepare().then(() => { 36 Logger.info(TAG, 'prepare success'); 37 }, (err) => { 38 Logger.info(TAG, 'prepare filed,error message is :' + err.message); 39 }); 40 break; 41 case 'prepared': 42 Logger.info(TAG, 'state prepared called'); 43 this.avPlayer.play(); 44 break; 45 case 'playing': 46 Logger.info(TAG, 'state playing called'); 47 break; 48 case 'completed': 49 Logger.info(TAG, 'state completed called'); 50 this.avPlayer.stop(); 51 break; 52 case 'stopped': 53 Logger.info(TAG, 'state stopped called'); 54 this.avPlayer.reset(); 55 break; 56 case 'error': 57 Logger.info(TAG, 'state error called'); 58 break; 59 default: 60 Logger.info(TAG, 'unknown state :' + state); 61 break; 62 } 63 }); 64 } 65 66 async playAudio(audioName: string): Promise<void> { 67 if (this.avPlayer) { 68 await this.avPlayer.reset(); 69 } else { 70 this.avPlayer = await media.createAVPlayer(); 71 this.setAVPlayerCallback(); 72 } 73 let rawFd = undefined; 74 await globalThis.getContext() 75 .resourceManager 76 .getRawFd(audioName) 77 .then(value => { 78 rawFd = value; 79 Logger.info(TAG, 'get audio resource successful'); 80 Logger.info(TAG, 'rawFd of audio:' + ' fd:' + rawFd.fd + ', offset:' + rawFd.offset + ', length: ' + rawFd.length); 81 }) 82 .catch((error: BusinessError) => { 83 Logger.info(TAG, 'get audio resource failed, err code:' + error.code + ' err msg:' + error.message); 84 }); 85 this.avPlayer.fdSrc = rawFd; 86 } 87} 88 89export default new AudioPlayer; 90