annotate EXAMPLES/playsound.c @ 78:714ec6c5789d

Fixed a unit conversion bug in the Ogg Tremor decoder for SoundDecoder. This fixes out of memory issues with LoadAll on long, but still reasonably sized .ogg files on some Android devices. Ogg Vorbis uses seconds and we multiply by 1000 to convert to milliseconds. But Ogg Tremor already uses milliseconds but I was still multiplying by 1000. (The Tremor decoder was derived from the Vorbis decoder so this is actually the second time I hit a bug like this.)
author Eric Wing <ewing . public |-at-| gmail . com>
date Thu, 25 Oct 2012 16:12:50 -0700
parents b1e13d5688d1
children
rev   line source
4
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
1 #include "ALmixer.h"
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
2 #include <stdio.h>
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
3
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
4 #ifdef ALMIXER_COMPILE_WITHOUT_SDL
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
5 #if defined(_WIN32)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
6 #define WIN32_LEAN_AND_MEAN
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
7 #include <windows.h>
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
8 #else
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
9 #include <unistd.h>
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
10 #endif
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
11
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
12 static void Internal_Delay(ALuint milliseconds_delay)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
13 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
14 #if defined(_WIN32)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
15 Sleep(milliseconds_delay);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
16 #else
57
b1e13d5688d1 Fixed bug in EXAMPLES where usleep was not converted to microseconds.
Eric Wing <ewing . public |-at-| gmail . com>
parents: 11
diff changeset
17 usleep(milliseconds_delay*1000);
4
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
18 #endif
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
19 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
20 #else
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
21 #include "SDL.h"
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
22 #define Internal_Delay SDL_Delay
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
23 #endif
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
24 #define MAX_SOURCES 16
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
25
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
26 ALboolean g_PlayingAudio[MAX_SOURCES];
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
27
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
28 void Internal_SoundFinished_CallbackIntercept(ALint which_channel, ALuint al_source, ALmixer_Data* almixer_data, ALboolean finished_naturally, void* user_data)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
29 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
30 fprintf(stderr, "Channel %d finished\n", which_channel);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
31 g_PlayingAudio[which_channel] = AL_FALSE;
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
32 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
33
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
34 int main(int argc, char* argv[])
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
35 {
7
ee50db043251 Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents: 4
diff changeset
36 ALint i;
ee50db043251 Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents: 4
diff changeset
37 ALboolean still_playing = AL_TRUE;
ee50db043251 Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents: 4
diff changeset
38
ee50db043251 Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents: 4
diff changeset
39 ALmixer_Data* audio_data[MAX_SOURCES];
4
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
40 if(argc < 1)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
41 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
42 printf("Pass a sound file (or files) as a parameter\n");
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
43 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
44 else if(argc-1 > MAX_SOURCES)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
45 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
46 printf("Maximum supported files is %d\n", MAX_SOURCES);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
47 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
48
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
49 ALmixer_Init(22050, 0, 0);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
50
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
51 for(i=1; i<argc; i++)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
52 {
11
eca6f008fad0 Shouldn't be enabling data callbacks for the example since they aren't used.
Eric Wing <ewing . public |-at-| gmail . com>
parents: 7
diff changeset
53 if(!(audio_data[i-1]=ALmixer_LoadAll( argv[i], AL_FALSE) ))
4
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
54 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
55 printf("%s. Quiting program.\n", ALmixer_GetError());
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
56 exit(0);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
57 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
58 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
59
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
60 ALmixer_SetPlaybackFinishedCallback(Internal_SoundFinished_CallbackIntercept, NULL);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
61
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
62 for(i=1; i<argc; i++)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
63 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
64 g_PlayingAudio[i-1] = AL_TRUE;
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
65 ALmixer_PlayChannel(i-1, audio_data[i-1], 0);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
66 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
67
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
68 while(still_playing)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
69 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
70 still_playing = AL_FALSE;
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
71 for(i=1; i<argc; i++)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
72 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
73 still_playing |= g_PlayingAudio[i-1];
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
74 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
75 ALmixer_Update();
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
76 Internal_Delay(10);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
77 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
78
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
79 for(i=1; i<argc; i++)
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
80 {
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
81 ALmixer_FreeData(audio_data[i-1]);
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
82 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
83
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
84 ALmixer_Quit();
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
85
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
86 return 0;
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
87 }
26aec5629f68 Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff changeset
88