Mypal/media/libcubeb/uplift-part-of-f07ee6d-esr5...

168 lines
4.5 KiB
Diff

# HG changeset patch
# User Alex Chronopoulos <achronop@gmail.com>
# Parent 00c051cd38c7a6cb3178fd0890d52056f83abfdc
Bug 1345049 - Uplift part of cubeb upstream f07ee6d to esr52. r=padenot. a=xxxxxx
diff --git a/media/libcubeb/src/cubeb_audiounit.cpp b/media/libcubeb/src/cubeb_audiounit.cpp
--- a/media/libcubeb/src/cubeb_audiounit.cpp
+++ b/media/libcubeb/src/cubeb_audiounit.cpp
@@ -590,33 +590,43 @@ audiounit_get_input_device_id(AudioDevic
device_id);
if (r != noErr) {
return CUBEB_ERROR;
}
return CUBEB_OK;
}
+static int audiounit_stream_get_volume(cubeb_stream * stm, float * volume);
+static int audiounit_stream_set_volume(cubeb_stream * stm, float volume);
+
static int
audiounit_reinit_stream(cubeb_stream * stm, bool is_started)
{
+ auto_lock context_lock(stm->context->mutex);
if (is_started) {
audiounit_stream_stop_internal(stm);
}
{
auto_lock lock(stm->mutex);
+ float volume = 0.0;
+ int vol_rv = audiounit_stream_get_volume(stm, &volume);
audiounit_close_stream(stm);
if (audiounit_setup_stream(stm) != CUBEB_OK) {
LOG("(%p) Stream reinit failed.", stm);
return CUBEB_ERROR;
}
+ if (vol_rv == CUBEB_OK) {
+ audiounit_stream_set_volume(stm, volume);
+ }
+
// Reset input frames to force new stream pre-buffer
// silence if needed, check `is_extra_input_needed()`
stm->frames_read = 0;
// If the stream was running, start it again.
if (is_started) {
audiounit_stream_start_internal(stm);
}
@@ -1007,20 +1017,22 @@ audiounit_get_preferred_sample_rate(cube
static OSStatus audiounit_remove_device_listener(cubeb * context);
static void
audiounit_destroy(cubeb * ctx)
{
// Disabling this assert for bug 1083664 -- we seem to leak a stream
// assert(ctx->active_streams == 0);
- /* Unregister the callback if necessary. */
- if(ctx->collection_changed_callback) {
+ {
auto_lock lock(ctx->mutex);
- audiounit_remove_device_listener(ctx);
+ /* Unregister the callback if necessary. */
+ if(ctx->collection_changed_callback) {
+ audiounit_remove_device_listener(ctx);
+ }
}
ctx->~cubeb();
free(ctx);
}
static void audiounit_stream_destroy(cubeb_stream * stm);
@@ -1861,17 +1873,17 @@ audiounit_close_stream(cubeb_stream *stm
cubeb_resampler_destroy(stm->resampler);
}
static void
audiounit_stream_destroy(cubeb_stream * stm)
{
stm->shutdown = true;
- auto_lock context_locl(stm->context->mutex);
+ auto_lock context_lock(stm->context->mutex);
audiounit_stream_stop_internal(stm);
{
auto_lock lock(stm->mutex);
audiounit_close_stream(stm);
}
#if !TARGET_OS_IPHONE
@@ -1905,17 +1917,17 @@ audiounit_stream_start_internal(cubeb_st
}
static int
audiounit_stream_start(cubeb_stream * stm)
{
stm->shutdown = false;
stm->draining = false;
- auto_lock context_locl(stm->context->mutex);
+ auto_lock context_lock(stm->context->mutex);
audiounit_stream_start_internal(stm);
stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STARTED);
LOG("Cubeb stream (%p) started successfully.", stm);
return CUBEB_OK;
}
@@ -1933,17 +1945,17 @@ audiounit_stream_stop_internal(cubeb_str
}
}
static int
audiounit_stream_stop(cubeb_stream * stm)
{
stm->shutdown = true;
- auto_lock context_locl(stm->context->mutex);
+ auto_lock context_lock(stm->context->mutex);
audiounit_stream_stop_internal(stm);
stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STOPPED);
LOG("Cubeb stream (%p) stopped successfully.", stm);
return CUBEB_OK;
}
@@ -2030,16 +2042,31 @@ audiounit_stream_get_latency(cubeb_strea
}
*latency = stm->hw_latency_frames + stm->current_latency_frames;
return CUBEB_OK;
#endif
}
+static int
+audiounit_stream_get_volume(cubeb_stream * stm, float * volume)
+{
+ assert(stm->output_unit);
+ OSStatus r = AudioUnitGetParameter(stm->output_unit,
+ kHALOutputParam_Volume,
+ kAudioUnitScope_Global,
+ 0, volume);
+ if (r != noErr) {
+ LOG("AudioUnitGetParameter/kHALOutputParam_Volume rv=%d", r);
+ return CUBEB_ERROR;
+ }
+ return CUBEB_OK;
+}
+
int audiounit_stream_set_volume(cubeb_stream * stm, float volume)
{
OSStatus r;
r = AudioUnitSetParameter(stm->output_unit,
kHALOutputParam_Volume,
kAudioUnitScope_Global,
0, volume, 0);