зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1748948 - Update cubeb to 3d598eff. r=cubeb-reviewers,padenot
Differential Revision: https://phabricator.services.mozilla.com/D135306
This commit is contained in:
Родитель
311094ffb4
Коммит
5caa1a4d96
|
@ -19,5 +19,5 @@ origin:
|
|||
license: "ISC"
|
||||
|
||||
# update.sh will update this value
|
||||
release: "773f16b7ea308392c05be3e290163d1f636e6024-dirty (2021-12-08 11:09:25 +1300)"
|
||||
release: "3d598eff576ea5939b63119d54a8a54183eec144 (2022-01-07 14:34:59 +1300)"
|
||||
|
||||
|
|
|
@ -193,9 +193,6 @@ int
|
|||
setup_wasapi_stream(cubeb_stream * stm);
|
||||
ERole
|
||||
pref_to_role(cubeb_stream_prefs param);
|
||||
int
|
||||
wasapi_create_device(cubeb * ctx, cubeb_device_info & ret,
|
||||
IMMDeviceEnumerator * enumerator, IMMDevice * dev);
|
||||
void
|
||||
wasapi_destroy_device(cubeb_device_info * device_info);
|
||||
static int
|
||||
|
@ -1910,8 +1907,8 @@ initialize_iaudioclient2(com_ptr<IAudioClient> & audio_client)
|
|||
return CUBEB_OK;
|
||||
}
|
||||
|
||||
// Not static to suppress a warning.
|
||||
/* static */ bool
|
||||
#if 0
|
||||
bool
|
||||
initialize_iaudioclient3(com_ptr<IAudioClient> & audio_client,
|
||||
cubeb_stream * stm,
|
||||
const com_heap_ptr<WAVEFORMATEX> & mix_format,
|
||||
|
@ -2021,6 +2018,7 @@ initialize_iaudioclient3(com_ptr<IAudioClient> & audio_client,
|
|||
LOG("Could not initialize shared stream with IAudioClient3: error: %lx", hr);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define DIRECTION_NAME (direction == eCapture ? "capture" : "render")
|
||||
|
||||
|
@ -2181,10 +2179,12 @@ setup_wasapi_stream_one_side(cubeb_stream * stm,
|
|||
REFERENCE_TIME latency_hns = frames_to_hns(stream_params->rate, stm->latency);
|
||||
stm->input_bluetooth_handsfree = false;
|
||||
|
||||
wasapi_default_devices default_devices(stm->device_enumerator.get());
|
||||
|
||||
cubeb_device_info device_info;
|
||||
if (wasapi_create_device(stm->context, device_info,
|
||||
stm->device_enumerator.get(),
|
||||
device.get()) == CUBEB_OK) {
|
||||
stm->device_enumerator.get(), device.get(),
|
||||
&default_devices) == CUBEB_OK) {
|
||||
const char * HANDSFREE_TAG = "BTHHFENUM";
|
||||
size_t len = sizeof(HANDSFREE_TAG);
|
||||
if (direction == eCapture) {
|
||||
|
@ -3011,31 +3011,48 @@ static com_ptr<IMMDevice> wasapi_get_device_node(
|
|||
return ret;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
wasapi_is_default_device(EDataFlow flow, ERole role, LPCWSTR device_id,
|
||||
IMMDeviceEnumerator * enumerator)
|
||||
static com_heap_ptr<wchar_t>
|
||||
wasapi_get_default_device_id(EDataFlow flow, ERole role,
|
||||
IMMDeviceEnumerator * enumerator)
|
||||
{
|
||||
BOOL ret = FALSE;
|
||||
com_ptr<IMMDevice> dev;
|
||||
HRESULT hr;
|
||||
|
||||
hr = enumerator->GetDefaultAudioEndpoint(flow, role, dev.receive());
|
||||
HRESULT hr = enumerator->GetDefaultAudioEndpoint(flow, role, dev.receive());
|
||||
if (SUCCEEDED(hr)) {
|
||||
wchar_t * tmp = nullptr;
|
||||
if (SUCCEEDED(dev->GetId(&tmp))) {
|
||||
com_heap_ptr<wchar_t> defdevid(tmp);
|
||||
ret = (wcscmp(defdevid.get(), device_id) == 0);
|
||||
com_heap_ptr<wchar_t> devid(tmp);
|
||||
return devid;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
struct wasapi_default_devices {
|
||||
wasapi_default_devices(IMMDeviceEnumerator * enumerator)
|
||||
: render_console_id(
|
||||
wasapi_get_default_device_id(eRender, eConsole, enumerator)),
|
||||
render_comms_id(
|
||||
wasapi_get_default_device_id(eRender, eCommunications, enumerator)),
|
||||
capture_console_id(
|
||||
wasapi_get_default_device_id(eCapture, eConsole, enumerator)),
|
||||
capture_comms_id(
|
||||
wasapi_get_default_device_id(eCapture, eCommunications, enumerator))
|
||||
{
|
||||
}
|
||||
com_heap_ptr<wchar_t> render_console_id;
|
||||
com_heap_ptr<wchar_t> render_comms_id;
|
||||
com_heap_ptr<wchar_t> capture_console_id;
|
||||
com_heap_ptr<wchar_t> capture_comms_id;
|
||||
};
|
||||
|
||||
/* `ret` must be deallocated with `wasapi_destroy_device`, iff the return value
|
||||
* of this function is `CUBEB_OK`. */
|
||||
int
|
||||
wasapi_create_device(cubeb * ctx, cubeb_device_info & ret,
|
||||
IMMDeviceEnumerator * enumerator, IMMDevice * dev)
|
||||
IMMDeviceEnumerator * enumerator, IMMDevice * dev,
|
||||
wasapi_default_devices * defaults)
|
||||
{
|
||||
com_ptr<IMMEndpoint> endpoint;
|
||||
com_ptr<IMMDevice> devnode;
|
||||
|
@ -3046,6 +3063,8 @@ wasapi_create_device(cubeb * ctx, cubeb_device_info & ret,
|
|||
REFERENCE_TIME def_period, min_period;
|
||||
HRESULT hr;
|
||||
|
||||
XASSERT(enumerator && dev && defaults);
|
||||
|
||||
// zero-out to be able to safely delete the pointers to friendly_name and
|
||||
// group_id at all time in this function.
|
||||
PodZero(&ret, 1);
|
||||
|
@ -3133,19 +3152,20 @@ wasapi_create_device(cubeb * ctx, cubeb_device_info & ret,
|
|||
}
|
||||
|
||||
ret.preferred = CUBEB_DEVICE_PREF_NONE;
|
||||
if (wasapi_is_default_device(flow, eConsole, device_id.get(), enumerator)) {
|
||||
if ((flow == eRender &&
|
||||
wcscmp(device_id.get(), defaults->render_console_id.get()) == 0) ||
|
||||
(flow == eCapture &&
|
||||
wcscmp(device_id.get(), defaults->capture_console_id.get()) == 0)) {
|
||||
ret.preferred =
|
||||
(cubeb_device_pref)(ret.preferred | CUBEB_DEVICE_PREF_MULTIMEDIA);
|
||||
}
|
||||
if (wasapi_is_default_device(flow, eCommunications, device_id.get(),
|
||||
enumerator)) {
|
||||
(cubeb_device_pref)(ret.preferred | CUBEB_DEVICE_PREF_MULTIMEDIA |
|
||||
CUBEB_DEVICE_PREF_NOTIFICATION);
|
||||
} else if ((flow == eRender &&
|
||||
wcscmp(device_id.get(), defaults->render_comms_id.get()) == 0) ||
|
||||
(flow == eCapture &&
|
||||
wcscmp(device_id.get(), defaults->capture_comms_id.get()) == 0)) {
|
||||
ret.preferred =
|
||||
(cubeb_device_pref)(ret.preferred | CUBEB_DEVICE_PREF_VOICE);
|
||||
}
|
||||
if (wasapi_is_default_device(flow, eConsole, device_id.get(), enumerator)) {
|
||||
ret.preferred =
|
||||
(cubeb_device_pref)(ret.preferred | CUBEB_DEVICE_PREF_NOTIFICATION);
|
||||
}
|
||||
|
||||
if (flow == eRender) {
|
||||
ret.type = CUBEB_DEVICE_TYPE_OUTPUT;
|
||||
|
@ -3229,14 +3249,17 @@ wasapi_enumerate_devices(cubeb * context, cubeb_device_type type,
|
|||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
if (type == CUBEB_DEVICE_TYPE_OUTPUT)
|
||||
wasapi_default_devices default_devices(enumerator.get());
|
||||
|
||||
if (type == CUBEB_DEVICE_TYPE_OUTPUT) {
|
||||
flow = eRender;
|
||||
else if (type == CUBEB_DEVICE_TYPE_INPUT)
|
||||
} else if (type == CUBEB_DEVICE_TYPE_INPUT) {
|
||||
flow = eCapture;
|
||||
else if (type & (CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT))
|
||||
} else if (type & (CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT)) {
|
||||
flow = eAll;
|
||||
else
|
||||
} else {
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
hr = enumerator->EnumAudioEndpoints(flow, DEVICE_STATEMASK_ALL,
|
||||
collection.receive());
|
||||
|
@ -3264,7 +3287,7 @@ wasapi_enumerate_devices(cubeb * context, cubeb_device_type type,
|
|||
continue;
|
||||
}
|
||||
if (wasapi_create_device(context, devices[out->count], enumerator.get(),
|
||||
dev.get()) == CUBEB_OK) {
|
||||
dev.get(), &default_devices) == CUBEB_OK) {
|
||||
out->count += 1;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче