From a5dcab40928140a475eb771c81268366f612b35c Mon Sep 17 00:00:00 2001
From: Thomas Harte <thomas.harte@gmail.com>
Date: Wed, 21 Oct 2020 21:16:00 -0400
Subject: [PATCH] Ensures machines with no audio output are handled correctly.

---
 .../Mac/Clock Signal/Machine/CSMachine.mm      | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm
index ff5e25265..540035c0e 100644
--- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm	
+++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm	
@@ -252,9 +252,17 @@ struct ActivityObserver: public Activity::Observer {
 //	}];
 }
 
+- (Outputs::Speaker::Speaker *)speaker {
+	const auto audio_producer = _machine->audio_producer();
+	if(!audio_producer) {
+		return nullptr;
+	}
+	return audio_producer->get_speaker();
+}
+
 - (float)idealSamplingRateFromRange:(NSRange)range {
 	@synchronized(self) {
-		Outputs::Speaker::Speaker *speaker = _machine->audio_producer()->get_speaker();
+		Outputs::Speaker::Speaker *speaker = [self speaker];
 		if(speaker) {
 			return speaker->get_ideal_clock_rate_in_range((float)range.location, (float)(range.location + range.length));
 		}
@@ -264,7 +272,7 @@ struct ActivityObserver: public Activity::Observer {
 
 - (BOOL)isStereo {
 	@synchronized(self) {
-		Outputs::Speaker::Speaker *speaker = _machine->audio_producer()->get_speaker();
+		Outputs::Speaker::Speaker *speaker = [self speaker];
 		if(speaker) {
 			return speaker->get_is_stereo();
 		}
@@ -280,7 +288,7 @@ struct ActivityObserver: public Activity::Observer {
 
 - (BOOL)setSpeakerDelegate:(Outputs::Speaker::Speaker::Delegate *)delegate sampleRate:(float)sampleRate bufferSize:(NSUInteger)bufferSize stereo:(BOOL)stereo {
 	@synchronized(self) {
-		Outputs::Speaker::Speaker *speaker = _machine->audio_producer()->get_speaker();
+		Outputs::Speaker::Speaker *speaker = [self speaker];
 		if(speaker) {
 			speaker->set_output_rate(sampleRate, (int)bufferSize, stereo);
 			speaker->set_delegate(delegate);
@@ -678,7 +686,7 @@ struct ActivityObserver: public Activity::Observer {
 
 - (void)setVolume:(float)volume {
 	@synchronized(self) {
-		Outputs::Speaker::Speaker *speaker = _machine->audio_producer()->get_speaker();
+		Outputs::Speaker::Speaker *speaker = [self speaker];
 		if(speaker) {
 			return speaker->set_output_volume(volume);
 		}
@@ -687,7 +695,7 @@ struct ActivityObserver: public Activity::Observer {
 
 - (BOOL)hasAudioOutput {
 	@synchronized(self) {
-		Outputs::Speaker::Speaker *speaker = _machine->audio_producer()->get_speaker();
+		Outputs::Speaker::Speaker *speaker = [self speaker];
 		return speaker ? YES : NO;
 	}
 }