1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voe_video_sync_impl.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
14ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
15ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org#include "webrtc/voice_engine/channel.h"
16ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org#include "webrtc/voice_engine/include/voe_errors.h"
17ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org#include "webrtc/voice_engine/voice_engine_impl.h"
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEVideoSync* VoEVideoSync::GetInterface(VoiceEngine* voiceEngine)
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VOICE_ENGINE_VIDEO_SYNC_API
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return NULL;
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (NULL == voiceEngine)
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
30b9e5a3d589349ee55e41cb54eca4ec822018f5c5tommi@webrtc.org    VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    s->AddRef();
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return s;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_VIDEO_SYNC_API
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEVideoSyncImpl::VoEVideoSyncImpl(voe::SharedData* shared) : _shared(shared)
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "VoEVideoSyncImpl::VoEVideoSyncImpl() - ctor");
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEVideoSyncImpl::~VoEVideoSyncImpl()
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "VoEVideoSyncImpl::~VoEVideoSyncImpl() - dtor");
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVideoSyncImpl::GetPlayoutTimestamp(int channel, unsigned int& timestamp)
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetPlayoutTimestamp(channel=%d, timestamp=?)", channel);
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
60b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
61b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channel_ptr = ch.channel();
62b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    if (channel_ptr == NULL)
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetPlayoutTimestamp() failed to locate channel");
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
68b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    return channel_ptr->GetPlayoutTimestamp(timestamp);
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVideoSyncImpl::SetInitTimestamp(int channel,
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       unsigned int timestamp)
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetInitTimestamp(channel=%d, timestamp=%lu)",
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 channel, timestamp);
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
83b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
84b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetInitTimestamp() failed to locate channel");
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->SetInitTimestamp(timestamp);
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVideoSyncImpl::SetInitSequenceNumber(int channel,
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                            short sequenceNumber)
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetInitSequenceNumber(channel=%d, sequenceNumber=%hd)",
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 channel, sequenceNumber);
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
106b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
107b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetInitSequenceNumber() failed to locate channel");
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->SetInitSequenceNumber(sequenceNumber);
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVideoSyncImpl::SetMinimumPlayoutDelay(int channel,int delayMs)
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetMinimumPlayoutDelay(channel=%d, delayMs=%d)",
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 channel, delayMs);
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
128b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
129b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetMinimumPlayoutDelay() failed to locate channel");
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->SetMinimumPlayoutDelay(delayMs);
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
139ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.orgint VoEVideoSyncImpl::SetInitialPlayoutDelay(int channel, int delay_ms)
140ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org{
141ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
142ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org                 "SetInitialPlayoutDelay(channel=%d, delay_ms=%d)",
143ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org                 channel, delay_ms);
144ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org
145ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org    if (!_shared->statistics().Initialized())
146ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org    {
147ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
148ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org        return -1;
149ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org    }
150b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
151b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
152b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    if (channelPtr == NULL)
153ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org    {
154ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
155ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org            "SetInitialPlayoutDelay() failed to locate channel");
156ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org        return -1;
157ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org    }
158b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    return channelPtr->SetInitialPlayoutDelay(delay_ms);
159ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org}
160ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org
161f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.orgint VoEVideoSyncImpl::GetDelayEstimate(int channel,
162f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org                                       int* jitter_buffer_delay_ms,
163f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org                                       int* playout_buffer_delay_ms) {
164f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
165f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org               "GetDelayEstimate(channel=%d, delayMs=?)", channel);
166f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org
167f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org  if (!_shared->statistics().Initialized()) {
168f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
169f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org    return -1;
170f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org  }
171b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
172b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
173f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org  if (channelPtr == NULL) {
174f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
175f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org                          "GetDelayEstimate() failed to locate channel");
176f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org    return -1;
177f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org  }
178f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org  if (!channelPtr->GetDelayEstimate(jitter_buffer_delay_ms,
179f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org                                    playout_buffer_delay_ms)) {
180f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org    return -1;
181f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org  }
182f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org  return 0;
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVideoSyncImpl::GetPlayoutBufferSize(int& bufferMs)
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetPlayoutBufferSize(bufferMs=?)");
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AudioDeviceModule::BufferType type
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        (AudioDeviceModule::kFixedBufferSize);
19754f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org    uint16_t sizeMS(0);
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_shared->audio_device()->PlayoutBuffer(&type, &sizeMS) != 0)
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetPlayoutBufferSize() failed to read buffer size");
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bufferMs = sizeMS;
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        VoEId(_shared->instance_id(), -1),
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "GetPlayoutBufferSize() => bufferMs=%d", bufferMs);
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2117fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgint VoEVideoSyncImpl::GetRtpRtcp(int channel, RtpRtcp** rtpRtcpModule,
2127fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org                                 RtpReceiver** rtp_receiver)
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetRtpRtcp(channel=%i)", channel);
21659b3a4ca1db1bb16568f4d184c7cd13e9c1f5786fischman@webrtc.org
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
222b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
223b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetPlayoutTimestamp() failed to locate channel");
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
2307fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org    return channelPtr->GetRtpRtcp(rtpRtcpModule, rtp_receiver);
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
233d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.orgint VoEVideoSyncImpl::GetLeastRequiredDelayMs(int channel) const {
234d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
235d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org               "GetLeastRequiredDelayMS(channel=%d)", channel);
236d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org
237d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org  if (!_shared->statistics().Initialized()) {
238d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
239d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org    return -1;
240d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org  }
241b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
242b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channel_ptr = ch.channel();
243d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org  if (channel_ptr == NULL) {
244d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
245d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org                          "GetLeastRequiredDelayMs() failed to locate channel");
246d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org    return -1;
247d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org  }
248d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org  return channel_ptr->least_required_delay_ms();
249d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org}
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // #ifdef WEBRTC_VOICE_ENGINE_VIDEO_SYNC_API
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
254