Mercurial > almixer_isolated
annotate EXAMPLES/playstream.c @ 62:7a4a8459f0c1
Ogg Vorbis decoder for SoundDecoder directly adapted from SDL_sound's code. Thanks to Johnson Lin for providing this!
Instead of trying to backport my Tremor decoder which originated from the SDL_sound Vorbis decoder, I told Johnson it would be better to just start at the source and avoid all the original gotchas I hit in the subtle differences between Tremor and Vorbis.
Since this derives directly from Ryan Gordon's SDL_sound implementation, I am putting this under the LGPL subdirectory.
Johnson Lin < arch . jslin - at - gmail . com >
author | Eric Wing <ewing . public |-at-| gmail . com> |
---|---|
date | Tue, 19 Jun 2012 00:31:12 -0700 |
parents | b1e13d5688d1 |
children | 20a687a4d4e0 |
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 #include <stdlib.h> |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
4 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
5 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
6 #if defined(_WIN32) |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
7 #define WIN32_LEAN_AND_MEAN |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
8 #include <windows.h> |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
9 #else |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
10 #include <unistd.h> |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
11 #endif |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
12 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
13 static void Internal_Delay(ALuint milliseconds_delay) |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
14 { |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
15 #if defined(_WIN32) |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
16 Sleep(milliseconds_delay); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
17 #else |
57
b1e13d5688d1
Fixed bug in EXAMPLES where usleep was not converted to microseconds.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
7
diff
changeset
|
18 usleep(milliseconds_delay*1000); |
4
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
19 #endif |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
20 } |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
21 #else |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
22 #include "SDL.h" |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
23 #define Internal_Delay SDL_Delay |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
24 #endif |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
25 #define MAX_SOURCES 16 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
26 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
27 ALboolean g_PlayingAudio[MAX_SOURCES]; |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
28 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
29 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
|
30 { |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
31 fprintf(stderr, "Channel %d finished\n", which_channel); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
32 g_PlayingAudio[which_channel] = AL_FALSE; |
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 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
35 int main(int argc, char* argv[]) |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
36 { |
7
ee50db043251
Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
4
diff
changeset
|
37 ALint i; |
ee50db043251
Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
4
diff
changeset
|
38 ALboolean still_playing = AL_TRUE; |
ee50db043251
Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
4
diff
changeset
|
39 |
ee50db043251
Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
4
diff
changeset
|
40 ALmixer_Data* audio_data[MAX_SOURCES]; |
ee50db043251
Cross-platform fixes.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
4
diff
changeset
|
41 |
4
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
42 if(argc < 1) |
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 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
|
45 } |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
46 else if(argc-1 > 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 printf("Maximum supported files is %d\n", MAX_SOURCES); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
49 } |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
50 ALmixer_Init(ALMIXER_DEFAULT_FREQUENCY, ALMIXER_DEFAULT_NUM_SOURCES, ALMIXER_DEFAULT_REFRESH); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
51 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
52 for(i=1; i<argc; i++) |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
53 { |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
54 if(!(audio_data[i-1]=ALmixer_LoadStream( argv[i], ALMIXER_DEFAULT_BUFFERSIZE, ALMIXER_DEFAULT_QUEUE_BUFFERS, ALMIXER_DEFAULT_STARTUP_BUFFERS, AL_FALSE) )) |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
55 /* |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
56 if(!(audio_data[i-1]=ALmixer_LoadStream( argv[i], 4096, 2, 1, AL_FALSE) )) |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
57 if(!(audio_data[i-1]=ALmixer_LoadStream( argv[i], 4096, 5 * 4, 2, AL_FALSE) )) |
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 printf("%s. Quiting program.\n", ALmixer_GetError()); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
61 exit(0); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
62 } |
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 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
65 ALmixer_SetPlaybackFinishedCallback(Internal_SoundFinished_CallbackIntercept, NULL); |
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 for(i=1; i<argc; i++) |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
68 { |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
69 g_PlayingAudio[i-1] = AL_TRUE; |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
70 ALmixer_PlayChannel(i-1, audio_data[i-1], 0); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
71 } |
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 while(still_playing) |
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 still_playing = AL_FALSE; |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
76 for(i=1; i<argc; i++) |
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 still_playing |= g_PlayingAudio[i-1]; |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
79 } |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
80 ALmixer_Update(); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
81 Internal_Delay(10); |
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 for(i=1; i<argc; i++) |
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 ALmixer_FreeData(audio_data[i-1]); |
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 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
89 ALmixer_Quit(); |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
90 |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
91 return 0; |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
92 } |
26aec5629f68
Added example programs.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
93 |