fixup! Reset dump values when pause function is called
[platform/core/api/audio-io.git] / include / CAudioIO.h
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __TIZEN_MEDIA_AUDIO_IO_CAUDIO_IO_H__
18 #define __TIZEN_MEDIA_AUDIO_IO_CAUDIO_IO_H__
19
20 #ifdef __cplusplus
21
22 #include <sound_manager.h>
23 #include <mutex>
24 #include <condition_variable>
25
26 namespace tizen_media_audio {
27
28
29     /**
30      *  Abstract Class
31      *  You can't take this object directly.
32      */
33     class IPulseStreamListener;
34     class CAudioIO : public IPulseStreamListener {
35     public:
36         struct SStreamCallback {
37             void* mUserData {};
38             void (*onStream)(size_t nbytes, void* user_data) {};
39
40             void set(void (*callback)(size_t, void*), void* userdata) {
41                 onStream = callback;
42                 mUserData = userdata;
43             }
44
45             void unset() {
46                 onStream = nullptr;
47                 mUserData = nullptr;
48             }
49         };
50
51         struct SStateChangedCallback {
52             void* mUserData {};
53             void (*onStateChanged)(CAudioInfo::EAudioIOState state, CAudioInfo::EAudioIOState statePrev, bool byPolicy, void* user_data) {};
54
55             void set(void (*callback)(CAudioInfo::EAudioIOState, CAudioInfo::EAudioIOState, bool, void*), void* userdata) {
56                 onStateChanged = callback;
57                 mUserData = userdata;
58             }
59
60             void unset() {
61                 onStateChanged = nullptr;
62                 mUserData = nullptr;
63             }
64         };
65
66         /* Constructor & Destructor */
67         explicit CAudioIO(CAudioInfo& audioInfo);
68         virtual ~CAudioIO() = default;
69
70         /* Implemented Handlers */
71         virtual void onStream(CPulseAudioClient* pClient, size_t length);
72         virtual void onStateChanged(CAudioInfo::EAudioIOState state, bool byPolicy);
73         virtual void onStateChanged(CAudioInfo::EAudioIOState state);
74         virtual void onCorked(CPulseAudioClient* pClient, bool corked);
75
76         /* Methods */
77         virtual void initialize();
78         virtual void finalize();
79         virtual void prepare();
80         virtual void unprepare();
81         virtual void pause();
82         virtual void resume();
83         virtual void flush();
84         virtual int  getBufferSize() = 0;
85
86         CAudioInfo& getAudioInfo();
87
88         virtual void setStreamCallback(SStreamCallback callback);
89         SStreamCallback getStreamCallback();
90
91         virtual void setStateChangedCallback(SStateChangedCallback callback);
92         SStateChangedCallback getStateChangedCallback();
93
94         void setStreamInfo(sound_stream_info_h stream_info);
95
96         void setState(CAudioInfo::EAudioIOState state);
97         CAudioInfo::EAudioIOState getState() noexcept;
98
99     protected:
100         /* Protected Methods */
101         virtual void setInit(bool flag);
102         virtual bool isInit();
103         virtual bool IsReady();
104
105         CPulseAudioClient*    mpPulseAudioClient {};
106         CAudioInfo            mAudioInfo;
107
108         SStreamCallback       mStreamCallback;
109         SStateChangedCallback mStateChangedCallback;
110
111         CAudioInfo::EAudioDirection mDirection { CAudioInfo::EAudioDirection::AUDIO_DIRECTION_MAX };
112         CAudioInfo::EAudioIOState mState { CAudioInfo::EAudioIOState::AUDIO_IO_STATE_NONE };
113         CAudioInfo::EAudioIOState mStatePrev { CAudioInfo::EAudioIOState::AUDIO_IO_STATE_NONE };
114         bool                  mByPolicy {};
115         std::timed_mutex      mMutex;
116         std::mutex            mCondMutex;
117         std::condition_variable mCond;
118
119     private:
120         bool                  __mIsInit {};
121     };
122
123
124 } /* namespace tizen_media_audio */
125
126 #endif
127 #endif /* __TIZEN_MEDIA_AUDIO_IO_CAUDIO_IO_H__ */