OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "webkit/plugins/ppapi/ppb_audio_input_impl.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "ppapi/c/dev/ppb_audio_input_dev.h" | |
9 #include "ppapi/c/pp_completion_callback.h" | |
10 #include "ppapi/c/ppb_audio_config.h" | |
11 #include "ppapi/c/trusted/ppb_audio_input_trusted_dev.h" | |
12 #include "ppapi/shared_impl/resource_tracker.h" | |
13 #include "ppapi/thunk/enter.h" | |
14 #include "ppapi/thunk/ppb_audio_config_api.h" | |
15 #include "ppapi/thunk/thunk.h" | |
16 #include "webkit/plugins/ppapi/common.h" | |
17 #include "webkit/plugins/ppapi/resource_helper.h" | |
18 | |
19 using ppapi::PpapiGlobals; | |
20 using ppapi::thunk::EnterResourceNoLock; | |
21 using ppapi::thunk::PPB_AudioInput_API; | |
22 using ppapi::thunk::PPB_AudioConfig_API; | |
23 | |
24 namespace webkit { | |
25 namespace ppapi { | |
26 | |
27 // PPB_AudioInput_Impl --------------------------------------------------------- | |
28 | |
29 PPB_AudioInput_Impl::PPB_AudioInput_Impl(PP_Instance instance) | |
30 : Resource(instance), | |
31 audio_input_(NULL) { | |
32 } | |
33 | |
34 PPB_AudioInput_Impl::~PPB_AudioInput_Impl() { | |
35 // Calling ShutDown() makes sure StreamCreated cannot be called anymore and | |
36 // releases the audio data associated with the pointer. Note however, that | |
37 // until ShutDown returns, StreamCreated may still be called. This will be | |
38 // OK since we'll just immediately clean up the data it stored later in this | |
39 // destructor. | |
40 if (audio_input_) { | |
41 audio_input_->ShutDown(); | |
42 audio_input_ = NULL; | |
43 } | |
44 } | |
45 | |
46 // static | |
47 PP_Resource PPB_AudioInput_Impl::Create(PP_Instance instance, | |
48 PP_Resource config, | |
49 PPB_AudioInput_Callback audio_input_callback, | |
50 void* user_data) { | |
51 scoped_refptr<PPB_AudioInput_Impl> | |
52 audio_input(new PPB_AudioInput_Impl(instance)); | |
dmichael (off chromium)
2011/11/17 18:24:04
nit: I'm used to seeing 4 space indent here ^^^
viettrungluu
2011/11/21 21:26:13
Done.
| |
53 if (!audio_input->Init(config, audio_input_callback, user_data)) | |
54 return 0; | |
55 return audio_input->GetReference(); | |
56 } | |
57 | |
58 PPB_AudioInput_API* PPB_AudioInput_Impl::AsPPB_AudioInput_API() { | |
59 return this; | |
60 } | |
61 | |
62 bool PPB_AudioInput_Impl::Init(PP_Resource config, | |
63 PPB_AudioInput_Callback callback, | |
64 void* user_data) { | |
65 // Validate the config and keep a reference to it. | |
66 EnterResourceNoLock<PPB_AudioConfig_API> enter(config, true); | |
67 if (enter.failed()) | |
68 return false; | |
69 config_ = config; | |
70 | |
71 if (!callback) | |
72 return false; | |
73 SetCallback(callback, user_data); | |
74 | |
75 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this); | |
76 if (!plugin_delegate) | |
77 return false; | |
78 | |
79 // When the stream is created, we'll get called back on StreamCreated(). | |
80 CHECK(!audio_input_); | |
81 audio_input_ = plugin_delegate->CreateAudioInput( | |
82 enter.object()->GetSampleRate(), | |
83 enter.object()->GetSampleFrameCount(), | |
84 this); | |
85 return audio_input_ != NULL; | |
86 } | |
87 | |
88 PP_Resource PPB_AudioInput_Impl::GetCurrentConfig() { | |
89 // AddRef on behalf of caller, while keeping a ref for ourselves. | |
90 PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(config_); | |
91 return config_; | |
92 } | |
93 | |
94 PP_Bool PPB_AudioInput_Impl::StartCapture() { | |
95 if (!audio_input_) | |
96 return PP_FALSE; | |
97 if (capturing()) | |
98 return PP_TRUE; | |
99 SetStartCaptureState(); | |
100 return BoolToPPBool(audio_input_->StartCapture()); | |
101 } | |
102 | |
103 PP_Bool PPB_AudioInput_Impl::StopCapture() { | |
104 if (!audio_input_) | |
105 return PP_FALSE; | |
106 if (!capturing()) | |
107 return PP_TRUE; | |
108 if (!audio_input_->StopCapture()) | |
109 return PP_FALSE; | |
110 SetStopCaptureState(); | |
111 return PP_TRUE; | |
112 } | |
113 | |
114 int32_t PPB_AudioInput_Impl::OpenTrusted(PP_Resource config, | |
115 PP_CompletionCallback create_callback) { | |
116 // Validate the config and keep a reference to it. | |
117 EnterResourceNoLock<PPB_AudioConfig_API> enter(config, true); | |
118 if (enter.failed()) | |
119 return PP_ERROR_FAILED; | |
120 config_ = config; | |
121 | |
122 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this); | |
123 if (!plugin_delegate) | |
124 return PP_ERROR_FAILED; | |
125 | |
126 // When the stream is created, we'll get called back on StreamCreated(). | |
127 DCHECK(!audio_input_); | |
128 audio_input_ = plugin_delegate->CreateAudioInput( | |
129 enter.object()->GetSampleRate(), | |
130 enter.object()->GetSampleFrameCount(), | |
131 this); | |
132 | |
133 if (!audio_input_) | |
134 return PP_ERROR_FAILED; | |
135 | |
136 // At this point, we are guaranteeing ownership of the completion | |
137 // callback. Audio promises to fire the completion callback | |
138 // once and only once. | |
139 SetCallbackInfo(true, create_callback); | |
140 return PP_OK_COMPLETIONPENDING; | |
141 } | |
142 | |
143 int32_t PPB_AudioInput_Impl::GetSyncSocket(int* sync_socket) { | |
144 return GetSyncSocketImpl(sync_socket); | |
145 } | |
146 | |
147 int32_t PPB_AudioInput_Impl::GetSharedMemory(int* shm_handle, | |
148 uint32_t* shm_size) { | |
149 return GetSharedMemoryImpl(shm_handle, shm_size); | |
150 } | |
151 | |
152 void PPB_AudioInput_Impl::OnSetStreamInfo( | |
153 base::SharedMemoryHandle shared_memory_handle, | |
154 size_t shared_memory_size, | |
155 base::SyncSocket::Handle socket_handle) { | |
156 SetStreamInfo(shared_memory_handle, shared_memory_size, socket_handle); | |
157 } | |
158 | |
159 } // namespace ppapi | |
160 } // namespace webkit | |
OLD | NEW |