blob: 8f0061faae7a80ec22a84edccd1085875b742e7a [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
niklas.enbom@webrtc.org5398d952012-03-26 08:11:25 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "voe_file_impl.h"
12
13#include "channel.h"
14#include "critical_section_wrapper.h"
15#include "file_wrapper.h"
16#include "media_file.h"
17#include "output_mixer.h"
18#include "trace.h"
19#include "transmit_mixer.h"
20#include "voe_errors.h"
21#include "voice_engine_impl.h"
22
23namespace webrtc {
24
25VoEFile* VoEFile::GetInterface(VoiceEngine* voiceEngine)
26{
27#ifndef WEBRTC_VOICE_ENGINE_FILE_API
28 return NULL;
29#else
30 if (NULL == voiceEngine)
31 {
32 return NULL;
33 }
tommi@webrtc.orga990e122012-04-26 15:28:22 +000034 VoiceEngineImpl* s = reinterpret_cast<VoiceEngineImpl*>(voiceEngine);
35 s->AddRef();
36 return s;
niklase@google.com470e71d2011-07-07 08:21:25 +000037#endif
38}
39
40#ifdef WEBRTC_VOICE_ENGINE_FILE_API
41
tommi@webrtc.org851becd2012-04-04 14:57:19 +000042VoEFileImpl::VoEFileImpl(voe::SharedData* shared) : _shared(shared)
niklase@google.com470e71d2011-07-07 08:21:25 +000043{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000044 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000045 "VoEFileImpl::VoEFileImpl() - ctor");
46}
47
48VoEFileImpl::~VoEFileImpl()
49{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000050 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000051 "VoEFileImpl::~VoEFileImpl() - dtor");
52}
53
niklase@google.com470e71d2011-07-07 08:21:25 +000054int VoEFileImpl::StartPlayingFileLocally(
55 int channel,
56 const char fileNameUTF8[1024],
57 bool loop, FileFormats format,
58 float volumeScaling,
59 int startPointMs,
60 int stopPointMs)
61{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000062 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000063 "StartPlayingFileLocally(channel=%d, fileNameUTF8[]=%s, "
64 "loop=%d, format=%d, volumeScaling=%5.3f, startPointMs=%d,"
65 " stopPointMs=%d)",
66 channel, fileNameUTF8, loop, format, volumeScaling,
67 startPointMs, stopPointMs);
68 assert(1024 == FileWrapper::kMaxFileNameSize);
tommi@webrtc.org851becd2012-04-04 14:57:19 +000069 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +000070 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +000071 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +000072 return -1;
73 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +000074 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +000075 voe::Channel* channelPtr = sc.ChannelPtr();
76 if (channelPtr == NULL)
77 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +000078 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +000079 "StartPlayingFileLocally() failed to locate channel");
80 return -1;
81 }
82
83 return channelPtr->StartPlayingFileLocally(fileNameUTF8,
84 loop,
85 format,
86 startPointMs,
87 volumeScaling,
88 stopPointMs,
89 NULL);
90}
91
92int VoEFileImpl::StartPlayingFileLocally(int channel,
93 InStream* stream,
94 FileFormats format,
95 float volumeScaling,
96 int startPointMs,
97 int stopPointMs)
98{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000099 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000100 "StartPlayingFileLocally(channel=%d, stream, format=%d, "
101 "volumeScaling=%5.3f, startPointMs=%d, stopPointMs=%d)",
102 channel, format, volumeScaling, startPointMs, stopPointMs);
103
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000104 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000105 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000106 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000107 return -1;
108 }
109
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000110 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000111 voe::Channel* channelPtr = sc.ChannelPtr();
112 if (channelPtr == NULL)
113 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000114 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000115 "StartPlayingFileLocally() failed to locate channel");
116 return -1;
117 }
118
119 return channelPtr->StartPlayingFileLocally(stream,
120 format,
121 startPointMs,
122 volumeScaling,
123 stopPointMs,
124 NULL);
125}
126
127int VoEFileImpl::StopPlayingFileLocally(int channel)
128{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000129 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000130 "StopPlayingFileLocally()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000131 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000132 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000133 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000134 return -1;
135 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000136 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000137 voe::Channel* channelPtr = sc.ChannelPtr();
138 if (channelPtr == NULL)
139 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000140 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000141 "StopPlayingFileLocally() failed to locate channel");
142 return -1;
143 }
144 return channelPtr->StopPlayingFileLocally();
145}
146
147int VoEFileImpl::IsPlayingFileLocally(int channel)
148{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000149 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000150 "IsPlayingFileLocally(channel=%d)", channel);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000151 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000152 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000153 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000154 return -1;
155 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000156 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000157 voe::Channel* channelPtr = sc.ChannelPtr();
158 if (channelPtr == NULL)
159 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000160 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000161 "StopPlayingFileLocally() failed to locate channel");
162 return -1;
163 }
164 return channelPtr->IsPlayingFileLocally();
165}
166
167int VoEFileImpl::ScaleLocalFilePlayout(int channel, float scale)
168{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000169 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000170 "ScaleLocalFilePlayout(channel=%d, scale=%5.3f)",
171 channel, scale);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000172 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000173 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000174 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000175 return -1;
176 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000177 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000178 voe::Channel* channelPtr = sc.ChannelPtr();
179 if (channelPtr == NULL)
180 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000181 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000182 "StopPlayingFileLocally() failed to locate channel");
183 return -1;
184 }
185 return channelPtr->ScaleLocalFilePlayout(scale);
186}
187
188int VoEFileImpl::StartPlayingFileAsMicrophone(int channel,
189 const char fileNameUTF8[1024],
190 bool loop,
191 bool mixWithMicrophone,
192 FileFormats format,
193 float volumeScaling)
194{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000195 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000196 "StartPlayingFileAsMicrophone(channel=%d, fileNameUTF8=%s, "
197 "loop=%d, mixWithMicrophone=%d, format=%d, "
198 "volumeScaling=%5.3f)",
199 channel, fileNameUTF8, loop, mixWithMicrophone, format,
200 volumeScaling);
201 assert(1024 == FileWrapper::kMaxFileNameSize);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000202 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000203 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000204 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000205 return -1;
206 }
207
208 const WebRtc_UWord32 startPointMs(0);
209 const WebRtc_UWord32 stopPointMs(0);
210
211 if (channel == -1)
212 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000213 int res = _shared->transmit_mixer()->StartPlayingFileAsMicrophone(
niklase@google.com470e71d2011-07-07 08:21:25 +0000214 fileNameUTF8,
215 loop,
216 format,
217 startPointMs,
218 volumeScaling,
219 stopPointMs,
220 NULL);
221 if (res)
222 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000223 WEBRTC_TRACE(kTraceError, kTraceVoice,
224 VoEId(_shared->instance_id(), -1),
225 "StartPlayingFileAsMicrophone() failed to start playing file");
niklase@google.com470e71d2011-07-07 08:21:25 +0000226 return(-1);
227 }
228 else
229 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000230 _shared->transmit_mixer()->SetMixWithMicStatus(mixWithMicrophone);
niklase@google.com470e71d2011-07-07 08:21:25 +0000231 return(0);
232 }
233 }
234 else
235 {
236 // Add file after demultiplexing <=> affects one channel only
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000237 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000238 voe::Channel* channelPtr = sc.ChannelPtr();
239 if (channelPtr == NULL)
240 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000241 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000242 "StartPlayingFileAsMicrophone() failed to locate channel");
243 return -1;
244 }
245
246 int res = channelPtr->StartPlayingFileAsMicrophone(fileNameUTF8,
247 loop,
248 format,
249 startPointMs,
250 volumeScaling,
251 stopPointMs,
252 NULL);
253 if (res)
254 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000255 WEBRTC_TRACE(kTraceError, kTraceVoice,
256 VoEId(_shared->instance_id(), -1),
257 "StartPlayingFileAsMicrophone() failed to start playing file");
niklase@google.com470e71d2011-07-07 08:21:25 +0000258 return -1;
259 }
260 else
261 {
262 channelPtr->SetMixWithMicStatus(mixWithMicrophone);
263 return 0;
264 }
265 }
266}
267
268int VoEFileImpl::StartPlayingFileAsMicrophone(int channel,
269 InStream* stream,
270 bool mixWithMicrophone,
271 FileFormats format,
272 float volumeScaling)
273{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000274 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000275 "StartPlayingFileAsMicrophone(channel=%d, stream,"
276 " mixWithMicrophone=%d, format=%d, volumeScaling=%5.3f)",
277 channel, mixWithMicrophone, format, volumeScaling);
278
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000279 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000280 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000281 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000282 return -1;
283 }
284
285 const WebRtc_UWord32 startPointMs(0);
286 const WebRtc_UWord32 stopPointMs(0);
287
288 if (channel == -1)
289 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000290 int res = _shared->transmit_mixer()->StartPlayingFileAsMicrophone(
niklase@google.com470e71d2011-07-07 08:21:25 +0000291 stream,
292 format,
293 startPointMs,
294 volumeScaling,
295 stopPointMs,
296 NULL);
297 if (res)
298 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000299 WEBRTC_TRACE(kTraceError, kTraceVoice,
300 VoEId(_shared->instance_id(), -1),
301 "StartPlayingFileAsMicrophone() failed to start "
302 "playing stream");
niklase@google.com470e71d2011-07-07 08:21:25 +0000303 return(-1);
304 }
305 else
306 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000307 _shared->transmit_mixer()->SetMixWithMicStatus(mixWithMicrophone);
niklase@google.com470e71d2011-07-07 08:21:25 +0000308 return(0);
309 }
310 }
311 else
312 {
313 // Add file after demultiplexing <=> affects one channel only
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000314 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000315 voe::Channel* channelPtr = sc.ChannelPtr();
316 if (channelPtr == NULL)
317 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000318 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000319 "StartPlayingFileAsMicrophone() failed to locate channel");
320 return -1;
321 }
322
323 int res = channelPtr->StartPlayingFileAsMicrophone(
324 stream, format, startPointMs, volumeScaling, stopPointMs, NULL);
325 if (res)
326 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000327 WEBRTC_TRACE(kTraceError, kTraceVoice,
328 VoEId(_shared->instance_id(), -1),
329 "StartPlayingFileAsMicrophone() failed to start "
330 "playing stream");
niklase@google.com470e71d2011-07-07 08:21:25 +0000331 return -1;
332 }
333 else
334 {
335 channelPtr->SetMixWithMicStatus(mixWithMicrophone);
336 return 0;
337 }
338 }
339}
340
341int VoEFileImpl::StopPlayingFileAsMicrophone(int channel)
342{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000343 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000344 "StopPlayingFileAsMicrophone(channel=%d)", channel);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000345 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000346 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000347 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000348 return -1;
349 }
350 if (channel == -1)
351 {
352 // Stop adding file before demultiplexing <=> affects all channels
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000353 return _shared->transmit_mixer()->StopPlayingFileAsMicrophone();
niklase@google.com470e71d2011-07-07 08:21:25 +0000354 }
355 else
356 {
357 // Stop adding file after demultiplexing <=> affects one channel only
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000358 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000359 voe::Channel* channelPtr = sc.ChannelPtr();
360 if (channelPtr == NULL)
361 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000362 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000363 "StopPlayingFileAsMicrophone() failed to locate channel");
364 return -1;
365 }
366 return channelPtr->StopPlayingFileAsMicrophone();
367 }
368}
369
370int VoEFileImpl::IsPlayingFileAsMicrophone(int channel)
371{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000372 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000373 "IsPlayingFileAsMicrophone(channel=%d)", channel);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000374 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000375 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000376 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000377 return -1;
378 }
379 if (channel == -1)
380 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000381 return _shared->transmit_mixer()->IsPlayingFileAsMicrophone();
niklase@google.com470e71d2011-07-07 08:21:25 +0000382 }
383 else
384 {
385 // Stop adding file after demultiplexing <=> affects one channel only
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000386 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000387 voe::Channel* channelPtr = sc.ChannelPtr();
388 if (channelPtr == NULL)
389 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000390 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000391 "IsPlayingFileAsMicrophone() failed to locate channel");
392 return -1;
393 }
394 return channelPtr->IsPlayingFileAsMicrophone();
395 }
396}
397
398int VoEFileImpl::ScaleFileAsMicrophonePlayout(int channel, float scale)
399{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000400 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000401 "ScaleFileAsMicrophonePlayout(channel=%d, scale=%5.3f)",
402 channel, scale);
403
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000404 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000405 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000406 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000407 return -1;
408 }
409 if (channel == -1)
410 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000411 return _shared->transmit_mixer()->ScaleFileAsMicrophonePlayout(scale);
niklase@google.com470e71d2011-07-07 08:21:25 +0000412 }
413 else
414 {
415 // Stop adding file after demultiplexing <=> affects one channel only
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000416 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000417 voe::Channel* channelPtr = sc.ChannelPtr();
418 if (channelPtr == NULL)
419 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000420 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000421 "IsPlayingFileAsMicrophone() failed to locate channel");
422 return -1;
423 }
424 return channelPtr->ScaleFileAsMicrophonePlayout(scale);
425 }
426}
427
428int VoEFileImpl::StartRecordingPlayout(
429 int channel, const char* fileNameUTF8, CodecInst* compression,
430 int maxSizeBytes)
431{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000432 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000433 "StartRecordingPlayout(channel=%d, fileNameUTF8=%s, "
434 "compression, maxSizeBytes=%d)",
435 channel, fileNameUTF8, maxSizeBytes);
436 assert(1024 == FileWrapper::kMaxFileNameSize);
437
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000438 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000439 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000440 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000441 return -1;
442 }
443 if (channel == -1)
444 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000445 return _shared->output_mixer()->StartRecordingPlayout
niklas.enbom@webrtc.org5398d952012-03-26 08:11:25 +0000446 (fileNameUTF8, compression);
niklase@google.com470e71d2011-07-07 08:21:25 +0000447 }
448 else
449 {
450 // Add file after demultiplexing <=> affects one channel only
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000451 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000452 voe::Channel* channelPtr = sc.ChannelPtr();
453 if (channelPtr == NULL)
454 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000455 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000456 "StartRecordingPlayout() failed to locate channel");
457 return -1;
458 }
459 return channelPtr->StartRecordingPlayout(fileNameUTF8, compression);
460 }
461}
462
463int VoEFileImpl::StartRecordingPlayout(
464 int channel, OutStream* stream, CodecInst* compression)
465{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000466 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000467 "StartRecordingPlayout(channel=%d, stream, compression)",
468 channel);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000469 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000470 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000471 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000472 return -1;
473 }
474 if (channel == -1)
475 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000476 return _shared->output_mixer()->
477 StartRecordingPlayout(stream, compression);
niklase@google.com470e71d2011-07-07 08:21:25 +0000478 }
479 else
480 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000481 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000482 voe::Channel* channelPtr = sc.ChannelPtr();
483 if (channelPtr == NULL)
484 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000485 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000486 "StartRecordingPlayout() failed to locate channel");
487 return -1;
488 }
489 return channelPtr->StartRecordingPlayout(stream, compression);
490 }
491}
492
493int VoEFileImpl::StopRecordingPlayout(int channel)
494{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000495 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000496 "StopRecordingPlayout(channel=%d)", channel);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000497 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000498 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000499 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000500 return -1;
501 }
502 if (channel == -1)
503 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000504 return _shared->output_mixer()->StopRecordingPlayout();
niklase@google.com470e71d2011-07-07 08:21:25 +0000505 }
506 else
507 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000508 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000509 voe::Channel* channelPtr = sc.ChannelPtr();
510 if (channelPtr == NULL)
511 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000512 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000513 "StopRecordingPlayout() failed to locate channel");
514 return -1;
515 }
516 return channelPtr->StopRecordingPlayout();
517 }
518}
519
520int VoEFileImpl::StartRecordingMicrophone(
521 const char* fileNameUTF8, CodecInst* compression, int maxSizeBytes)
522{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000523 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000524 "StartRecordingMicrophone(fileNameUTF8=%s, compression, "
525 "maxSizeBytes=%d)", fileNameUTF8, maxSizeBytes);
526 assert(1024 == FileWrapper::kMaxFileNameSize);
527
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000528 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000529 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000530 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000531 return -1;
532 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000533 if (_shared->transmit_mixer()->StartRecordingMicrophone(fileNameUTF8,
534 compression))
niklase@google.com470e71d2011-07-07 08:21:25 +0000535 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000536 WEBRTC_TRACE(kTraceError, kTraceVoice,
537 VoEId(_shared->instance_id(), -1),
538 "StartRecordingMicrophone() failed to start recording");
niklase@google.com470e71d2011-07-07 08:21:25 +0000539 return -1;
540 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000541 if (_shared->audio_device()->Recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000542 {
543 return 0;
544 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000545 if (!_shared->ext_recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000546 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000547 if (_shared->audio_device()->InitRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000548 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000549 WEBRTC_TRACE(kTraceError, kTraceVoice,
550 VoEId(_shared->instance_id(), -1),
551 "StartRecordingMicrophone() failed to initialize recording");
niklase@google.com470e71d2011-07-07 08:21:25 +0000552 return -1;
553 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000554 if (_shared->audio_device()->StartRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000555 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000556 WEBRTC_TRACE(kTraceError, kTraceVoice,
557 VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000558 "StartRecordingMicrophone() failed to start recording");
559 return -1;
560 }
561 }
562 return 0;
563}
564
565int VoEFileImpl::StartRecordingMicrophone(
566 OutStream* stream, CodecInst* compression)
567{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000568 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000569 "StartRecordingMicrophone(stream, compression)");
570
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000571 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000572 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000573 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000574 return -1;
575 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000576 if (_shared->transmit_mixer()->StartRecordingMicrophone(stream,
577 compression) == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000578 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000579 WEBRTC_TRACE(kTraceError, kTraceVoice,
580 VoEId(_shared->instance_id(), -1),
581 "StartRecordingMicrophone() failed to start recording");
niklase@google.com470e71d2011-07-07 08:21:25 +0000582 return -1;
583 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000584 if (_shared->audio_device()->Recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000585 {
586 return 0;
587 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000588 if (!_shared->ext_recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000589 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000590 if (_shared->audio_device()->InitRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000591 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000592 WEBRTC_TRACE(kTraceError, kTraceVoice,
593 VoEId(_shared->instance_id(), -1),
594 "StartRecordingMicrophone() failed to initialize recording");
niklase@google.com470e71d2011-07-07 08:21:25 +0000595 return -1;
596 }
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000597 if (_shared->audio_device()->StartRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000598 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000599 WEBRTC_TRACE(kTraceError, kTraceVoice,
600 VoEId(_shared->instance_id(), -1),
601 "StartRecordingMicrophone() failed to start recording");
niklase@google.com470e71d2011-07-07 08:21:25 +0000602 return -1;
603 }
604 }
605 return 0;
606}
607
608int VoEFileImpl::StopRecordingMicrophone()
609{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000610 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000611 "StopRecordingMicrophone()");
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000612 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000613 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000614 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000615 return -1;
616 }
braveyao@webrtc.org4de777b2012-06-15 02:37:53 +0000617
618 int err = 0;
619
620 // TODO(xians): consider removing Start/StopRecording() in
621 // Start/StopRecordingMicrophone() if no channel is recording.
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000622 if (_shared->NumOfSendingChannels() == 0 &&
623 _shared->audio_device()->Recording())
niklase@google.com470e71d2011-07-07 08:21:25 +0000624 {
625 // Stop audio-device recording if no channel is recording
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000626 if (_shared->audio_device()->StopRecording() != 0)
niklase@google.com470e71d2011-07-07 08:21:25 +0000627 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000628 _shared->SetLastError(VE_CANNOT_STOP_RECORDING, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000629 "StopRecordingMicrophone() failed to stop recording");
braveyao@webrtc.org4de777b2012-06-15 02:37:53 +0000630 err = -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000631 }
632 }
braveyao@webrtc.org4de777b2012-06-15 02:37:53 +0000633
634 if (_shared->transmit_mixer()->StopRecordingMicrophone() != 0)
635 {
636 WEBRTC_TRACE(kTraceError, kTraceVoice,
637 VoEId(_shared->instance_id(), -1),
638 "StopRecordingMicrophone() failed to stop recording to mixer");
639 err = -1;
640 }
641
642 return err;
niklase@google.com470e71d2011-07-07 08:21:25 +0000643}
644
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +0000645// TODO(andrew): a cursory inspection suggests there's a large amount of
646// overlap in these convert functions which could be refactored to a helper.
niklase@google.com470e71d2011-07-07 08:21:25 +0000647int VoEFileImpl::ConvertPCMToWAV(const char* fileNameInUTF8,
648 const char* fileNameOutUTF8)
649{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000650 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000651 "ConvertPCMToWAV(fileNameInUTF8=%s, fileNameOutUTF8=%s)",
652 fileNameInUTF8, fileNameOutUTF8);
653
654 // Create file player object
655 FilePlayer& playerObj(*FilePlayer::CreateFilePlayer(
656 -1,
657 kFileFormatPcm16kHzFile));
658
659 int res=playerObj.StartPlayingFile(fileNameInUTF8,false,0,1.0,0,0, NULL);
660 if (res)
661 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000662 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000663 "ConvertPCMToWAV failed to create player object");
664 playerObj.StopPlayingFile();
665 FilePlayer::DestroyFilePlayer(&playerObj);
666 return -1;
667 }
668
669 // Create file recorder object
670 FileRecorder& recObj(*FileRecorder::CreateFileRecorder(
671 -1, kFileFormatWavFile));
672
673 CodecInst codecInst;
674 strncpy(codecInst.plname,"L16",32);
675 codecInst.channels = 1;
676 codecInst.rate = 256000;
677 codecInst.plfreq = 16000;
678 codecInst.pltype = 94;
679 codecInst.pacsize = 160;
680
681 res = recObj.StartRecordingAudioFile(fileNameOutUTF8,codecInst,0);
682 if (res)
683 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000684 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000685 "ConvertPCMToWAV failed to create recorder object");
686 playerObj.StopPlayingFile();
687 FilePlayer::DestroyFilePlayer(&playerObj);
688 recObj.StopRecording();
689 FileRecorder::DestroyFileRecorder(&recObj);
690 return -1;
691 }
692
693 // Run throught the file
694 AudioFrame audioFrame;
695 WebRtc_Word16 decodedData[160];
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +0000696 int decLength=0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000697 const WebRtc_UWord32 frequency = 16000;
698
699 while(!playerObj.Get10msAudioFromFile(decodedData,decLength,frequency))
700 {
701 if(decLength!=frequency/100)
702 {
703 // This is an OK way to end
704 break;
705 }
706
707 res=audioFrame.UpdateFrame(-1, 0, decodedData,
708 (WebRtc_UWord16)decLength,
709 frequency, AudioFrame::kNormalSpeech,
710 AudioFrame::kVadActive);
711 if(res)
712 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000713 WEBRTC_TRACE(kTraceError, kTraceVoice,
714 VoEId(_shared->instance_id(), -1),
715 "ConvertPCMToWAV failed during conversion (audio frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +0000716 break;
717 }
718
719 res=recObj.RecordAudioToFile(audioFrame);
720 if(res)
721 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000722 WEBRTC_TRACE(kTraceError, kTraceVoice,
723 VoEId(_shared->instance_id(), -1),
724 "ConvertPCMToWAV failed during conversion (write frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +0000725 }
726 }
727
728 playerObj.StopPlayingFile();
729 recObj.StopRecording();
730 FilePlayer::DestroyFilePlayer(&playerObj);
731 FileRecorder::DestroyFileRecorder(&recObj);
732
733 return res;
734}
735
736int VoEFileImpl::ConvertPCMToWAV(InStream* streamIn, OutStream* streamOut)
737{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000738 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000739 "ConvertPCMToWAV(streamIn, streamOut)");
740
741 if ((streamIn == NULL) || (streamOut == NULL))
742 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000743 WEBRTC_TRACE(kTraceError, kTraceVoice,
744 VoEId(_shared->instance_id(), -1), "invalid stream handles");
niklase@google.com470e71d2011-07-07 08:21:25 +0000745 return (-1);
746 }
747
748 // Create file player object
749 FilePlayer& playerObj(*FilePlayer::CreateFilePlayer(-1,
750 kFileFormatPcm16kHzFile));
751 int res = playerObj.StartPlayingFile(*streamIn,0,1.0,0,0,NULL);
752 if (res)
753 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000754 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000755 "ConvertPCMToWAV failed to create player object");
756 playerObj.StopPlayingFile();
757 FilePlayer::DestroyFilePlayer(&playerObj);
758 return -1;
759 }
760
761 // Create file recorder object
762 FileRecorder& recObj(*FileRecorder::CreateFileRecorder(-1,
763 kFileFormatWavFile));
764 CodecInst codecInst;
765 strncpy(codecInst.plname, "L16", 32);
766 codecInst.channels = 1;
767 codecInst.rate = 256000;
768 codecInst.plfreq = 16000;
769 codecInst.pltype = 94;
770 codecInst.pacsize = 160;
771 res = recObj.StartRecordingAudioFile(*streamOut,codecInst,0);
772 if (res)
773 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000774 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000775 "ConvertPCMToWAV failed to create recorder object");
776 playerObj.StopPlayingFile();
777 FilePlayer::DestroyFilePlayer(&playerObj);
778 recObj.StopRecording();
779 FileRecorder::DestroyFileRecorder(&recObj);
780 return -1;
781 }
782
783 // Run throught the file
784 AudioFrame audioFrame;
785 WebRtc_Word16 decodedData[160];
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +0000786 int decLength=0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000787 const WebRtc_UWord32 frequency = 16000;
788
789 while(!playerObj.Get10msAudioFromFile(decodedData,decLength,frequency))
790 {
791 if(decLength!=frequency/100)
792 {
793 // This is an OK way to end
794 break;
795 }
796
797 res=audioFrame.UpdateFrame(-1, 0, decodedData,
798 (WebRtc_UWord16)decLength, frequency,
799 AudioFrame::kNormalSpeech,
800 AudioFrame::kVadActive);
801 if(res)
802 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000803 WEBRTC_TRACE(kTraceError, kTraceVoice,
804 VoEId(_shared->instance_id(), -1),
805 "ConvertPCMToWAV failed during conversion "
806 "(create audio frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +0000807 break;
808 }
809
810 res=recObj.RecordAudioToFile(audioFrame);
811 if(res)
812 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000813 WEBRTC_TRACE(kTraceError, kTraceVoice,
814 VoEId(_shared->instance_id(), -1),
815 "ConvertPCMToWAV failed during conversion (write frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +0000816 }
817 }
818
819 playerObj.StopPlayingFile();
820 recObj.StopRecording();
821 FilePlayer::DestroyFilePlayer(&playerObj);
822 FileRecorder::DestroyFileRecorder(&recObj);
823
824 return res;
825}
826
827int VoEFileImpl::ConvertWAVToPCM(const char* fileNameInUTF8,
828 const char* fileNameOutUTF8)
829{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000830 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000831 "ConvertWAVToPCM(fileNameInUTF8=%s, fileNameOutUTF8=%s)",
832 fileNameInUTF8, fileNameOutUTF8);
833
834 // Create file player object
835 FilePlayer& playerObj(*FilePlayer::CreateFilePlayer(-1,
836 kFileFormatWavFile));
837 int res = playerObj.StartPlayingFile(fileNameInUTF8,false,0,1.0,0,0,NULL);
838 if (res)
839 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000840 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000841 "ConvertWAVToPCM failed to create player object");
842 playerObj.StopPlayingFile();
843 FilePlayer::DestroyFilePlayer(&playerObj);
844 return -1;
845 }
846
847 // Create file recorder object
848 FileRecorder& recObj(*FileRecorder::CreateFileRecorder(
849 -1, kFileFormatPcm16kHzFile));
850
851 CodecInst codecInst;
852 strncpy(codecInst.plname,"L16",32);
853 codecInst.channels = 1;
854 codecInst.rate = 256000;
855 codecInst.plfreq = 16000;
856 codecInst.pltype = 94;
857 codecInst.pacsize = 160;
858
859 res = recObj.StartRecordingAudioFile(fileNameOutUTF8,codecInst,0);
860 if (res)
861 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000862 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000863 "ConvertWAVToPCM failed to create recorder object");
864 playerObj.StopPlayingFile();
865 FilePlayer::DestroyFilePlayer(&playerObj);
866 recObj.StopRecording();
867 FileRecorder::DestroyFileRecorder(&recObj);
868 return -1;
869 }
870
871 // Run throught the file
872 AudioFrame audioFrame;
873 WebRtc_Word16 decodedData[160];
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +0000874 int decLength=0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000875 const WebRtc_UWord32 frequency = 16000;
876
877 while(!playerObj.Get10msAudioFromFile(decodedData,decLength,frequency))
878 {
879 if(decLength!=frequency/100)
880 {
881 // This is an OK way to end
882 break;
883 }
884
885 res=audioFrame.UpdateFrame(-1, 0, decodedData,
886 (WebRtc_UWord16)decLength,
887 frequency, AudioFrame::kNormalSpeech,
888 AudioFrame::kVadActive);
889 if(res)
890 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000891 WEBRTC_TRACE(kTraceError, kTraceVoice,
892 VoEId(_shared->instance_id(), -1),
893 "ConvertWAVToPCM failed during conversion (audio frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +0000894 break;
895 }
896
897 res=recObj.RecordAudioToFile(audioFrame);
898 if(res)
899 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000900 WEBRTC_TRACE(kTraceError, kTraceVoice,
901 VoEId(_shared->instance_id(), -1),
902 "ConvertWAVToPCM failed during conversion (write frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +0000903 }
904 }
905
906 playerObj.StopPlayingFile();
907 recObj.StopRecording();
908 FilePlayer::DestroyFilePlayer(&playerObj);
909 FileRecorder::DestroyFileRecorder(&recObj);
910
911 return res;
912}
913
914int VoEFileImpl::ConvertWAVToPCM(InStream* streamIn, OutStream* streamOut)
915{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000916 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000917 "ConvertWAVToPCM(streamIn, streamOut)");
918
919 if ((streamIn == NULL) || (streamOut == NULL))
920 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000921 WEBRTC_TRACE(kTraceError, kTraceVoice,
922 VoEId(_shared->instance_id(), -1), "invalid stream handles");
niklase@google.com470e71d2011-07-07 08:21:25 +0000923 return (-1);
924 }
925
926 // Create file player object
927 FilePlayer& playerObj(*FilePlayer::CreateFilePlayer(-1,
928 kFileFormatWavFile));
929 int res = playerObj.StartPlayingFile(*streamIn,0,1.0,0,0,NULL);
930 if (res)
931 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000932 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000933 "ConvertWAVToPCM failed to create player object");
934 playerObj.StopPlayingFile();
935 FilePlayer::DestroyFilePlayer(&playerObj);
936 return -1;
937 }
938
939 // Create file recorder object
940 FileRecorder& recObj(*FileRecorder::CreateFileRecorder(
941 -1, kFileFormatPcm16kHzFile));
942
943 CodecInst codecInst;
944 strncpy(codecInst.plname,"L16",32);
945 codecInst.channels = 1;
946 codecInst.rate = 256000;
947 codecInst.plfreq = 16000;
948 codecInst.pltype = 94;
949 codecInst.pacsize = 160;
950
951 res = recObj.StartRecordingAudioFile(*streamOut,codecInst,0);
952 if (res)
953 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000954 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000955 "ConvertWAVToPCM failed to create recorder object");
956 playerObj.StopPlayingFile();
957 FilePlayer::DestroyFilePlayer(&playerObj);
958 recObj.StopRecording();
959 FileRecorder::DestroyFileRecorder(&recObj);
960 return -1;
961 }
962
963 // Run throught the file
964 AudioFrame audioFrame;
965 WebRtc_Word16 decodedData[160];
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +0000966 int decLength=0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000967 const WebRtc_UWord32 frequency = 16000;
968
969 while(!playerObj.Get10msAudioFromFile(decodedData,decLength,frequency))
970 {
971 if(decLength!=frequency/100)
972 {
973 // This is an OK way to end
974 break;
975 }
976
977 res=audioFrame.UpdateFrame(-1, 0, decodedData,
978 (WebRtc_UWord16)decLength, frequency,
979 AudioFrame::kNormalSpeech,
980 AudioFrame::kVadActive);
981 if(res)
982 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000983 WEBRTC_TRACE(kTraceError, kTraceVoice,
984 VoEId(_shared->instance_id(), -1),
985 "ConvertWAVToPCM failed during conversion (audio frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +0000986 break;
987 }
988
989 res=recObj.RecordAudioToFile(audioFrame);
990 if(res)
991 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000992 WEBRTC_TRACE(kTraceError, kTraceVoice,
993 VoEId(_shared->instance_id(), -1),
994 "ConvertWAVToPCM failed during conversion (write frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +0000995 }
996 }
997
998 playerObj.StopPlayingFile();
999 recObj.StopRecording();
1000 FilePlayer::DestroyFilePlayer(&playerObj);
1001 FileRecorder::DestroyFileRecorder(&recObj);
1002
1003 return res;
1004}
1005
1006int VoEFileImpl::ConvertPCMToCompressed(const char* fileNameInUTF8,
1007 const char* fileNameOutUTF8,
1008 CodecInst* compression)
1009{
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001010 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +00001011 "ConvertPCMToCompressed(fileNameInUTF8=%s, fileNameOutUTF8=%s"
1012 ", compression)", fileNameInUTF8, fileNameOutUTF8);
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001013 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +00001014 " compression: plname=%s, plfreq=%d, pacsize=%d",
1015 compression->plname, compression->plfreq,
1016 compression->pacsize);
1017
1018 // Create file player object
1019 FilePlayer& playerObj(*FilePlayer::CreateFilePlayer(
1020 -1,
1021 kFileFormatPcm16kHzFile));
1022 int res = playerObj.StartPlayingFile(fileNameInUTF8,false,0,1.0,0,0, NULL);
1023 if (res)
1024 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001025 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001026 "ConvertPCMToCompressed failed to create player object");
1027 // Clean up and shutdown the file player
1028 playerObj.StopPlayingFile();
1029 FilePlayer::DestroyFilePlayer(&playerObj);
1030 return -1;
1031 }
1032
1033 // Create file recorder object
1034 FileRecorder& recObj(*FileRecorder::CreateFileRecorder(
1035 -1,
1036 kFileFormatCompressedFile));
1037 res = recObj.StartRecordingAudioFile(fileNameOutUTF8, *compression,0);
1038 if (res)
1039 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001040 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001041 "ConvertPCMToCompressed failed to create recorder object");
1042 playerObj.StopPlayingFile();
1043 FilePlayer::DestroyFilePlayer(&playerObj);
1044 recObj.StopRecording();
1045 FileRecorder::DestroyFileRecorder(&recObj);
1046 return -1;
1047 }
1048
1049 // Run throught the file
1050 AudioFrame audioFrame;
1051 WebRtc_Word16 decodedData[160];
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +00001052 int decLength=0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001053 const WebRtc_UWord32 frequency = 16000;
1054
1055 while(!playerObj.Get10msAudioFromFile(decodedData,decLength,frequency))
1056 {
1057 if(decLength!=frequency/100)
1058 {
1059 // This is an OK way to end
1060 break;
1061 }
1062 res=audioFrame.UpdateFrame(-1, 0, decodedData,
1063 (WebRtc_UWord16)decLength,
1064 frequency, AudioFrame::kNormalSpeech,
1065 AudioFrame::kVadActive);
1066 if(res)
1067 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001068 WEBRTC_TRACE(kTraceError, kTraceVoice,
1069 VoEId(_shared->instance_id(), -1),
1070 "ConvertPCMToCompressed failed during conversion "
1071 "(audio frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +00001072 break;
1073 }
1074
1075 res=recObj.RecordAudioToFile(audioFrame);
1076 if(res)
1077 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001078 WEBRTC_TRACE(kTraceError, kTraceVoice,
1079 VoEId(_shared->instance_id(), -1),
1080 "ConvertPCMToCompressed failed during conversion "
1081 "(write frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +00001082 }
1083 }
1084
1085 playerObj.StopPlayingFile();
1086 recObj.StopRecording();
1087 FilePlayer::DestroyFilePlayer(&playerObj);
1088 FileRecorder::DestroyFileRecorder(&recObj);
1089
1090 return res;
1091}
1092
1093int VoEFileImpl::ConvertPCMToCompressed(InStream* streamIn,
1094 OutStream* streamOut,
1095 CodecInst* compression)
1096{
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001097 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +00001098 "ConvertPCMToCompressed(streamIn, streamOut, compression)");
1099
1100 if ((streamIn == NULL) || (streamOut == NULL))
1101 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001102 WEBRTC_TRACE(kTraceError, kTraceVoice,
1103 VoEId(_shared->instance_id(), -1), "invalid stream handles");
niklase@google.com470e71d2011-07-07 08:21:25 +00001104 return (-1);
1105 }
1106
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001107 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +00001108 " compression: plname=%s, plfreq=%d, pacsize=%d",
1109 compression->plname, compression->plfreq,
1110 compression->pacsize);
1111
1112 // Create file player object
1113 FilePlayer& playerObj(*FilePlayer::CreateFilePlayer(
1114 -1, kFileFormatPcm16kHzFile));
1115
1116 int res = playerObj.StartPlayingFile(*streamIn,0,1.0,0,0,NULL);
1117 if (res)
1118 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001119 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001120 "ConvertPCMToCompressed failed to create player object");
1121 playerObj.StopPlayingFile();
1122 FilePlayer::DestroyFilePlayer(&playerObj);
1123 return -1;
1124 }
1125
1126 // Create file recorder object
1127 FileRecorder& recObj(*FileRecorder::CreateFileRecorder(
1128 -1, kFileFormatCompressedFile));
1129 res = recObj.StartRecordingAudioFile(*streamOut,*compression,0);
1130 if (res)
1131 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001132 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001133 "ConvertPCMToCompressed failed to create recorder object");
1134 playerObj.StopPlayingFile();
1135 FilePlayer::DestroyFilePlayer(&playerObj);
1136 recObj.StopRecording();
1137 FileRecorder::DestroyFileRecorder(&recObj);
1138 return -1;
1139 }
1140
1141 // Run throught the file
1142 AudioFrame audioFrame;
1143 WebRtc_Word16 decodedData[160];
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +00001144 int decLength=0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001145 const WebRtc_UWord32 frequency = 16000;
1146
1147 while(!playerObj.Get10msAudioFromFile(decodedData,decLength,frequency))
1148 {
1149 if(decLength!=frequency/100)
1150 {
1151 // This is an OK way to end
1152 break;
1153 }
1154 res=audioFrame.UpdateFrame(-1, 0, decodedData,
1155 (WebRtc_UWord16)decLength,
1156 frequency, AudioFrame::kNormalSpeech,
1157 AudioFrame::kVadActive);
1158 if(res)
1159 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001160 WEBRTC_TRACE(kTraceError, kTraceVoice,
1161 VoEId(_shared->instance_id(), -1),
1162 "ConvertPCMToCompressed failed during conversion "
1163 "(audio frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +00001164 break;
1165 }
1166
1167 res=recObj.RecordAudioToFile(audioFrame);
1168 if(res)
1169 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001170 WEBRTC_TRACE(kTraceError, kTraceVoice,
1171 VoEId(_shared->instance_id(), -1),
1172 "ConvertPCMToCompressed failed during conversion "
1173 "(write frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +00001174 }
1175 }
1176
1177 playerObj.StopPlayingFile();
1178 recObj.StopRecording();
1179 FilePlayer::DestroyFilePlayer(&playerObj);
1180 FileRecorder::DestroyFileRecorder(&recObj);
1181
1182 return res;
1183}
1184
1185int VoEFileImpl::ConvertCompressedToPCM(const char* fileNameInUTF8,
1186 const char* fileNameOutUTF8)
1187{
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001188 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +00001189 "ConvertCompressedToPCM(fileNameInUTF8=%s,"
1190 " fileNameOutUTF8=%s)",
1191 fileNameInUTF8, fileNameOutUTF8);
1192
1193 // Create file player object
1194 FilePlayer& playerObj(*FilePlayer::CreateFilePlayer(
1195 -1, kFileFormatCompressedFile));
1196
1197 int res = playerObj.StartPlayingFile(fileNameInUTF8,false,0,1.0,0,0,NULL);
1198 if (res)
1199 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001200 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001201 "ConvertCompressedToPCM failed to create player object");
1202 playerObj.StopPlayingFile();
1203 FilePlayer::DestroyFilePlayer(&playerObj);
1204 return -1;
1205 }
1206
1207 // Create file recorder object
1208 FileRecorder& recObj(*FileRecorder::CreateFileRecorder(
1209 -1, kFileFormatPcm16kHzFile));
1210
1211 CodecInst codecInst;
1212 strncpy(codecInst.plname,"L16",32);
1213 codecInst.channels = 1;
1214 codecInst.rate = 256000;
1215 codecInst.plfreq = 16000;
1216 codecInst.pltype = 94;
1217 codecInst.pacsize = 160;
1218
1219 res = recObj.StartRecordingAudioFile(fileNameOutUTF8,codecInst,0);
1220 if (res)
1221 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001222 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001223 "ConvertCompressedToPCM failed to create recorder object");
1224 playerObj.StopPlayingFile();
1225 FilePlayer::DestroyFilePlayer(&playerObj);
1226 recObj.StopRecording();
1227 FileRecorder::DestroyFileRecorder(&recObj);
1228 return -1;
1229 }
1230
1231 // Run throught the file
1232 AudioFrame audioFrame;
1233 WebRtc_Word16 decodedData[160];
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +00001234 int decLength=0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001235 const WebRtc_UWord32 frequency = 16000;
1236
1237 while(!playerObj.Get10msAudioFromFile(decodedData,decLength,frequency))
1238 {
1239 if(decLength!=frequency/100)
1240 {
1241 // This is an OK way to end
1242 break;
1243 }
1244 res=audioFrame.UpdateFrame(-1, 0, decodedData,
1245 (WebRtc_UWord16)decLength,
1246 frequency,
1247 AudioFrame::kNormalSpeech,
1248 AudioFrame::kVadActive);
1249 if(res)
1250 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001251 WEBRTC_TRACE(kTraceError, kTraceVoice,
1252 VoEId(_shared->instance_id(), -1),
1253 "ConvertCompressedToPCM failed during conversion "
1254 "(create audio frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +00001255 break;
1256 }
1257
1258 res=recObj.RecordAudioToFile(audioFrame);
1259 if(res)
1260 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001261 WEBRTC_TRACE(kTraceError, kTraceVoice,
1262 VoEId(_shared->instance_id(), -1),
1263 "ConvertCompressedToPCM failed during conversion "
1264 "(write frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +00001265 }
1266 }
1267
1268 playerObj.StopPlayingFile();
1269 recObj.StopRecording();
1270 FilePlayer::DestroyFilePlayer(&playerObj);
1271 FileRecorder::DestroyFileRecorder(&recObj);
1272
1273 return res;
1274}
1275
1276int VoEFileImpl::ConvertCompressedToPCM(InStream* streamIn,
1277 OutStream* streamOut)
1278{
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001279 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +00001280 "ConvertCompressedToPCM(file, file);");
1281
1282 if ((streamIn == NULL) || (streamOut == NULL))
1283 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001284 WEBRTC_TRACE(kTraceError, kTraceVoice,
1285 VoEId(_shared->instance_id(), -1), "invalid stream handles");
niklase@google.com470e71d2011-07-07 08:21:25 +00001286 return (-1);
1287 }
1288
1289 // Create file player object
1290 FilePlayer& playerObj(*FilePlayer::CreateFilePlayer(
1291 -1, kFileFormatCompressedFile));
1292 int res;
1293
1294 res = playerObj.StartPlayingFile(*streamIn,0,1.0,0,0,NULL);
1295 if (res)
1296 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001297 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001298 "ConvertCompressedToPCM failed to create player object");
1299 playerObj.StopPlayingFile();
1300 FilePlayer::DestroyFilePlayer(&playerObj);
1301 return -1;
1302 }
1303
1304 // Create file recorder object
1305 FileRecorder& recObj(*FileRecorder::CreateFileRecorder(
1306 -1, kFileFormatPcm16kHzFile));
1307
1308 CodecInst codecInst;
1309 strncpy(codecInst.plname,"L16",32);
1310 codecInst.channels = 1;
1311 codecInst.rate = 256000;
1312 codecInst.plfreq = 16000;
1313 codecInst.pltype = 94;
1314 codecInst.pacsize = 160;
1315
1316 res = recObj.StartRecordingAudioFile(*streamOut,codecInst,0);
1317 if (res)
1318 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001319 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001320 "ConvertCompressedToPCM failed to create recorder object");
1321 playerObj.StopPlayingFile();
1322 FilePlayer::DestroyFilePlayer(&playerObj);
1323 recObj.StopRecording();
1324 FileRecorder::DestroyFileRecorder(&recObj);
1325 return -1;
1326 }
1327
1328 // Run throught the file
1329 AudioFrame audioFrame;
1330 WebRtc_Word16 decodedData[160];
andrew@webrtc.orge59a0ac2012-05-08 17:12:40 +00001331 int decLength=0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001332 const WebRtc_UWord32 frequency = 16000;
1333
1334 while(!playerObj.Get10msAudioFromFile(decodedData,decLength,frequency))
1335 {
1336 if(decLength!=frequency/100)
1337 {
1338 // This is an OK way to end
1339 break;
1340 }
1341 res=audioFrame.UpdateFrame(-1, 0, decodedData,
1342 (WebRtc_UWord16)decLength,
1343 frequency,
1344 AudioFrame::kNormalSpeech,
1345 AudioFrame::kVadActive);
1346 if(res)
1347 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001348 WEBRTC_TRACE(kTraceError, kTraceVoice,
1349 VoEId(_shared->instance_id(), -1),
1350 "ConvertCompressedToPCM failed during conversion "
1351 "(audio frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +00001352 break;
1353 }
1354
1355 res=recObj.RecordAudioToFile(audioFrame);
1356 if(res)
1357 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001358 WEBRTC_TRACE(kTraceError, kTraceVoice,
1359 VoEId(_shared->instance_id(), -1),
1360 "ConvertCompressedToPCM failed during conversion "
1361 "(write frame)");
niklase@google.com470e71d2011-07-07 08:21:25 +00001362 }
1363 }
1364
1365 playerObj.StopPlayingFile();
1366 recObj.StopRecording();
1367 FilePlayer::DestroyFilePlayer(&playerObj);
1368 FileRecorder::DestroyFileRecorder(&recObj);
1369
1370 return res;
1371}
1372
1373
1374int VoEFileImpl::GetFileDuration(const char* fileNameUTF8,
1375 int& durationMs,
1376 FileFormats format)
1377{
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001378 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +00001379 "GetFileDuration(fileNameUTF8=%s, format=%d)",
1380 fileNameUTF8, format);
1381
1382 // Create a dummy file module for this
1383 MediaFile * fileModule=MediaFile::CreateMediaFile(-1);
1384
1385 // Temp container of the right format
1386 WebRtc_UWord32 duration;
1387 int res=fileModule->FileDurationMs(fileNameUTF8,duration,format);
1388 if (res)
1389 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001390 _shared->SetLastError(VE_BAD_FILE, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001391 "GetFileDuration() failed measure file duration");
1392 return -1;
1393 }
1394 durationMs = duration;
1395 MediaFile::DestroyMediaFile(fileModule);
1396 fileModule = NULL;
1397
1398 return(res);
1399}
1400
1401int VoEFileImpl::GetPlaybackPosition(int channel, int& positionMs)
1402{
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001403 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +00001404 "GetPlaybackPosition(channel=%d)", channel);
1405
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001406 voe::ScopedChannel sc(_shared->channel_manager(), channel);
niklase@google.com470e71d2011-07-07 08:21:25 +00001407 voe::Channel* channelPtr = sc.ChannelPtr();
1408 if (channelPtr == NULL)
1409 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +00001410 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +00001411 "GetPlaybackPosition() failed to locate channel");
1412 return -1;
1413 }
1414 return channelPtr->GetLocalPlayoutPosition(positionMs);
1415}
1416
niklase@google.com470e71d2011-07-07 08:21:25 +00001417#endif // #ifdef WEBRTC_VOICE_ENGINE_FILE_API
andrew@webrtc.orgeeaf3d12012-01-24 06:30:02 +00001418
1419} // namespace webrtc