1 /*
2  * Copyright (c) 2020-2021 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 
16 #ifndef PLAYER_AUDIO_SINK_H
17 #define PLAYER_AUDIO_SINK_H
18 
19 #include <memory>
20 #include <vector>
21 #include <mutex>
22 #include "player_sink_type.h"
23 #include "player_define.h"
24 #include "codec_type.h"
25 #include "player_sync.h"
26 #include "audio_manager.h"
27 #include "decoder.h"
28 using namespace std;
29 
30 namespace OHOS {
31 namespace Media {
32 class PlayerSync;
33 class AudioSink {
34 public:
35     AudioSink();
36     ~AudioSink();
37     int32_t Init(SinkAttr &atrr);
38     void DeInit(void);
39     int32_t Start(void);
40     int32_t Stop(void);
41     int32_t Flush(void);
42     int32_t Reset(void);
43     int32_t Pause(void);
44     int32_t Resume(void);
45     int32_t SetSpeed(float speed);
46     int32_t GetSpeed(float &speed);
47     int32_t GetState(int32_t &state);
48     int32_t RenderFrame(PlayerBufferInfo &frame);
49     void SetRenderMode(RenderMode mode);
50     int32_t SetVolume(float left, float right);
51     int32_t GetVolume(float &left, float &right);
52     int32_t SetMute(bool mute);
53     int32_t GetMute(bool &mute);
54     void SetSync(PlayerSync *sync);
55     int32_t SetParam(const char *key, dataType type, void* value);
56     int32_t GetParam(const char *key, dataType type, void* value);
57     int32_t RegisterCallBack(PlayEventCallback &callback);
58     void GetStatus(AudioSinkStatus &status);
59     void RenderEos(void);
60     int DequeReleaseFrame(PlayerBufferInfo &frame);
61     void GetRenderPosition(int64_t &position);
62     void SetAudioStreamType(int32_t &type);
63 
64 private:
65     void ResetRendStartTime();
66     void SendAudioEndOfStream();
67     void UpdateAudioPts(int64_t lastPts, int64_t& timestamp, CodecBuffer &renderFrame);
68     int GetRenderFrame(PlayerBufferInfo &renderFrame, const PlayerBufferInfo &frame);
69     void ReleaseQueHeadFrame(void);
70     void ReleaseQueAllFrame(void);
71     void RenderRptEvent(EventCbType event);
72     int32_t WriteToAudioDevice(CodecBuffer &renderFrame);
73     void QueueRenderFrame(const PlayerBufferInfo &frame, bool cacheQueue);
74 
75     bool started_;
76     bool paused_;
77     bool eosSended_;
78     uint64_t rendFrameCnt_;
79     uint64_t lastRendFrameCnt_;
80     bool pauseAfterPlay_;
81     SinkAttr attr_;
82     PlayerSync *syncHdl_;
83     RenderMode renderMode_;
84     int64_t rendStartTime_;
85     int64_t lastRendPts_;
86     int64_t lastRendSysTimeMs_;
87     uint32_t renderDelay_;
88     PlayEventCallback callBack_;
89     float leftVolume_;
90     float rightVolume_;
91     int64_t eosPts_;
92     bool receivedEos_;
93     std::mutex mutex_;
94     std::vector<PlayerBufferInfo> frameCacheQue_;
95     std::vector<PlayerBufferInfo> frameReleaseQue_;
96     struct AudioManager *audioManager_;
97     struct AudioAdapter *audioAdapter_;
98     struct AudioRender *audioRender_;
99     AudioPort renderPort_;
100     bool reportedFirstFrame;
101     int32_t audioStreamType_;
102 };
103 }  // namespace Media
104 }  // namespace OHOS
105 
106 #endif  // PLAYER_SINK_H
107