diff --git a/platform/osx/audio_driver_osx.cpp b/platform/osx/audio_driver_osx.cpp
index b18c9e1c915..1eb1591a4e2 100644
--- a/platform/osx/audio_driver_osx.cpp
+++ b/platform/osx/audio_driver_osx.cpp
@@ -103,6 +103,7 @@ Error AudioDriverOSX::finishDevice() {
 Error AudioDriverOSX::init() {
 	OSStatus result;
 
+	mutex = Mutex::create();
 	active = false;
 	channels = 2;
 
@@ -159,43 +160,30 @@ OSStatus AudioDriverOSX::output_callback(void *inRefCon,
 		UInt32 inBusNumber, UInt32 inNumberFrames,
 		AudioBufferList *ioData) {
 
-	AudioBuffer *abuf;
 	AudioDriverOSX *ad = (AudioDriverOSX *)inRefCon;
 
-	bool mix = true;
-
-	if (!ad->active)
-		mix = false;
-	else if (ad->mutex) {
-		mix = ad->mutex->try_lock() == OK;
-	};
-
-	if (!mix) {
+	if (!ad->active || !ad->try_lock()) {
 		for (unsigned int i = 0; i < ioData->mNumberBuffers; i++) {
-			abuf = &ioData->mBuffers[i];
+			AudioBuffer *abuf = &ioData->mBuffers[i];
 			zeromem(abuf->mData, abuf->mDataByteSize);
 		};
 		return 0;
 	};
 
-	int frames_left;
-
 	for (unsigned int i = 0; i < ioData->mNumberBuffers; i++) {
 
-		abuf = &ioData->mBuffers[i];
-		frames_left = inNumberFrames;
+		AudioBuffer *abuf = &ioData->mBuffers[i];
+		int frames_left = inNumberFrames;
 		int16_t *out = (int16_t *)abuf->mData;
 
 		while (frames_left) {
 
 			int frames = MIN(frames_left, ad->buffer_frames);
-			//ad->lock();
 			ad->audio_server_process(frames, ad->samples_in);
-			//ad->unlock();
 
-			for (int i = 0; i < frames * ad->channels; i++) {
+			for (int j = 0; j < frames * ad->channels; j++) {
 
-				out[i] = ad->samples_in[i] >> 16;
+				out[j] = ad->samples_in[j] >> 16;
 			}
 
 			frames_left -= frames;
@@ -203,8 +191,7 @@ OSStatus AudioDriverOSX::output_callback(void *inRefCon,
 		};
 	};
 
-	if (ad->mutex)
-		ad->mutex->unlock();
+	ad->unlock();
 
 	return 0;
 };
@@ -232,11 +219,18 @@ void AudioDriverOSX::lock() {
 	if (mutex)
 		mutex->lock();
 };
+
 void AudioDriverOSX::unlock() {
 	if (mutex)
 		mutex->unlock();
 };
 
+bool AudioDriverOSX::try_lock() {
+	if (mutex)
+		return mutex->try_lock() == OK;
+	return true;
+}
+
 void AudioDriverOSX::finish() {
 	OSStatus result;
 
@@ -247,16 +241,23 @@ void AudioDriverOSX::finish() {
 		ERR_PRINT("AudioObjectRemovePropertyListener failed");
 	}
 
-	memdelete_arr(samples_in);
+	if (mutex) {
+		memdelete(mutex);
+		mutex = NULL;
+	}
+
+	if (samples_in) {
+		memdelete_arr(samples_in);
+		samples_in = NULL;
+	}
 };
 
 AudioDriverOSX::AudioDriverOSX() {
-
-	mutex = Mutex::create(); //NULL;
+	mutex = NULL;
+	samples_in = NULL;
 };
 
-AudioDriverOSX::~AudioDriverOSX(){
-
+AudioDriverOSX::~AudioDriverOSX() {
 };
 
 #endif
diff --git a/platform/osx/audio_driver_osx.h b/platform/osx/audio_driver_osx.h
index f165a2b5edd..93faae1d373 100644
--- a/platform/osx/audio_driver_osx.h
+++ b/platform/osx/audio_driver_osx.h
@@ -70,6 +70,7 @@ public:
 	virtual void unlock();
 	virtual void finish();
 
+	bool try_lock();
 	Error reopen();
 
 	AudioDriverOSX();