mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1104643 - Interpolate the audio clock by system clock if the qudio clock is not going forward. r=padenot
This commit is contained in:
parent
07d7cd22b7
commit
bd1e80cba6
@ -11,6 +11,7 @@
|
||||
#include <pthread.h>
|
||||
#include <SLES/OpenSLES.h>
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
#if defined(__ANDROID__)
|
||||
#include <sys/system_properties.h>
|
||||
#include "android/sles_definitions.h"
|
||||
@ -70,6 +71,9 @@ struct cubeb_stream {
|
||||
unsigned int inputrate;
|
||||
unsigned int outputrate;
|
||||
unsigned int latency;
|
||||
int64_t lastPosition;
|
||||
int64_t lastPositionTimeStamp;
|
||||
int64_t lastCompensativePosition;
|
||||
};
|
||||
|
||||
static void
|
||||
@ -511,6 +515,9 @@ opensl_stream_init(cubeb * ctx, cubeb_stream ** stream, char const * stream_name
|
||||
stm->latency = latency;
|
||||
stm->stream_type = stream_params.stream_type;
|
||||
stm->framesize = stream_params.channels * sizeof(int16_t);
|
||||
stm->lastPosition = -1;
|
||||
stm->lastPositionTimeStamp = 0;
|
||||
stm->lastCompensativePosition = -1;
|
||||
|
||||
int r = pthread_mutex_init(&stm->mutex, NULL);
|
||||
assert(r == 0);
|
||||
@ -697,11 +704,22 @@ opensl_stream_get_position(cubeb_stream * stm, uint64_t * position)
|
||||
SLresult res;
|
||||
int r;
|
||||
uint32_t mixer_latency;
|
||||
uint32_t compensation_msec = 0;
|
||||
|
||||
res = (*stm->play)->GetPosition(stm->play, &msec);
|
||||
if (res != SL_RESULT_SUCCESS)
|
||||
return CUBEB_ERROR;
|
||||
|
||||
struct timespec t;
|
||||
clock_gettime(CLOCK_MONOTONIC, &t);
|
||||
if(stm->lastPosition == msec || msec < stm->lastCompensativePosition) {
|
||||
compensation_msec =
|
||||
(t.tv_sec*1000000000LL + t.tv_nsec - stm->lastPositionTimeStamp) / 1000000;
|
||||
} else {
|
||||
stm->lastPositionTimeStamp = t.tv_sec*1000000000LL + t.tv_nsec;
|
||||
stm->lastPosition = msec;
|
||||
}
|
||||
|
||||
samplerate = stm->inputrate;
|
||||
|
||||
r = stm->context->get_output_latency(&mixer_latency, stm->stream_type);
|
||||
@ -715,12 +733,14 @@ opensl_stream_get_position(cubeb_stream * stm, uint64_t * position)
|
||||
assert(maximum_position >= 0);
|
||||
|
||||
if (msec > mixer_latency) {
|
||||
int64_t unadjusted_position = samplerate * (msec - mixer_latency) / 1000;
|
||||
int64_t unadjusted_position =
|
||||
samplerate * (msec - mixer_latency + compensation_msec) / 1000;
|
||||
*position = unadjusted_position < maximum_position ?
|
||||
unadjusted_position : maximum_position;
|
||||
} else {
|
||||
*position = 0;
|
||||
}
|
||||
stm->lastCompensativePosition = *position;
|
||||
return CUBEB_OK;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user