Index: code/sound/speech.cpp
===================================================================
--- code/sound/speech.cpp	(revision 10859)
+++ code/sound/speech.cpp	(working copy)
@@ -29,6 +29,9 @@
 	#include <sphelper.h>
 
 	ISpVoice *Voice_device;
+#elif defined(__APPLE__)
+#include <ApplicationServices/ApplicationServices.h>
+        SpeechChannel speech_channel;
 #elif defined(SCP_UNIX)
 	#include <fcntl.h>
 //	#include <stdio.h>
@@ -56,13 +59,18 @@
 		(void **)&Voice_device);
 
 	Speech_init = SUCCEEDED(hr);
+#elif defined(__APPLE__)
+    OSErr err;
+    err = NewSpeechChannel(NULL, &speech_channel);
+    if (err) {
+        return false;
+    }
+    Speech_init = true;
 #else
 
 	speech_dev = open("/dev/speech", O_WRONLY | O_DIRECT);
-//	speech_dev = fopen("/dev/speech", "w");
 
 	if (speech_dev == -1) {
-//	if (speech_dev == NULL) {
 		mprintf(("Couldn't open '/dev/speech', turning text-to-speech off...\n"));
 		return false;
 	}
@@ -79,9 +87,10 @@
 
 #ifdef _WIN32
 	Voice_device->Release();
+#elif defined(__APPLE__)
+    DisposeSpeechChannel(speech_channel);
 #else
 	close(speech_dev);
-//	fclose(speech_dev);
 #endif
 }
 
@@ -113,6 +122,35 @@
 
 	speech_stop();
 	return SUCCEEDED(Voice_device->Speak(Conversion_buffer, SPF_ASYNC, NULL));
+#elif defined(__APPLE__)
+	int len = strlen(text);
+	char Conversion_buffer[MAX_SPEECH_CHAR_LEN];
+
+	if(len > (MAX_SPEECH_CHAR_LEN - 1)) {
+		len = MAX_SPEECH_CHAR_LEN - 1;
+	}
+
+	int count = 0;
+	for(int i = 0; i < len; i++) {
+		if(text[i] == '$') {
+			i++;
+			continue;
+		}
+        if(text[i] == '\n') {
+            Conversion_buffer[count] = '\n';
+            count++;
+        }
+
+		Conversion_buffer[count] = text[i];
+		count++;
+	}
+
+	Conversion_buffer[count] = '\0';
+
+    CFStringRef speech_string = CFStringCreateWithCString(NULL, Conversion_buffer, kCFStringEncodingASCII);
+    OSErr err = SpeakCFString(speech_channel, speech_string, NULL);
+    CFRelease(speech_string);
+    return !err;
 #else
 	int len = strlen(text);
 	char Conversion_buffer[MAX_SPEECH_CHAR_LEN];
@@ -150,6 +188,8 @@
 	if(Speech_init == false) return true;
 #ifdef _WIN32
 	return SUCCEEDED(Voice_device->Pause());
+#elif defined(__APPLE__)
+    return !PauseSpeechAt(speech_channel, kEndOfWord);
 #else
 	STUB_FUNCTION;
 
@@ -162,6 +202,8 @@
 	if(Speech_init == false) return true;
 #ifdef _WIN32
 	return SUCCEEDED(Voice_device->Resume());
+#elif defined(__APPLE__)
+    return !ContinueSpeech(speech_channel);
 #else
 	STUB_FUNCTION;
 
@@ -174,6 +216,8 @@
 	if(Speech_init == false) return true;
 #ifdef _WIN32
     return SUCCEEDED(Voice_device->Speak( NULL, SPF_PURGEBEFORESPEAK, NULL ));
+#elif defined(__APPLE__)
+    return !StopSpeechAt(speech_channel, kEndOfWord);
 #else
 	STUB_FUNCTION;
 
@@ -185,6 +229,10 @@
 {
 #ifdef _WIN32
     return SUCCEEDED(Voice_device->SetVolume(volume));
+#elif defined(__APPLE__)    
+    OSErr err = SetSpeechInfo(speech_channel, soVolume, &volume);
+    if (err) return false;
+    return true;
 #else
 	STUB_FUNCTION;
 
@@ -228,9 +276,12 @@
 		count++;
 	}
 	return false;
+#elif defined(__APPLE__)
+    STUB_FUNCTION;
+    return true;
 #else
 	STUB_FUNCTION;
-
+    
 	return true;
 #endif
 }
@@ -246,6 +297,11 @@
 	if (FAILED(hr)) return false;
 
 	return (pStatus.dwRunningState != SPRS_DONE);
+#elif defined(__APPLE__)
+    SpeechStatusInfo status;
+    OSErr err = GetSpeechInfo(speech_channel, soStatus, &status);
+    if (err) return false;
+    return status.outputBusy;
 #else
 	STUB_FUNCTION;
 
Index: configure.ac
===================================================================
--- configure.ac	(revision 10859)
+++ configure.ac	(working copy)
@@ -395,6 +395,7 @@
 	FS2_CXXFLAGS="$FS2_CXXFLAGS -I/System/Library/Frameworks/OpenGL.framework/Headers"
 	FS2_LDFLAGS="$FS2_LDFLAGS -framework OpenGL"
 	AC_DEFINE([SCP_UNIX])
+	AC_DEFINE([FS2_SPEECH])
 	AC_DEFINE([NO_DIRECT3D])
 	## don't need the CFLAGS here if recent SDL is used
 elif test "$fs2_os_solaris" = "yes" ; then
@@ -473,7 +474,7 @@
 
 dnl extra OSX frameworks
 if test "$fs2_os_osx" = "yes" ; then
-	FS2_LDFLAGS="$FS2_LDFLAGS -framework AppKit -framework Foundation"
+	FS2_LDFLAGS="$FS2_LDFLAGS -framework AppKit -framework Foundation -framework ApplicationServices"
 fi
 
 
Index: projects/Xcode4/FS2_Open.xcodeproj/project.pbxproj
===================================================================
--- projects/Xcode4/FS2_Open.xcodeproj/project.pbxproj	(revision 10859)
+++ projects/Xcode4/FS2_Open.xcodeproj/project.pbxproj	(working copy)
@@ -4439,6 +4439,7 @@
 					SCP_UNIX,
 					USE_OPENAL,
 					APPLE_APP,
+					FS2_SPEECH,
 				);
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -4486,6 +4487,7 @@
 					SCP_UNIX,
 					USE_OPENAL,
 					APPLE_APP,
+					FS2_SPEECH,
 				);
 				GCC_STRICT_ALIASING = YES;
 				GCC_UNROLL_LOOPS = YES;
