Bug 1720293 - Update libcubeb to revision b2f60c9. r=cubeb-reviewers,chunmin

Differential Revision: https://phabricator.services.mozilla.com/D119763
This commit is contained in:
Paul Adenot 2021-07-13 14:25:15 +00:00
Родитель a5072aba3e
Коммит 10c0de933e
4 изменённых файлов: 61 добавлений и 28 удалений

Просмотреть файл

@ -19,5 +19,5 @@ origin:
license: "ISC"
# update.sh will update this value
release: "5ebe69cb3a1c7b022af85c04187456948b209d4b (2021-05-25 08:15:25 +1200)"
release: "b2f60c983df34f8cac0e061ef32da531c6d82536 (2021-07-13 13:51:30 +0200)"

Просмотреть файл

@ -222,6 +222,12 @@ cubeb_resampler_speex<T, InputProcessor, OutputProcessor>
* callback. */
input_processor->input(input_buffer, *input_frames_count);
/* resampled_frame_count == 0 happens if the resampler
* doesn't have enough input frames buffered to produce 1 resampled frame. */
if (resampled_frame_count == 0) {
return *input_frames_count;
}
size_t frames_resampled = 0;
resampled_input = input_processor->output(resampled_frame_count, &frames_resampled);
*input_frames_count = frames_resampled;

Просмотреть файл

