diff --git a/OSBindings/Mac/Clock Signal/Audio/CSAudioQueue.h b/OSBindings/Mac/Clock Signal/Audio/CSAudioQueue.h index aac792cb0..370bea589 100644 --- a/OSBindings/Mac/Clock Signal/Audio/CSAudioQueue.h +++ b/OSBindings/Mac/Clock Signal/Audio/CSAudioQueue.h @@ -25,10 +25,12 @@ Creates an instance of CSAudioQueue. @param samplingRate The output audio rate. + @param isStereo @c YES if audio buffers will contain stereo audio, @c NO otherwise. @returns An instance of CSAudioQueue if successful; @c nil otherwise. */ -- (nonnull instancetype)initWithSamplingRate:(Float64)samplingRate; +- (nonnull instancetype)initWithSamplingRate:(Float64)samplingRate isStereo:(BOOL)isStereo NS_DESIGNATED_INITIALIZER; +- (nonnull instancetype)init __attribute((unavailable)); /*! Enqueues a buffer for playback. diff --git a/OSBindings/Mac/Clock Signal/Audio/CSAudioQueue.m b/OSBindings/Mac/Clock Signal/Audio/CSAudioQueue.m index b2769381e..2c4be5119 100644 --- a/OSBindings/Mac/Clock Signal/Audio/CSAudioQueue.m +++ b/OSBindings/Mac/Clock Signal/Audio/CSAudioQueue.m @@ -73,7 +73,7 @@ static void audioOutputCallback( #pragma mark - Standard object lifecycle -- (instancetype)initWithSamplingRate:(Float64)samplingRate { +- (instancetype)initWithSamplingRate:(Float64)samplingRate isStereo:(BOOL)isStereo { self = [super init]; if(self) { @@ -123,10 +123,6 @@ static void audioOutputCallback( return self; } -- (instancetype)init { - return [self initWithSamplingRate:[[self class] preferredSamplingRate]]; -} - - (void)dealloc { [CSAudioQueueDeallocLock lock]; if(_audioQueue) { diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index 54e85c1b0..327d447a8 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -228,11 +228,12 @@ class MachineDocument: // TODO: this needs to be threadsafe. FIX! let maximumSamplingRate = CSAudioQueue.preferredSamplingRate() let selectedSamplingRate = self.machine.idealSamplingRate(from: NSRange(location: 0, length: NSInteger(maximumSamplingRate))) + let isStereo = self.machine.isStereo() if selectedSamplingRate > 0 { - self.audioQueue = CSAudioQueue(samplingRate: Float64(selectedSamplingRate)) + self.audioQueue = CSAudioQueue(samplingRate: Float64(selectedSamplingRate), isStereo:isStereo) self.audioQueue.delegate = self self.machine.audioQueue = self.audioQueue - self.machine.setAudioSamplingRate(selectedSamplingRate, bufferSize:audioQueue.preferredBufferSize) + self.machine.setAudioSamplingRate(selectedSamplingRate, bufferSize:audioQueue.preferredBufferSize, stereo:isStereo) } } diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.h b/OSBindings/Mac/Clock Signal/Machine/CSMachine.h index 844f20243..dee3fff39 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.h +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.h @@ -58,7 +58,8 @@ typedef NS_ENUM(NSInteger, CSMachineKeyboardInputMode) { - (nullable instancetype)initWithAnalyser:(nonnull CSStaticAnalyser *)result missingROMs:(nullable inout NSMutableArray *)missingROMs NS_DESIGNATED_INITIALIZER; - (float)idealSamplingRateFromRange:(NSRange)range; -- (void)setAudioSamplingRate:(float)samplingRate bufferSize:(NSUInteger)bufferSize; +- (BOOL)isStereo; +- (void)setAudioSamplingRate:(float)samplingRate bufferSize:(NSUInteger)bufferSize stereo:(BOOL)stereo; - (void)setView:(nullable CSOpenGLView *)view aspectRatio:(float)aspectRatio; diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm index 3404597de..a671a87b7 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm @@ -262,17 +262,27 @@ struct ActivityObserver: public Activity::Observer { } } -- (void)setAudioSamplingRate:(float)samplingRate bufferSize:(NSUInteger)bufferSize { - @synchronized(self) { - [self setSpeakerDelegate:&_speakerDelegate sampleRate:samplingRate bufferSize:bufferSize]; - } -} - -- (BOOL)setSpeakerDelegate:(Outputs::Speaker::Speaker::Delegate *)delegate sampleRate:(float)sampleRate bufferSize:(NSUInteger)bufferSize { +- (BOOL)isStereo { @synchronized(self) { Outputs::Speaker::Speaker *speaker = _machine->crt_machine()->get_speaker(); if(speaker) { - speaker->set_output_rate(sampleRate, (int)bufferSize, false); + return speaker->get_is_stereo(); + } + return NO; + } +} + +- (void)setAudioSamplingRate:(float)samplingRate bufferSize:(NSUInteger)bufferSize stereo:(BOOL)stereo { + @synchronized(self) { + [self setSpeakerDelegate:&_speakerDelegate sampleRate:samplingRate bufferSize:bufferSize stereo:stereo]; + } +} + +- (BOOL)setSpeakerDelegate:(Outputs::Speaker::Speaker::Delegate *)delegate sampleRate:(float)sampleRate bufferSize:(NSUInteger)bufferSize stereo:(BOOL)stereo { + @synchronized(self) { + Outputs::Speaker::Speaker *speaker = _machine->crt_machine()->get_speaker(); + if(speaker) { + speaker->set_output_rate(sampleRate, (int)bufferSize, stereo); speaker->set_delegate(delegate); return YES; }