Index: projects/Xcode4/FS2_Open.xcodeproj/project.pbxproj
===================================================================
--- projects/Xcode4/FS2_Open.xcodeproj/project.pbxproj	(revision 8666)
+++ projects/Xcode4/FS2_Open.xcodeproj/project.pbxproj	(working copy)
@@ -4169,6 +4169,7 @@
 					USE_OPENAL,
 					NO_DIRECT3D,
 					APPLE_APP,
+                                        FS2_SPEECH,
 				);
 				HEADER_SEARCH_PATHS = ../../libjpeg;
 				LIBRARY_STYLE = STATIC;
@@ -4213,6 +4214,7 @@
 					SCP_UNIX,
 					USE_OPENAL,
 					APPLE_APP,
+                                        FS2_SPEECH,
 				);
 				HEADER_SEARCH_PATHS = (
 					../../code,
@@ -4324,6 +4326,7 @@
 					SCP_UNIX,
 					USE_OPENAL,
 					APPLE_APP,
+                                        FS2_SPEECH,
 				);
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				GENERATE_PROFILING_CODE = NO;
@@ -4360,6 +4363,7 @@
 					SCP_UNIX,
 					USE_OPENAL,
 					APPLE_APP,
+                                        FS2_SPEECH,
 				);
 				GCC_STRICT_ALIASING = YES;
 				GCC_UNROLL_LOOPS = YES;
@@ -4535,6 +4539,7 @@
 					USE_OPENAL,
 					APPLE_APP,
 					INF_BUILD,
+                                        FS2_SPEECH,
 				);
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				GENERATE_PROFILING_CODE = NO;
@@ -4590,6 +4595,7 @@
 					USE_OPENAL,
 					APPLE_APP,
 					INF_BUILD,
+                                        FS2_SPEECH,
 				);
 				HEADER_SEARCH_PATHS = (
 					../../code,
@@ -4626,6 +4632,7 @@
 					USE_OPENAL,
 					NO_DIRECT3D,
 					APPLE_APP,
+                                        FS2_SPEECH,
 				);
 				HEADER_SEARCH_PATHS = ../../libjpeg;
 				LIBRARY_STYLE = STATIC;
@@ -4741,6 +4748,7 @@
 					USE_OPENAL,
 					APPLE_APP,
 					INF_BUILD,
+                                        FS2_SPEECH,
 				);
 				GCC_STRICT_ALIASING = YES;
 				GCC_UNROLL_LOOPS = YES;
@@ -4795,6 +4803,7 @@
 					USE_OPENAL,
 					APPLE_APP,
 					INF_BUILD,
+                                        FS2_SPEECH,
 				);
 				HEADER_SEARCH_PATHS = (
 					../../code,
Index: configure.ac
===================================================================
--- configure.ac	(revision 8666)
+++ configure.ac	(working copy)
@@ -436,7 +436,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: code/sound/speech.cpp
===================================================================
--- code/sound/speech.cpp	(revision 8666)
+++ 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,6 +59,13 @@
 		(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);
@@ -79,6 +89,8 @@
 
 #ifdef _WIN32
 	Voice_device->Release();
+#elif defined(__APPLE__)
+        DisposeSpeechChannel(speech_channel);
 #else
 	close(speech_dev);
 //	fclose(speech_dev);
@@ -113,6 +125,34 @@
 
 	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);
+        return !err;
 #else
 	int len = strlen(text);
 	char Conversion_buffer[MAX_SPEECH_CHAR_LEN];
@@ -150,6 +190,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 +204,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 +218,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 +231,9 @@
 {
 #ifdef _WIN32
     return SUCCEEDED(Voice_device->SetVolume(volume));
+#elif defined(__APPLE__)
+    STUB_FUNCTION;
+    return true;
 #else
 	STUB_FUNCTION;
 
@@ -228,6 +277,9 @@
 		count++;
 	}
 	return false;
+#elif defined(__APPLE__)
+        STUB_FUNCTION;
+        return true;
 #else
 	STUB_FUNCTION;
 
@@ -246,6 +298,11 @@
 	if (FAILED(hr)) return false;
 
 	return (pStatus.dwRunningState == SPRS_IS_SPEAKING);
+#elif defined(__APPLE__)
+        SpeechStatusInfo status;
+        OSErr err = GetSpeechInfo(speech_channel, soStatus, &status);
+        if (err) return false;
+        return status.outputBusy;
 #else
 	STUB_FUNCTION;
 
