• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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