comparison src/audio/disk/SDL_diskaudio.c @ 1895:c121d94672cb

SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 10 Jul 2006 21:04:37 +0000
parents c439dad53df8
children 5f6550e5184f 37c9c4590689
comparison
equal deleted inserted replaced
1894:c69cee13dd76 1895:c121d94672cb
45 #define DISKDEFAULT_OUTFILE "sdlaudio.raw" 45 #define DISKDEFAULT_OUTFILE "sdlaudio.raw"
46 #define DISKENVR_WRITEDELAY "SDL_DISKAUDIODELAY" 46 #define DISKENVR_WRITEDELAY "SDL_DISKAUDIODELAY"
47 #define DISKDEFAULT_WRITEDELAY 150 47 #define DISKDEFAULT_WRITEDELAY 150
48 48
49 /* Audio driver functions */ 49 /* Audio driver functions */
50 static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec *spec); 50 static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec * spec);
51 static void DISKAUD_WaitAudio(_THIS); 51 static void DISKAUD_WaitAudio(_THIS);
52 static void DISKAUD_PlayAudio(_THIS); 52 static void DISKAUD_PlayAudio(_THIS);
53 static Uint8 *DISKAUD_GetAudioBuf(_THIS); 53 static Uint8 *DISKAUD_GetAudioBuf(_THIS);
54 static void DISKAUD_CloseAudio(_THIS); 54 static void DISKAUD_CloseAudio(_THIS);
55 55
56 static const char *DISKAUD_GetOutputFilename(void) 56 static const char *
57 DISKAUD_GetOutputFilename(void)
57 { 58 {
58 const char *envr = SDL_getenv(DISKENVR_OUTFILE); 59 const char *envr = SDL_getenv(DISKENVR_OUTFILE);
59 return((envr != NULL) ? envr : DISKDEFAULT_OUTFILE); 60 return ((envr != NULL) ? envr : DISKDEFAULT_OUTFILE);
60 } 61 }
61 62
62 /* Audio driver bootstrap functions */ 63 /* Audio driver bootstrap functions */
63 static int DISKAUD_Available(void) 64 static int
65 DISKAUD_Available(void)
64 { 66 {
65 const char *envr = SDL_getenv("SDL_AUDIODRIVER"); 67 const char *envr = SDL_getenv("SDL_AUDIODRIVER");
66 if (envr && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) { 68 if (envr && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
67 return(1); 69 return (1);
68 } 70 }
69 return(0); 71 return (0);
70 } 72 }
71 73
72 static void DISKAUD_DeleteDevice(SDL_AudioDevice *device) 74 static void
75 DISKAUD_DeleteDevice(SDL_AudioDevice * device)
73 { 76 {
74 SDL_free(device->hidden); 77 SDL_free(device->hidden);
75 SDL_free(device); 78 SDL_free(device);
76 } 79 }
77 80
78 static SDL_AudioDevice *DISKAUD_CreateDevice(int devindex) 81 static SDL_AudioDevice *
82 DISKAUD_CreateDevice(int devindex)
79 { 83 {
80 SDL_AudioDevice *this; 84 SDL_AudioDevice *this;
81 const char *envr; 85 const char *envr;
82 86
83 /* Initialize all variables that we clean on shutdown */ 87 /* Initialize all variables that we clean on shutdown */
84 this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice)); 88 this = (SDL_AudioDevice *) SDL_malloc(sizeof(SDL_AudioDevice));
85 if ( this ) { 89 if (this) {
86 SDL_memset(this, 0, (sizeof *this)); 90 SDL_memset(this, 0, (sizeof *this));
87 this->hidden = (struct SDL_PrivateAudioData *) 91 this->hidden = (struct SDL_PrivateAudioData *)
88 SDL_malloc((sizeof *this->hidden)); 92 SDL_malloc((sizeof *this->hidden));
89 } 93 }
90 if ( (this == NULL) || (this->hidden == NULL) ) { 94 if ((this == NULL) || (this->hidden == NULL)) {
91 SDL_OutOfMemory(); 95 SDL_OutOfMemory();
92 if ( this ) { 96 if (this) {
93 SDL_free(this); 97 SDL_free(this);
94 } 98 }
95 return(0); 99 return (0);
96 } 100 }
97 SDL_memset(this->hidden, 0, (sizeof *this->hidden)); 101 SDL_memset(this->hidden, 0, (sizeof *this->hidden));
98 102
99 envr = SDL_getenv(DISKENVR_WRITEDELAY); 103 envr = SDL_getenv(DISKENVR_WRITEDELAY);
100 this->hidden->write_delay = (envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY; 104 this->hidden->write_delay =
105 (envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY;
101 106
102 /* Set the function pointers */ 107 /* Set the function pointers */
103 this->OpenAudio = DISKAUD_OpenAudio; 108 this->OpenAudio = DISKAUD_OpenAudio;
104 this->WaitAudio = DISKAUD_WaitAudio; 109 this->WaitAudio = DISKAUD_WaitAudio;
105 this->PlayAudio = DISKAUD_PlayAudio; 110 this->PlayAudio = DISKAUD_PlayAudio;
106 this->GetAudioBuf = DISKAUD_GetAudioBuf; 111 this->GetAudioBuf = DISKAUD_GetAudioBuf;
107 this->CloseAudio = DISKAUD_CloseAudio; 112 this->CloseAudio = DISKAUD_CloseAudio;
108 113
109 this->free = DISKAUD_DeleteDevice; 114 this->free = DISKAUD_DeleteDevice;
110 115
111 return this; 116 return this;
112 } 117 }
113 118
114 AudioBootStrap DISKAUD_bootstrap = { 119 AudioBootStrap DISKAUD_bootstrap = {
115 DISKAUD_DRIVER_NAME, "direct-to-disk audio", 120 DISKAUD_DRIVER_NAME, "direct-to-disk audio",
116 DISKAUD_Available, DISKAUD_CreateDevice 121 DISKAUD_Available, DISKAUD_CreateDevice
117 }; 122 };
118 123
119 /* This function waits until it is possible to write a full sound buffer */ 124 /* This function waits until it is possible to write a full sound buffer */
120 static void DISKAUD_WaitAudio(_THIS) 125 static void
126 DISKAUD_WaitAudio(_THIS)
121 { 127 {
122 SDL_Delay(this->hidden->write_delay); 128 SDL_Delay(this->hidden->write_delay);
123 } 129 }
124 130
125 static void DISKAUD_PlayAudio(_THIS) 131 static void
132 DISKAUD_PlayAudio(_THIS)
126 { 133 {
127 int written; 134 int written;
128 135
129 /* Write the audio data */ 136 /* Write the audio data */
130 written = SDL_RWwrite(this->hidden->output, 137 written = SDL_RWwrite(this->hidden->output,
131 this->hidden->mixbuf, 1, 138 this->hidden->mixbuf, 1, this->hidden->mixlen);
132 this->hidden->mixlen);
133 139
134 /* If we couldn't write, assume fatal error for now */ 140 /* If we couldn't write, assume fatal error for now */
135 if ( (Uint32)written != this->hidden->mixlen ) { 141 if ((Uint32) written != this->hidden->mixlen) {
136 this->enabled = 0; 142 this->enabled = 0;
137 } 143 }
138 #ifdef DEBUG_AUDIO 144 #ifdef DEBUG_AUDIO
139 fprintf(stderr, "Wrote %d bytes of audio data\n", written); 145 fprintf(stderr, "Wrote %d bytes of audio data\n", written);
140 #endif 146 #endif
141 } 147 }
142 148
143 static Uint8 *DISKAUD_GetAudioBuf(_THIS) 149 static Uint8 *
150 DISKAUD_GetAudioBuf(_THIS)
144 { 151 {
145 return(this->hidden->mixbuf); 152 return (this->hidden->mixbuf);
146 } 153 }
147 154
148 static void DISKAUD_CloseAudio(_THIS) 155 static void
156 DISKAUD_CloseAudio(_THIS)
149 { 157 {
150 if ( this->hidden->mixbuf != NULL ) { 158 if (this->hidden->mixbuf != NULL) {
151 SDL_FreeAudioMem(this->hidden->mixbuf); 159 SDL_FreeAudioMem(this->hidden->mixbuf);
152 this->hidden->mixbuf = NULL; 160 this->hidden->mixbuf = NULL;
153 } 161 }
154 if ( this->hidden->output != NULL ) { 162 if (this->hidden->output != NULL) {
155 SDL_RWclose(this->hidden->output); 163 SDL_RWclose(this->hidden->output);
156 this->hidden->output = NULL; 164 this->hidden->output = NULL;
157 } 165 }
158 } 166 }
159 167
160 static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec *spec) 168 static int
169 DISKAUD_OpenAudio(_THIS, SDL_AudioSpec * spec)
161 { 170 {
162 const char *fname = DISKAUD_GetOutputFilename(); 171 const char *fname = DISKAUD_GetOutputFilename();
163 172
164 /* Open the audio device */ 173 /* Open the audio device */
165 this->hidden->output = SDL_RWFromFile(fname, "wb"); 174 this->hidden->output = SDL_RWFromFile(fname, "wb");
166 if ( this->hidden->output == NULL ) { 175 if (this->hidden->output == NULL) {
167 return(-1); 176 return (-1);
168 } 177 }
169
170 #if HAVE_STDIO_H 178 #if HAVE_STDIO_H
171 fprintf(stderr, "WARNING: You are using the SDL disk writer" 179 fprintf(stderr, "WARNING: You are using the SDL disk writer"
172 " audio driver!\n Writing to file [%s].\n", fname); 180 " audio driver!\n Writing to file [%s].\n", fname);
173 #endif 181 #endif
174 182
175 /* Allocate mixing buffer */ 183 /* Allocate mixing buffer */
176 this->hidden->mixlen = spec->size; 184 this->hidden->mixlen = spec->size;
177 this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen); 185 this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen);
178 if ( this->hidden->mixbuf == NULL ) { 186 if (this->hidden->mixbuf == NULL) {
179 return(-1); 187 return (-1);
180 } 188 }
181 SDL_memset(this->hidden->mixbuf, spec->silence, spec->size); 189 SDL_memset(this->hidden->mixbuf, spec->silence, spec->size);
182 190
183 /* We're ready to rock and roll. :-) */ 191 /* We're ready to rock and roll. :-) */
184 return(0); 192 return (0);
185 } 193 }
186 194
195 /* vi: set ts=4 sw=4 expandtab: */