1f6603c60Sopenharmony_ci/*
2f6603c60Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License.
5f6603c60Sopenharmony_ci * You may obtain a copy of the License at
6f6603c60Sopenharmony_ci *
7f6603c60Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f6603c60Sopenharmony_ci *
9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and
13f6603c60Sopenharmony_ci * limitations under the License.
14f6603c60Sopenharmony_ci */
15f6603c60Sopenharmony_ci
16f6603c60Sopenharmony_ciimport media from '@ohos.multimedia.media'
17f6603c60Sopenharmony_ciimport * as mediaTestBase from './MediaTestBase.js';
18f6603c60Sopenharmony_ci
19f6603c60Sopenharmony_ciexport function playAudioSource(src, duration, playTime, checkSeekTime, done) {
20f6603c60Sopenharmony_ci    console.info(`case media source url: ${src}`)
21f6603c60Sopenharmony_ci    let volumeChanged = false;
22f6603c60Sopenharmony_ci    let playCount = 0;
23f6603c60Sopenharmony_ci    let pauseCount = 0;
24f6603c60Sopenharmony_ci    let stopCount = 0;
25f6603c60Sopenharmony_ci    let seekCount = 0;
26f6603c60Sopenharmony_ci    let seekEOS = false;
27f6603c60Sopenharmony_ci    let audioPlayer = media.createAudioPlayer();
28f6603c60Sopenharmony_ci    if (audioPlayer == null) {
29f6603c60Sopenharmony_ci        console.error('case createAudioPlayer failed');
30f6603c60Sopenharmony_ci        expect().assertFail();
31f6603c60Sopenharmony_ci        done();
32f6603c60Sopenharmony_ci    }
33f6603c60Sopenharmony_ci    if (typeof (src) == 'string') {
34f6603c60Sopenharmony_ci        console.error('case src test');
35f6603c60Sopenharmony_ci        audioPlayer.src = src;
36f6603c60Sopenharmony_ci    } else {
37f6603c60Sopenharmony_ci        console.error('case fdsrc test');
38f6603c60Sopenharmony_ci        audioPlayer.fdSrc = src;
39f6603c60Sopenharmony_ci    }
40f6603c60Sopenharmony_ci    audioPlayer.on('dataLoad', () => {
41f6603c60Sopenharmony_ci        console.info('case set source success');
42f6603c60Sopenharmony_ci        expect(audioPlayer.state).assertEqual('idle');
43f6603c60Sopenharmony_ci        expect(audioPlayer.currentTime).assertEqual(0);
44f6603c60Sopenharmony_ci        expect(Math.abs(audioPlayer.duration - duration)).assertLess(500);
45f6603c60Sopenharmony_ci        // step 0: dataLoad -> play
46f6603c60Sopenharmony_ci        audioPlayer.play();
47f6603c60Sopenharmony_ci    });
48f6603c60Sopenharmony_ci    audioPlayer.on('play', () => {
49f6603c60Sopenharmony_ci        console.info('case start to play');
50f6603c60Sopenharmony_ci        expect(audioPlayer.state).assertEqual('playing');
51f6603c60Sopenharmony_ci        playCount++;
52f6603c60Sopenharmony_ci        if (playCount == 1) {
53f6603c60Sopenharmony_ci            // step 1: play -> seek duration/3
54f6603c60Sopenharmony_ci            audioPlayer.seek(audioPlayer.duration / 3);
55f6603c60Sopenharmony_ci            // step 2: seek duration/3 -> pause
56f6603c60Sopenharmony_ci            audioPlayer.pause();
57f6603c60Sopenharmony_ci        } else if (playCount == 2) {
58f6603c60Sopenharmony_ci            // step 5: play -> seek duration when loop is true
59f6603c60Sopenharmony_ci            audioPlayer.loop = true;
60f6603c60Sopenharmony_ci            audioPlayer.seek(audioPlayer.duration);
61f6603c60Sopenharmony_ci            // step 6: seek duration -> setVolume + seek duration when loop is false
62f6603c60Sopenharmony_ci            console.info('case state 2 is :' + audioPlayer.state);
63f6603c60Sopenharmony_ci            expect(audioPlayer.state).assertEqual('playing');
64f6603c60Sopenharmony_ci            audioPlayer.loop = false;
65f6603c60Sopenharmony_ci            audioPlayer.setVolume(0.5);
66f6603c60Sopenharmony_ci            audioPlayer.seek(audioPlayer.duration);
67f6603c60Sopenharmony_ci            seekEOS = true;
68f6603c60Sopenharmony_ci            // step 7: wait for finish
69f6603c60Sopenharmony_ci        } else if (playCount == 3) {
70f6603c60Sopenharmony_ci            // step 9: play -> stop
71f6603c60Sopenharmony_ci            audioPlayer.stop();
72f6603c60Sopenharmony_ci        } else {
73f6603c60Sopenharmony_ci            // step 12: play -> pause
74f6603c60Sopenharmony_ci            audioPlayer.pause();
75f6603c60Sopenharmony_ci        }
76f6603c60Sopenharmony_ci    });
77f6603c60Sopenharmony_ci     audioPlayer.on('pause', () => {
78f6603c60Sopenharmony_ci        console.info('case now is paused');
79f6603c60Sopenharmony_ci        expect(audioPlayer.state).assertEqual('paused');
80f6603c60Sopenharmony_ci        pauseCount++;
81f6603c60Sopenharmony_ci        if (pauseCount == 1) {
82f6603c60Sopenharmony_ci            // step 3: pause -> seek 0
83f6603c60Sopenharmony_ci            audioPlayer.seek(0);
84f6603c60Sopenharmony_ci            // step 4: seek 0 -> play
85f6603c60Sopenharmony_ci            audioPlayer.play();
86f6603c60Sopenharmony_ci        } else {
87f6603c60Sopenharmony_ci            // step 13: pause -> stop
88f6603c60Sopenharmony_ci            audioPlayer.stop();
89f6603c60Sopenharmony_ci        }
90f6603c60Sopenharmony_ci    });
91f6603c60Sopenharmony_ci    audioPlayer.on('stop', () => {
92f6603c60Sopenharmony_ci        console.info('case stop success');
93f6603c60Sopenharmony_ci        expect(audioPlayer.state).assertEqual('stopped');
94f6603c60Sopenharmony_ci        stopCount++;
95f6603c60Sopenharmony_ci        if (stopCount == 1) {
96f6603c60Sopenharmony_ci            // step 10: stop -> reset
97f6603c60Sopenharmony_ci            audioPlayer.reset();
98f6603c60Sopenharmony_ci        } else {
99f6603c60Sopenharmony_ci            // step 14: stop -> release
100f6603c60Sopenharmony_ci            expect(volumeChanged).assertEqual(true);
101f6603c60Sopenharmony_ci            audioPlayer.release();
102f6603c60Sopenharmony_ci            done();
103f6603c60Sopenharmony_ci        }
104f6603c60Sopenharmony_ci    });
105f6603c60Sopenharmony_ci    audioPlayer.on('reset', () => {
106f6603c60Sopenharmony_ci        console.info('case reset success');
107f6603c60Sopenharmony_ci        expect(audioPlayer.state).assertEqual('idle');
108f6603c60Sopenharmony_ci        // step 11: reset -> dataLoad
109f6603c60Sopenharmony_ci        if (typeof (src) == 'string') {
110f6603c60Sopenharmony_ci            console.error('case src test');
111f6603c60Sopenharmony_ci            audioPlayer.src = src;
112f6603c60Sopenharmony_ci        } else {
113f6603c60Sopenharmony_ci            console.error('case fdsrc test');
114f6603c60Sopenharmony_ci            audioPlayer.fdSrc = src;
115f6603c60Sopenharmony_ci        }
116f6603c60Sopenharmony_ci    });
117f6603c60Sopenharmony_ci    audioPlayer.on('volumeChange', () => {
118f6603c60Sopenharmony_ci        console.info('case set volume success ');
119f6603c60Sopenharmony_ci        volumeChanged = true;
120f6603c60Sopenharmony_ci    });
121f6603c60Sopenharmony_ci    audioPlayer.on('finish', () => {
122f6603c60Sopenharmony_ci        console.info('case play end');
123f6603c60Sopenharmony_ci        expect(audioPlayer.state).assertEqual('stopped');
124f6603c60Sopenharmony_ci        expect(seekEOS).assertTrue();
125f6603c60Sopenharmony_ci        // step 8: play when stream is end
126f6603c60Sopenharmony_ci        audioPlayer.play();
127f6603c60Sopenharmony_ci    });
128f6603c60Sopenharmony_ci    audioPlayer.on('error', (err) => {
129f6603c60Sopenharmony_ci        console.error(`case error called,errMessage is ${err.message}`);
130f6603c60Sopenharmony_ci        audioPlayer.release();
131f6603c60Sopenharmony_ci        expect().assertFail();
132f6603c60Sopenharmony_ci        done();
133f6603c60Sopenharmony_ci    });
134f6603c60Sopenharmony_ci}