Skip to content

Commit 9ec94bc

Browse files
committed
coreaudio: correctly apply mute/volume adjustments
1 parent a53f9d0 commit 9ec94bc

4 files changed

Lines changed: 29 additions & 9 deletions

File tree

audio/audio_driver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ static void audio_driver_flush(audio_driver_state_t *audio_st,
492492

493493
/* Note: mute/volume is not applied here - driver must handle or ignore */
494494
audio_st->current_audio->write_raw(audio_st->context_audio_data,
495-
data, frames, input_rate, rate_adjust);
495+
data, frames, input_rate, rate_adjust, audio_volume_gain);
496496
return;
497497
}
498498

audio/audio_driver.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,19 @@ typedef struct audio_driver
170170
* Optional. Write raw int16 samples with resampling handled by driver.
171171
* If non-NULL, audio_driver will call this instead of doing software
172172
* resampling. The driver is responsible for resampling from input_rate
173-
* to its output rate, applying the rate_adjust factor for A/V sync.
173+
* to its output rate, applying the rate_adjust factor for A/V sync,
174+
* and applying the volume gain to the output.
174175
*
175176
* @param data Driver context
176177
* @param samples Interleaved int16 stereo samples (LRLRLR...)
177178
* @param frames Number of frames (pairs of samples)
178179
* @param input_rate Source sample rate in Hz
179180
* @param rate_adjust Rate adjustment multiplier for A/V sync (1.0 = normal)
181+
* @param volume Volume gain to apply (0.0 = muted, 1.0 = full volume)
180182
* @return Number of frames written, or -1 on error
181183
*/
182184
ssize_t (*write_raw)(void *data, const int16_t *samples, size_t frames,
183-
unsigned input_rate, double rate_adjust);
185+
unsigned input_rate, double rate_adjust, float volume);
184186
} audio_driver_t;
185187

186188
typedef struct

audio/drivers/coreaudio.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
#include <AudioUnit/AudioUnit.h>
3131
#include <AudioUnit/AUComponent.h>
3232

33+
/* Nb is defined by AES code included earlier in griffin.c amalgamation.
34+
* It conflicts with Sparse BLAS headers in Accelerate, so undefine it. */
35+
#undef Nb
36+
#include <Accelerate/Accelerate.h>
37+
3338
#include <boolean.h>
3439
#include <retro_endianness.h>
3540
#include <string/stdstring.h>
@@ -591,7 +596,7 @@ static ssize_t coreaudio_write(void *data, const void *buf_, size_t len)
591596

592597
/* Write raw int16 samples with hardware-accelerated resampling */
593598
static ssize_t coreaudio_write_raw(void *data, const int16_t *samples,
594-
size_t frames, unsigned input_rate, double rate_adjust)
599+
size_t frames, unsigned input_rate, double rate_adjust, float volume)
595600
{
596601
coreaudio_t *dev = (coreaudio_t*)data;
597602
double effective_rate;
@@ -639,6 +644,11 @@ static ssize_t coreaudio_write_raw(void *data, const int16_t *samples,
639644
if (output_frames == 0)
640645
break;
641646

647+
/* Apply volume to converted samples */
648+
if (volume != 1.0f)
649+
vDSP_vsmul(dev->conv_buffer, 1, &volume,
650+
dev->conv_buffer, 1, (vDSP_Length)(output_frames * 2));
651+
642652
/* Write converted samples to ring buffer */
643653
{
644654
float *out_ptr = dev->conv_buffer;

audio/drivers/coreaudio3.m

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#import <Foundation/Foundation.h>
1717
#import <AudioToolbox/AudioToolbox.h>
1818
#import <AVFoundation/AVFoundation.h>
19+
#import <Accelerate/Accelerate.h>
1920

2021
#include <stdio.h>
2122
#include <stdatomic.h>
@@ -197,7 +198,8 @@ - (ssize_t)writeFloat:(const float *)data samples:(size_t)samples;
197198
- (ssize_t)writeRawInt16:(const int16_t *)samples
198199
frames:(size_t)frames
199200
inputRate:(unsigned)inputRate
200-
rateAdjust:(double)rateAdjust;
201+
rateAdjust:(double)rateAdjust
202+
volume:(float)volume;
201203
- (void)start;
202204
- (void)stop;
203205

@@ -408,7 +410,8 @@ static OSStatus coreaudio3_converter_cb(
408410
- (ssize_t)writeRawInt16:(const int16_t *)samples
409411
frames:(size_t)frames
410412
inputRate:(unsigned)inputRate
411-
rateAdjust:(double)rateAdjust {
413+
rateAdjust:(double)rateAdjust
414+
volume:(float)volume {
412415
OSStatus err;
413416
double effectiveRate;
414417
size_t framesWritten = 0;
@@ -500,8 +503,12 @@ - (ssize_t)writeRawInt16:(const int16_t *)samples
500503
if (outputFrames == 0)
501504
break;
502505

503-
/* Write resampled float data to ring buffer */
506+
/* Apply volume to converted samples */
504507
outputSamples = outputFrames * 2;
508+
if (volume != 1.0f)
509+
vDSP_vsmul(_convBuffer, 1, &volume, _convBuffer, 1, (vDSP_Length)outputSamples);
510+
511+
/* Write resampled float data to ring buffer */
505512
written = [self writeFloat:_convBuffer samples:outputSamples];
506513

507514
if (written > 0)
@@ -607,7 +614,7 @@ static size_t coreaudio3_buffer_size(void *data)
607614
}
608615

609616
static ssize_t coreaudio3_write_raw(void *data, const int16_t *samples,
610-
size_t frames, unsigned input_rate, double rate_adjust)
617+
size_t frames, unsigned input_rate, double rate_adjust, float volume)
611618
{
612619
CoreAudio3 *dev = (__bridge CoreAudio3 *)data;
613620
if (dev == nil)
@@ -616,7 +623,8 @@ static ssize_t coreaudio3_write_raw(void *data, const int16_t *samples,
616623
return [dev writeRawInt16:samples
617624
frames:frames
618625
inputRate:input_rate
619-
rateAdjust:rate_adjust];
626+
rateAdjust:rate_adjust
627+
volume:volume];
620628
}
621629

622630
audio_driver_t audio_coreaudio3 = {

0 commit comments

Comments
 (0)