virtual void Deinitialize() = 0;
/*
- This method returns the time in seconds that it will take
- for the next added packet to be heard from the speakers.
- */
- virtual double GetDelay() = 0;
-
- /*
This method returns the total time in seconds of the cache.
*/
virtual double GetCacheTotal() = 0;
* @brief Return a timestamped status structure with delay and sink info
* @param status structure filled with sink status
*/
- virtual void GetDelay(AEDelayStatus& status)
- {
- status.SetDelay(GetDelay());
- }
+ virtual void GetDelay(AEDelayStatus& status) = 0;
/*
Drain the sink
snd_pcm_drop(m_pcm);
}
-double CAESinkALSA::GetDelay()
+void CAESinkALSA::GetDelay(AEDelayStatus& status)
{
if (!m_pcm)
- return 0;
+ {
+ status.SetDelay(0);
+ return;
+ }
snd_pcm_sframes_t frames = 0;
snd_pcm_delay(m_pcm, &frames);
frames = 0;
}
- return (double)frames * m_formatSampleRateMul;
+ status.SetDelay((double)frames * m_formatSampleRateMul);
}
double CAESinkALSA::GetCacheTotal()
virtual void Deinitialize();
virtual void Stop ();
- virtual double GetDelay ();
+ virtual void GetDelay (AEDelayStatus& status);
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
virtual void Drain ();
m_at_jni = NULL;
}
-double CAESinkAUDIOTRACK::GetDelay()
+void CAESinkAUDIOTRACK::GetDelay(AEDelayStatus& status)
{
if (!m_at_jni)
- return 0.0;
+ {
+ status.SetDelay(0);
+ return;
+ }
// In their infinite wisdom, Google decided to make getPlaybackHeadPosition
// return a 32bit "int" that you should "interpret as unsigned." As such,
double delay = (double)(m_frames_written - head_pos) / m_format.m_sampleRate;
- return delay;
+ status.SetDelay(delay);
}
double CAESinkAUDIOTRACK::GetLatency()
virtual bool Initialize(AEAudioFormat &format, std::string &device);
virtual void Deinitialize();
- virtual double GetDelay ();
+ virtual void GetDelay (AEDelayStatus& status);
virtual double GetLatency ();
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
virtual bool Initialize(AEAudioFormat &format, std::string &device);
virtual void Deinitialize();
- virtual double GetDelay () { return 0.0; /* unused dummy */ }
virtual void GetDelay(AEDelayStatus& status);
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
virtual bool Initialize(AEAudioFormat &format, std::string &device);
virtual void Deinitialize();
- virtual double GetDelay () { return 0.0; /* unused dummy */ }
virtual void GetDelay(AEDelayStatus& status);
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
UpdateCacheStatus();
}
-double CAESinkDirectSound::GetDelay()
+void CAESinkDirectSound::GetDelay(AEDelayStatus& status)
{
if (!m_initialized)
- return 0.0;
+ {
+ status.SetDelay(0);
+ return;
+ }
/* Make sure we know how much data is in the cache */
if (!UpdateCacheStatus())
m_isDirtyDS = true;
/** returns current cached data duration in seconds */
- double delay = (double)m_CacheLen / (double)m_AvgBytesPerSec;
- return delay;
+ status.SetDelay((double)m_CacheLen / (double)m_AvgBytesPerSec);
}
double CAESinkDirectSound::GetCacheTotal()
virtual void Stop ();
virtual void Drain ();
- virtual double GetDelay ();
+ virtual void GetDelay (AEDelayStatus& status);
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
static std::string GetDefaultDevice ();
StopThread();
}
-double CAESinkNULL::GetDelay()
+void CAESinkNULL::GetDelay(AEDelayStatus& status)
{
double sinkbuffer_seconds_to_empty = m_sinkbuffer_sec_per_byte * (double)m_sinkbuffer_level;
- return sinkbuffer_seconds_to_empty;
+ status.SetDelay(sinkbuffer_seconds_to_empty);
}
double CAESinkNULL::GetCacheTotal()
virtual bool Initialize(AEAudioFormat &format, std::string &device);
virtual void Deinitialize();
- virtual double GetDelay ();
+ virtual void GetDelay (AEDelayStatus& status);
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
virtual void Drain ();
#endif
}
-double CAESinkOSS::GetDelay()
+void CAESinkOSS::GetDelay(AEDelayStatus& status)
{
if (m_fd == -1)
- return 0.0;
+ {
+ status.SetDelay(0);
+ return;
+ }
int delay;
if (ioctl(m_fd, SNDCTL_DSP_GETODELAY, &delay) == -1)
- return 0.0;
+ {
+ status.SetDelay(0);
+ return;
+ }
- return (double)delay / (m_format.m_frameSize * m_format.m_sampleRate);
+ status.SetDelay((double)delay / (m_format.m_frameSize * m_format.m_sampleRate));
}
unsigned int CAESinkOSS::AddPackets(uint8_t **data, unsigned int frames, unsigned int offset)
virtual void Deinitialize();
virtual void Stop ();
- virtual double GetDelay ();
+ virtual void GetDelay (AEDelayStatus& status);
virtual double GetCacheTotal () { return 0.0; } /* FIXME */
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
virtual void Drain ();
return compatible;
}
-double CAESinkPi::GetDelay()
+void CAESinkPi::GetDelay(AEDelayStatus& status)
{
OMX_PARAM_U32TYPE param;
OMX_INIT_STRUCTURE(param);
if (!m_Initialized)
- return 0.0;
+ {
+ status.SetDelay(0);
+ return;
+ }
param.nPortIndex = m_omx_render.GetInputPort();
CLASSNAME, __func__, omx_err);
}
double sinkbuffer_seconds_to_empty = m_sinkbuffer_sec_per_byte * param.nU32 * m_format.m_frameSize;
- return sinkbuffer_seconds_to_empty;
+ status.SetDelay(sinkbuffer_seconds_to_empty);
}
double CAESinkPi::GetCacheTime()
OMX_BUFFERHEADERTYPE *omx_buffer = NULL;
while (sent < frames)
{
- double delay = GetDelay();
+ AEDelayStatus status;
+ GetDelay(status);
+ double delay = status.GetDelay();
double ideal_submission_time = AUDIO_PLAYBUFFER - delay;
// ideal amount of audio we'd like submit (to make delay match AUDIO_PLAYBUFFER)
int timeout = 1000;
void CAESinkPi::Drain()
{
- int delay = (int)(GetDelay() * 1000.0);
+ AEDelayStatus status;
+ GetDelay(status);
+ int delay = (int)(status.GetDelay() * 1000.0);
if (delay)
Sleep(delay);
- CLog::Log(LOGDEBUG, "%s:%s delay:%dms now:%dms", CLASSNAME, __func__, delay, (int)(GetDelay() * 1000.0));
+ CLog::Log(LOGDEBUG, "%s:%s delay:%dms now:%dms", CLASSNAME, __func__, delay, (int)(status.GetDelay() * 1000.0));
}
void CAESinkPi::EnumerateDevicesEx(AEDeviceInfoList &list, bool force)
virtual void Deinitialize();
virtual bool IsCompatible(const AEAudioFormat &format, const std::string &device);
- virtual double GetDelay ();
+ virtual void GetDelay (AEDelayStatus& status);
virtual double GetCacheTime ();
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
{
}
-double CAESinkProfiler::GetDelay()
+void CAESinkProfiler::GetDelay(AEDelayStatus& status)
{
- return 0.0f;
+ status.SetDelay(0);
}
unsigned int CAESinkProfiler::AddPackets(uint8_t **data, unsigned int frames, unsigned int offset)
virtual bool Initialize (AEAudioFormat &format, std::string &device);
virtual void Deinitialize();
- virtual double GetDelay ();
+ virtual void GetDelay (AEDelayStatus& status);
virtual double GetCacheTotal () { return 0.0; }
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
virtual void Drain ();
virtual bool Initialize (AEAudioFormat &format, std::string &device);
virtual void Deinitialize();
- virtual double GetDelay() { return 0.0; }
virtual void GetDelay(AEDelayStatus& status);
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);