Przeglądaj źródła

Haiku: add sound support

Kostadin Damyanov 10 lat temu
rodzic
commit
f5bfd497aa

+ 1 - 0
drivers/SCsub

@@ -12,6 +12,7 @@ SConscript('windows/SCsub');
 SConscript('gles2/SCsub');
 SConscript('gl_context/SCsub');
 SConscript('openssl/SCsub');
+SConscript('media_kit/SCsub');
 
 if (env["png"]=="yes"):
 	SConscript("png/SCsub");

+ 5 - 0
drivers/media_kit/SCsub

@@ -0,0 +1,5 @@
+Import('env')
+
+env.add_source_files(env.drivers_sources,"*.cpp")
+
+Export('env')

+ 143 - 0
drivers/media_kit/audio_driver_media_kit.cpp

@@ -0,0 +1,143 @@
+/*************************************************************************/
+/*  audio_driver_media_kit.cpp                                           */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                    http://www.godotengine.org                         */
+/*************************************************************************/
+/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                 */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+#include "audio_driver_media_kit.h"
+
+#ifdef MEDIA_KIT_ENABLED
+
+#include "globals.h"
+
+int32_t* AudioDriverMediaKit::samples_in = NULL;
+
+Error AudioDriverMediaKit::init() {
+	active = false;
+
+	mix_rate = 44100;
+	output_format = OUTPUT_STEREO;
+	channels = 2;
+
+	int latency = GLOBAL_DEF("audio/output_latency", 25);
+	buffer_size = nearest_power_of_2(latency * mix_rate / 1000);
+	samples_in = memnew_arr(int32_t, buffer_size * channels);
+
+	media_raw_audio_format format;
+	format = media_raw_audio_format::wildcard;
+	format.frame_rate = mix_rate;
+	format.channel_count = channels;
+	format.format = media_raw_audio_format::B_AUDIO_INT;
+	format.byte_order = B_MEDIA_LITTLE_ENDIAN;
+	format.buffer_size = buffer_size * sizeof(int32_t) * channels;
+
+	player = new BSoundPlayer(
+		&format,
+		"godot_sound_server",
+		AudioDriverMediaKit::PlayBuffer,
+		NULL,
+		this
+	);
+
+	if (player->InitCheck() != B_OK) {
+		fprintf(stderr, "MediaKit ERR: can not create a BSoundPlayer instance\n");
+		ERR_FAIL_COND_V(player == NULL, ERR_CANT_OPEN);
+	}
+
+	mutex = Mutex::create();
+	player->Start();
+
+	return OK;
+}
+
+void AudioDriverMediaKit::PlayBuffer(void* cookie, void* buffer, size_t size, const media_raw_audio_format& format) {
+	AudioDriverMediaKit* ad = (AudioDriverMediaKit*) cookie;
+	int32_t* buf = (int32_t*) buffer;
+
+	if (!ad->active) {
+		for (unsigned int i = 0; i < ad->buffer_size * ad->channels; i++) {
+			AudioDriverMediaKit::samples_in[i] = 0;
+		}
+	} else {
+		ad->lock();
+		ad->audio_server_process(ad->buffer_size, AudioDriverMediaKit::samples_in);
+		ad->unlock();
+	}
+
+	for (unsigned int i = 0; i < ad->buffer_size * ad->channels; i++) {
+		buf[i] = AudioDriverMediaKit::samples_in[i];
+	}
+}
+
+void AudioDriverMediaKit::start() {
+	active = true;
+}
+
+int AudioDriverMediaKit::get_mix_rate() const {
+	return mix_rate;
+}
+
+AudioDriverSW::OutputFormat AudioDriverMediaKit::get_output_format() const {
+	return output_format;
+}
+
+void AudioDriverMediaKit::lock() {
+	if (!mutex)
+		return;
+
+	mutex->lock();
+}
+
+void AudioDriverMediaKit::unlock() {
+	if (!mutex)
+		return;
+
+	mutex->unlock();
+}
+
+void AudioDriverMediaKit::finish() {
+	if (player)
+		delete player;
+
+	if (samples_in) {
+		memdelete_arr(samples_in);
+	};
+
+	if (mutex) {
+		memdelete(mutex);
+		mutex = NULL;
+	}
+}
+
+AudioDriverMediaKit::AudioDriverMediaKit() {
+	mutex = NULL;
+	player = NULL;
+}
+
+AudioDriverMediaKit::~AudioDriverMediaKit() {
+
+}
+
+#endif

