New upstream version 19.0.3+dfsg1
This commit is contained in:
parent
3708b8e092
commit
1f1bbb3518
534 changed files with 13862 additions and 2459 deletions
|
|
@ -103,3 +103,66 @@ fail:
|
|||
safe_release(enumerator);
|
||||
safe_release(collection);
|
||||
}
|
||||
|
||||
static void get_default_id(char **p_id)
|
||||
{
|
||||
IMMDeviceEnumerator *immde = NULL;
|
||||
IMMDevice *device = NULL;
|
||||
WCHAR *w_id = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
if (*p_id)
|
||||
return;
|
||||
|
||||
hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL,
|
||||
&IID_IMMDeviceEnumerator, &immde);
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = immde->lpVtbl->GetDefaultAudioEndpoint(immde,
|
||||
eRender, eConsole, &device);
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = device->lpVtbl->GetId(device, &w_id);
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
os_wcs_to_utf8_ptr(w_id, 0, p_id);
|
||||
|
||||
fail:
|
||||
if (!*p_id)
|
||||
*p_id = bzalloc(1);
|
||||
if (immde)
|
||||
immde->lpVtbl->Release(immde);
|
||||
if (device)
|
||||
device->lpVtbl->Release(device);
|
||||
if (w_id)
|
||||
CoTaskMemFree(w_id);
|
||||
}
|
||||
|
||||
bool devices_match(const char *id1, const char *id2)
|
||||
{
|
||||
char *default_id = NULL;
|
||||
bool match;
|
||||
|
||||
if (!id1 || !id2)
|
||||
return false;
|
||||
|
||||
if (strcmp(id1, "default") == 0) {
|
||||
get_default_id(&default_id);
|
||||
id1 = default_id;
|
||||
}
|
||||
if (strcmp(id2, "default") == 0) {
|
||||
get_default_id(&default_id);
|
||||
id2 = default_id;
|
||||
}
|
||||
|
||||
match = strcmp(id1, id2) == 0;
|
||||
bfree(default_id);
|
||||
|
||||
return match;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,8 @@ struct audio_monitor {
|
|||
audio_resampler_t *resampler;
|
||||
uint32_t sample_rate;
|
||||
uint32_t channels;
|
||||
bool source_has_video : 1;
|
||||
bool source_has_video;
|
||||
bool ignore;
|
||||
|
||||
int64_t lowest_audio_offset;
|
||||
struct circlebuf delay_buffer;
|
||||
|
|
@ -203,6 +204,9 @@ unlock:
|
|||
|
||||
static inline void audio_monitor_free(struct audio_monitor *monitor)
|
||||
{
|
||||
if (monitor->ignore)
|
||||
return;
|
||||
|
||||
if (monitor->source) {
|
||||
obs_source_remove_audio_capture_callback(
|
||||
monitor->source, on_audio_playback, monitor);
|
||||
|
|
@ -235,7 +239,10 @@ static enum speaker_layout convert_speaker_layout(DWORD layout, WORD channels)
|
|||
return (enum speaker_layout)channels;
|
||||
}
|
||||
|
||||
static bool audio_monitor_init(struct audio_monitor *monitor)
|
||||
extern bool devices_match(const char *id1, const char *id2);
|
||||
|
||||
static bool audio_monitor_init(struct audio_monitor *monitor,
|
||||
obs_source_t *source)
|
||||
{
|
||||
IMMDeviceEnumerator *immde = NULL;
|
||||
WAVEFORMATEX *wfex = NULL;
|
||||
|
|
@ -243,12 +250,26 @@ static bool audio_monitor_init(struct audio_monitor *monitor)
|
|||
UINT32 frames;
|
||||
HRESULT hr;
|
||||
|
||||
pthread_mutex_init_value(&monitor->playback_mutex);
|
||||
|
||||
monitor->source = source;
|
||||
|
||||
const char *id = obs->audio.monitoring_device_id;
|
||||
if (!id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
pthread_mutex_init_value(&monitor->playback_mutex);
|
||||
if (source->info.output_flags & OBS_SOURCE_DO_NOT_SELF_MONITOR) {
|
||||
obs_data_t *s = obs_source_get_settings(source);
|
||||
const char *s_dev_id = obs_data_get_string(s, "device_id");
|
||||
bool match = devices_match(s_dev_id, id);
|
||||
obs_data_release(s);
|
||||
|
||||
if (match) {
|
||||
monitor->ignore = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------ *
|
||||
* Init device */
|
||||
|
|
@ -352,14 +373,15 @@ fail:
|
|||
return success;
|
||||
}
|
||||
|
||||
static void audio_monitor_init_final(struct audio_monitor *monitor,
|
||||
obs_source_t *source)
|
||||
static void audio_monitor_init_final(struct audio_monitor *monitor)
|
||||
{
|
||||
monitor->source = source;
|
||||
if (monitor->ignore)
|
||||
return;
|
||||
|
||||
monitor->source_has_video =
|
||||
(source->info.output_flags & OBS_SOURCE_VIDEO) != 0;
|
||||
obs_source_add_audio_capture_callback(source, on_audio_playback,
|
||||
monitor);
|
||||
(monitor->source->info.output_flags & OBS_SOURCE_VIDEO) != 0;
|
||||
obs_source_add_audio_capture_callback(monitor->source,
|
||||
on_audio_playback, monitor);
|
||||
}
|
||||
|
||||
struct audio_monitor *audio_monitor_create(obs_source_t *source)
|
||||
|
|
@ -367,7 +389,7 @@ struct audio_monitor *audio_monitor_create(obs_source_t *source)
|
|||
struct audio_monitor monitor = {0};
|
||||
struct audio_monitor *out;
|
||||
|
||||
if (!audio_monitor_init(&monitor)) {
|
||||
if (!audio_monitor_init(&monitor, source)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
|
@ -377,7 +399,7 @@ struct audio_monitor *audio_monitor_create(obs_source_t *source)
|
|||
da_push_back(obs->audio.monitors, &out);
|
||||
pthread_mutex_unlock(&obs->audio.monitoring_mutex);
|
||||
|
||||
audio_monitor_init_final(out, source);
|
||||
audio_monitor_init_final(out);
|
||||
return out;
|
||||
|
||||
fail:
|
||||
|
|
@ -391,14 +413,14 @@ void audio_monitor_reset(struct audio_monitor *monitor)
|
|||
bool success;
|
||||
|
||||
pthread_mutex_lock(&monitor->playback_mutex);
|
||||
success = audio_monitor_init(&new_monitor);
|
||||
success = audio_monitor_init(&new_monitor, monitor->source);
|
||||
pthread_mutex_unlock(&monitor->playback_mutex);
|
||||
|
||||
if (success) {
|
||||
obs_source_t *source = monitor->source;
|
||||
audio_monitor_free(monitor);
|
||||
*monitor = new_monitor;
|
||||
audio_monitor_init_final(monitor, source);
|
||||
audio_monitor_init_final(monitor);
|
||||
} else {
|
||||
audio_monitor_free(&new_monitor);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue