move __IsReady function into the critical section
[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             SStreamCallback() : mUserData(nullptr), onStream(nullptr) {
41                 /* Empty Body */
42             }
43
44             void set(void (*callback)(size_t, void*), void* userdata) {
45                 onStream = callback;
46                 mUserData = userdata;
47             }
48
49             void unset() {
50                 onStream = nullptr;
51                 mUserData = nullptr;
52             }
53         };
54
55         struct SStateChangedCallback {
56             void* mUserData;
57             void (*onStateChanged)(CAudioInfo::EAudioIOState state, CAudioInfo::EAudioIOState statePrev, bool byPolicy, void* user_data);
58
59             SStateChangedCallback() : mUserData(nullptr), onStateChanged(nullptr) {
60                 /* Empty Body */
61             }
62
63             void set(void (*callback)(CAudioInfo::EAudioIOState, CAudioInfo::EAudioIOState, bool, void*), void* userdata) {
64                 onStateChanged = callback;
65                 mUserData = userdata;
66             }
67
68             void unset() {
69                 onStateChanged = nullptr;
70                 mUserData = nullptr;
71             }
72         };
73
74         /* Constructor & Destructor */
75         CAudioIO();
76         explicit CAudioIO(CAudioInfo& audioInfo);
77         virtual ~CAudioIO() = default;
78
79         /* Implemented Handlers */
80         virtual void onStream(CPulseAudioClient* pClient, size_t length);
81         virtual void onStateChanged(CAudioInfo::EAudioIOState state, bool byPolicy);
82         virtual void onStateChanged(CAudioInfo::EAudioIOState state);
83
84         /* Methods */
85         virtual void initialize();
86         virtual void finalize();
87         virtual void prepare();
88         virtual void unprepare();
89         virtual void pause();
90         virtual void resume();
91         virtual void flush();
92         virtual int  getBufferSize() = 0;
93
94         CAudioInfo& getAudioInfo();
95
96         virtual void setStreamCallback(SStreamCallback callback);
97         SStreamCallback getStreamCallback();
98
99         virtual void setStateChangedCallback(SStateChangedCallback callback);
100         SStateChangedCallback getStateChangedCallback();
101
102         void setStreamInfo(sound_stream_info_h stream_info);
103
104         void setState(CAudioInfo::EAudioIOState state);
105         CAudioInfo::EAudioIOState getState() noexcept;
106
107     protected:
108         /* Protected Methods */
109         virtual void setInit(bool flag);
110         virtual bool isInit();
111         virtual bool IsReady();
112
113         CPulseAudioClient*    mpPulseAudioClient;
114         CAudioInfo            mAudioInfo;
115
116         SStreamCallback       mStreamCallback;
117         SStateChangedCallback mStateChangedCallback;
118
119         CAudioInfo::EAudioDirection mDirection;
120         CAudioInfo::EAudioIOState mState;
121         CAudioInfo::EAudioIOState mStatePrev;
122         bool                  mByPolicy;
123         std::mutex            mMutex;
124         std::mutex            mCondMutex;
125         std::condition_variable mCond;
126
127     private:
128         bool                  __mIsInit;
129     };
130
131
132 } /* namespace tizen_media_audio */
133
134 #endif
135 #endif /* __TIZEN_MEDIA_AUDIO_IO_CAUDIO_IO_H__ */