+ 72 - 0
drivers/media_kit/audio_driver_media_kit.h

@@ -0,0 +1,72 @@
+/*************************************************************************/
+/*  audio_driver_media_kit.h                                             */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                    http://www.godotengine.org                         */
+/*************************************************************************/
+/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                 */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+#include "servers/audio/audio_server_sw.h"
+
+#ifdef MEDIA_KIT_ENABLED
+
+#include "core/os/thread.h"
+#include "core/os/mutex.h"
+
+#include <kernel/image.h> // needed for image_id
+#include <SoundPlayer.h>
+
+class AudioDriverMediaKit : public AudioDriverSW {
+	Mutex* mutex;
+
+	BSoundPlayer* player;
+	static int32_t* samples_in;
+
+	static void PlayBuffer(void* cookie, void* buffer, size_t size, const media_raw_audio_format& format);
+
+	unsigned int mix_rate;
+	OutputFormat output_format;
+	unsigned int buffer_size;
+	int channels;
+
+	bool active;
+
+public:
+
+	const char* get_name() const {
+		return "MediaKit";
+	};
+
+	virtual Error init();
+	virtual void start();
+	virtual int get_mix_rate() const;
+	virtual OutputFormat get_output_format() const;
+	virtual void lock();
+	virtual void unlock();
+	virtual void finish();
+
+	AudioDriverMediaKit();
+	~AudioDriverMediaKit();
+};
+
+#endif

+ 2 - 3
platform/haiku/detect.py

@@ -52,10 +52,9 @@ def configure(env):
 		env.Append(CCFLAGS=['-g2', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED'])
 	
 	#env.Append(CCFLAGS=['-DFREETYPE_ENABLED'])
-	env.Append(CPPFLAGS = ['-DGLEW_ENABLED'])
-	env.Append(CPPFLAGS = ['-DOPENGL_ENABLED'])
+	env.Append(CPPFLAGS = ['-DGLEW_ENABLED', '-DOPENGL_ENABLED', '-DMEDIA_KIT_ENABLED'])
 	env.Append(CPPFLAGS = ['-DUNIX_ENABLED', '-DGLES2_ENABLED', '-DGLES_OVER_GL'])
-	env.Append(LIBS = ['be', 'game', 'GL', 'GLEW', 'z', 'network', 'bnetapi'])
+	env.Append(LIBS = ['be', 'game', 'media', 'network', 'bnetapi', 'z', 'GL', 'GLEW'])
 	
 	import methods
 	env.Append(BUILDERS = {'GLSL120' : env.Builder(action = methods.build_legacygl_headers, suffix = 'glsl.h',src_suffix = '.glsl')})

+ 3 - 1
platform/haiku/os_haiku.cpp

@@ -11,7 +11,9 @@
 
 
 OS_Haiku::OS_Haiku() {
-	AudioDriverManagerSW::add_driver(&driver_dummy);
+#ifdef MEDIA_KIT_ENABLED
+	AudioDriverManagerSW::add_driver(&driver_media_kit);
+#endif
 };
 
 void OS_Haiku::run() {

+ 4 - 2
platform/haiku/os_haiku.h

@@ -11,7 +11,7 @@
 #include "servers/audio/sample_manager_sw.h"
 #include "servers/spatial_sound/spatial_sound_server_sw.h"
 #include "servers/spatial_sound_2d/spatial_sound_2d_server_sw.h"
-#include "servers/audio/audio_driver_dummy.h"
+#include "drivers/media_kit/audio_driver_media_kit.h"
 
 #include "context_gl_haiku.h"
 #include "haiku_application.h"
@@ -34,7 +34,9 @@ private:
 	SpatialSoundServerSW* spatial_sound_server;
 	SpatialSound2DServerSW* spatial_sound_2d_server;
 
-	AudioDriverDummy driver_dummy; // TODO: use a real driver
+#ifdef MEDIA_KIT_ENABLED
+	AudioDriverMediaKit driver_media_kit;
+#endif
 
 #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
 	ContextGL_Haiku* context_gl;