author | rubidium |
Tue, 25 Nov 2008 23:21:58 +0000 | |
changeset 10381 | c043aa0c1695 |
parent 10380 | f4adb9648a93 |
permissions | -rw-r--r-- |
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 */ |