@ -626,7 +626,7 @@ sndio_enumerate_devices(cubeb *context, cubeb_device_type type,
device->preferred = CUBEB_DEVICE_PREF_ALL;
device->format = CUBEB_DEVICE_FMT_S16NE;
device->default_format = CUBEB_DEVICE_FMT_S16NE;
device->max_channels = 16;
device->max_channels = (type == CUBEB_DEVICE_TYPE_INPUT) ? 2 : 8;
device->default_rate = 48000;
device->min_rate = 4000;
device->max_rate = 192000;

Просмотреть файл

@ -353,6 +353,11 @@ struct cubeb_stream {
/* This needs an active audio input stream to be known, and is updated in the
* first audio input callback. */
std::atomic<int64_t> input_latency_hns { LATENCY_NOT_AVAILABLE_YET };
/* Those attributes count the number of frames requested (resp. received) by
the OS, to be able to detect drifts. This is only used for logging for now. */
size_t total_input_frames = 0;
size_t total_output_frames = 0;
};
class monitor_device_notifications {
@ -908,8 +913,7 @@ int trigger_async_reconfigure(cubeb_stream * stm)
/* This helper grabs all the frames available from a capture client, put them in
* linear_input_buffer. linear_input_buffer should be cleared before the
* callback exits. This helper does not work with exclusive mode streams. */
* the linear_input_buffer. This helper does not work with exclusive mode streams. */
bool get_input_buffer(cubeb_stream * stm)
{
XASSERT(has_input(stm));
@ -967,6 +971,8 @@ bool get_input_buffer(cubeb_stream * stm)
}
}
stm->total_input_frames += frames;
UINT32 input_stream_samples = frames * stm->input_stream_params.channels;
// We do not explicitly handle the AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY
// flag. There a two primary (non exhaustive) scenarios we anticipate this
@ -1018,6 +1024,8 @@ bool get_input_buffer(cubeb_stream * stm)
offset += input_stream_samples;
}
ALOGV("get_input_buffer: got %d frames", offset);
XASSERT(stm->linear_input_buffer->length() >= offset);
return true;
@ -1086,10 +1094,12 @@ refill_callback_duplex(cubeb_stream * stm)
XASSERT(has_input(stm) && has_output(stm));
rv = get_input_buffer(stm);
if (!rv) {
if (stm->input_stream_params.prefs & CUBEB_STREAM_PREF_LOOPBACK) {
HRESULT rv = get_input_buffer(stm);
if (FAILED(rv)) {
return rv;
}
}
input_frames = stm->linear_input_buffer->length() / stm->input_stream_params.channels;
@ -1110,6 +1120,13 @@ refill_callback_duplex(cubeb_stream * stm)
return false;
}
stm->total_output_frames += output_frames;
ALOGV("in: %zu, out: %zu, missing: %ld, ratio: %f",
stm->total_input_frames, stm->total_output_frames,
static_cast<long>(stm->total_output_frames) - stm->total_input_frames,
static_cast<float>(stm->total_output_frames) / stm->total_input_frames);
if (stm->has_dummy_output) {
ALOGV("Duplex callback (dummy output): input frames: %Iu, output frames: %Iu",
input_frames, output_frames);
@ -1351,10 +1368,18 @@ wasapi_stream_render_loop(LPVOID stream)
(!has_input(stm) && has_output(stm)));
is_playing = stm->refill_callback(stm);
break;
case WAIT_OBJECT_0 + 3: /* input available */
if (has_input(stm) && has_output(stm)) { continue; }
case WAIT_OBJECT_0 + 3: { /* input available */
HRESULT rv = get_input_buffer(stm);
if (FAILED(rv)) {
return rv;
}
if (!has_output(stm)) {
is_playing = stm->refill_callback(stm);
}
break;
}
case WAIT_TIMEOUT:
XASSERT(stm->shutdown_event == wait_array[0]);
if (++timeout_count >= timeout_limit) {
@ -1734,7 +1759,8 @@ wasapi_get_min_latency(cubeb * ctx, cubeb_stream_params params, uint32_t * laten
synchronizing the stream and the engine.
http://msdn.microsoft.com/en-us/library/windows/desktop/dd370871%28v=vs.85%29.aspx */
#ifdef _WIN32_WINNT_WIN10
// #ifdef _WIN32_WINNT_WIN10
#if 0
*latency_frames = hns_to_frames(params.rate, minimum_period);
#else
*latency_frames = hns_to_frames(params.rate, default_period);
@ -2138,22 +2164,18 @@ int setup_wasapi_stream_one_side(cubeb_stream * stm,
if (rv == CUBEB_OK) {
const char* HANDSFREE_TAG = "BTHHFENUM";
size_t len = sizeof(HANDSFREE_TAG);
if (direction == eCapture &&
strlen(device_info.group_id) >= len &&
strncmp(device_info.group_id, HANDSFREE_TAG, len) == 0) {
// Rather high-latency to prevent constant under-runs in this particular
// case of an input device using bluetooth handsfree.
if (direction == eCapture) {
uint32_t default_period_frames = hns_to_frames(device_info.default_rate, default_period);
latency_frames = default_period_frames * 4;
if (strlen(device_info.group_id) >= len &&
strncmp(device_info.group_id, HANDSFREE_TAG, len) == 0) {
stm->input_bluetooth_handsfree = true;
LOG("Input is a bluetooth device in handsfree, latency increased to %u frames from a default of %u", latency_frames, default_period_frames);
} else {
uint32_t minimum_period_frames = hns_to_frames(device_info.default_rate, minimum_period);
latency_frames = std::max(latency_frames, minimum_period_frames);
stm->input_bluetooth_handsfree = false;
LOG("Input is a not bluetooth handsfree, latency %s to %u frames (minimum %u)", latency_frames < minimum_period_frames ? "increased" : "set", latency_frames, minimum_period_frames);
}
// This multiplicator has been found empirically.
latency_frames = default_period_frames * 8;
LOG("Input: latency increased to %u frames from a default of %u", latency_frames, default_period_frames);
}
latency_hns = frames_to_hns(device_info.default_rate, latency_frames);
wasapi_destroy_device(&device_info);
@ -2196,6 +2218,8 @@ int setup_wasapi_stream_one_side(cubeb_stream * stm,
return CUBEB_ERROR;
}
LOG("Buffer size is: %d for %s\n", *buffer_frame_count, DIRECTION_NAME);
// Events are used if not looping back
if (!is_loopback) {
hr = audio_client->SetEventHandle(event);
@ -2622,6 +2646,9 @@ void close_wasapi_stream(cubeb_stream * stm)
stm->output_mixer.reset();
stm->input_mixer.reset();
stm->mix_buffer.clear();
if (stm->linear_input_buffer) {
stm->linear_input_buffer->clear();
}
}
void wasapi_stream_destroy(cubeb_stream * stm)