src/sound/allegro_s.cpp
author rubidium
Tue, 25 Nov 2008 23:21:58 +0000
changeset 10381 c043aa0c1695
parent 10380 f4adb9648a93
permissions -rw-r--r--
(svn r14632) -Add: support Allegro as midi backend.
10380
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     1
/* $Id$ */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     2
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     3
/** @file allegro_s.cpp Playing sound via Allegro. */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     4
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     5
#ifdef WITH_ALLEGRO
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     6
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     7
#include "../stdafx.h"
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     8
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
     9
#include "../driver.h"
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    10
#include "../mixer.h"
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    11
#include "../sdl.h"
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    12
#include "allegro_s.h"
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    13
#include <allegro.h>
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    14
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    15
static FSoundDriver_Allegro iFSoundDriver_Allegro;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    16
/** The stream we are writing too */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    17
static AUDIOSTREAM *_stream = NULL;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    18
/** The number of samples in the buffer */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    19
static const int BUFFER_SIZE = 512;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    20
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    21
void SoundDriver_Allegro::MainLoop()
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    22
{
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    23
	/* We haven't opened a stream yet */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    24
	if (_stream == NULL) return;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    25
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    26
	void *data = get_audio_stream_buffer(_stream);
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    27
	/* We don't have to fill the stream yet */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    28
	if (data == NULL) return;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    29
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    30
	/* Mix the samples */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    31
	MxMixSamples(data, BUFFER_SIZE);
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    32
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    33
	/* Allegro sound is always unsigned, so we need to correct that */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    34
	uint16 *snd = (uint16*)data;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    35
	for (int i = 0; i < BUFFER_SIZE * 2; i++) snd[i] ^= 0x8000;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    36
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    37
	/* Tell we've filled the stream */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    38
	free_audio_stream_buffer(_stream);
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    39
}
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    40
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    41
/** There are multiple modules that might be using Allegro and
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    42
 * Allegro can only be initiated once. */
10381
c043aa0c1695 (svn r14632) -Add: support Allegro as midi backend.
rubidium
parents: 10380
diff changeset
    43
extern int _allegro_instance_count;
10380
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    44
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    45
const char *SoundDriver_Allegro::Start(const char * const *parm)
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    46
{
10381
c043aa0c1695 (svn r14632) -Add: support Allegro as midi backend.
rubidium
parents: 10380
diff changeset
    47
	if (_allegro_instance_count == 0 && install_allegro(SYSTEM_AUTODETECT, &errno, NULL)) return NULL;
c043aa0c1695 (svn r14632) -Add: support Allegro as midi backend.
rubidium
parents: 10380
diff changeset
    48
	_allegro_instance_count++;
10380
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    49
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    50
	/* Initialise the sound */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    51
	if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) != 0) return NULL;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    52
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    53
	/* Okay, there's no soundcard */
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    54
	if (digi_card == DIGI_NONE) {
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    55
		DEBUG(driver, 0, "allegro: no sound card found");
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    56
		return NULL;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    57
	}
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    58
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    59
	_stream = play_audio_stream(BUFFER_SIZE, 16, true, 11025, 255, 128);
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    60
	return NULL;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    61
}
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    62
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    63
void SoundDriver_Allegro::Stop()
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    64
{
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    65
	if (_stream != NULL) {
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    66
		stop_audio_stream(_stream);
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    67
		_stream = NULL;
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    68
	}
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    69
	remove_sound();
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    70
10381
c043aa0c1695 (svn r14632) -Add: support Allegro as midi backend.
rubidium
parents: 10380
diff changeset
    71
	if (--_allegro_instance_count == 0) allegro_exit();
10380
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    72
}
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    73
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents:
diff changeset
    74
#endif /* WITH_ALLEGRO */