Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
195 lines (163 loc) · 5.19 KB

SDL_diskaudio.c

File metadata and controls

195 lines (163 loc) · 5.19 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Mar 23, 2006
Mar 23, 2006
22
This file written by Ryan C. Gordon (icculus@icculus.org)
Feb 21, 2006
Feb 21, 2006
24
#include "SDL_config.h"
25
26
27
/* Output raw audio data to a file. */
Mar 4, 2006
Mar 4, 2006
28
#if HAVE_STDIO_H
29
#include <stdio.h>
Mar 4, 2006
Mar 4, 2006
30
#endif
Mar 4, 2006
Mar 4, 2006
32
#include "SDL_rwops.h"
Feb 10, 2006
Feb 10, 2006
33
#include "SDL_timer.h"
34
#include "SDL_audio.h"
Feb 16, 2006
Feb 16, 2006
35
36
37
#include "../SDL_audiomem.h"
#include "../SDL_audio_c.h"
#include "../SDL_audiodev_c.h"
38
39
40
41
42
43
44
45
46
47
48
49
#include "SDL_diskaudio.h"
/* The tag name used by DISK audio */
#define DISKAUD_DRIVER_NAME "disk"
/* environment variables and defaults. */
#define DISKENVR_OUTFILE "SDL_DISKAUDIOFILE"
#define DISKDEFAULT_OUTFILE "sdlaudio.raw"
#define DISKENVR_WRITEDELAY "SDL_DISKAUDIODELAY"
#define DISKDEFAULT_WRITEDELAY 150
/* Audio driver functions */
May 29, 2006
May 29, 2006
50
51
52
53
54
static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec * spec);
static void DISKAUD_WaitAudio(_THIS);
static void DISKAUD_PlayAudio(_THIS);
static Uint8 *DISKAUD_GetAudioBuf(_THIS);
static void DISKAUD_CloseAudio(_THIS);
May 28, 2006
May 28, 2006
55
56
static const char *
May 29, 2006
May 29, 2006
57
DISKAUD_GetOutputFilename(void)
May 29, 2006
May 29, 2006
59
const char *envr = SDL_getenv(DISKENVR_OUTFILE);
May 28, 2006
May 28, 2006
60
return ((envr != NULL) ? envr : DISKDEFAULT_OUTFILE);
61
62
63
}
/* Audio driver bootstrap functions */
May 28, 2006
May 28, 2006
64
static int
May 29, 2006
May 29, 2006
65
DISKAUD_Available(void)
May 29, 2006
May 29, 2006
67
68
const char *envr = SDL_getenv("SDL_AUDIODRIVER");
if (envr && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
May 28, 2006
May 28, 2006
69
70
71
return (1);
}
return (0);
May 28, 2006
May 28, 2006
74
static void
May 29, 2006
May 29, 2006
75
DISKAUD_DeleteDevice(SDL_AudioDevice * device)
May 29, 2006
May 29, 2006
77
78
SDL_free(device->hidden);
SDL_free(device);
May 28, 2006
May 28, 2006
81
static SDL_AudioDevice *
May 29, 2006
May 29, 2006
82
DISKAUD_CreateDevice(int devindex)
May 28, 2006
May 28, 2006
84
85
86
87
SDL_AudioDevice *this;
const char *envr;
/* Initialize all variables that we clean on shutdown */
May 29, 2006
May 29, 2006
88
this = (SDL_AudioDevice *) SDL_malloc(sizeof(SDL_AudioDevice));
May 28, 2006
May 28, 2006
89
if (this) {
May 29, 2006
May 29, 2006
90
SDL_memset(this, 0, (sizeof *this));
May 28, 2006
May 28, 2006
91
this->hidden = (struct SDL_PrivateAudioData *)
May 29, 2006
May 29, 2006
92
SDL_malloc((sizeof *this->hidden));
May 28, 2006
May 28, 2006
93
94
}
if ((this == NULL) || (this->hidden == NULL)) {
May 29, 2006
May 29, 2006
95
SDL_OutOfMemory();
May 28, 2006
May 28, 2006
96
if (this) {
May 29, 2006
May 29, 2006
97
SDL_free(this);
May 28, 2006
May 28, 2006
98
99
100
}
return (0);
}
May 29, 2006
May 29, 2006
101
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
May 28, 2006
May 28, 2006
102
May 29, 2006
May 29, 2006
103
envr = SDL_getenv(DISKENVR_WRITEDELAY);
May 28, 2006
May 28, 2006
104
this->hidden->write_delay =
May 29, 2006
May 29, 2006
105
(envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY;
May 28, 2006
May 28, 2006
106
107
108
109
110
111
112
113
114
115
116
/* Set the function pointers */
this->OpenAudio = DISKAUD_OpenAudio;
this->WaitAudio = DISKAUD_WaitAudio;
this->PlayAudio = DISKAUD_PlayAudio;
this->GetAudioBuf = DISKAUD_GetAudioBuf;
this->CloseAudio = DISKAUD_CloseAudio;
this->free = DISKAUD_DeleteDevice;
return this;
117
118
119
}
AudioBootStrap DISKAUD_bootstrap = {
May 28, 2006
May 28, 2006
120
121
DISKAUD_DRIVER_NAME, "direct-to-disk audio",
DISKAUD_Available, DISKAUD_CreateDevice
122
123
124
};
/* This function waits until it is possible to write a full sound buffer */
May 28, 2006
May 28, 2006
125
static void
May 29, 2006
May 29, 2006
126
DISKAUD_WaitAudio(_THIS)
May 29, 2006
May 29, 2006
128
SDL_Delay(this->hidden->write_delay);
May 28, 2006
May 28, 2006
131
static void
May 29, 2006
May 29, 2006
132
DISKAUD_PlayAudio(_THIS)
May 28, 2006
May 28, 2006
134
int written;
May 28, 2006
May 28, 2006
136
/* Write the audio data */
May 29, 2006
May 29, 2006
137
138
written = SDL_RWwrite(this->hidden->output,
this->hidden->mixbuf, 1, this->hidden->mixlen);
May 28, 2006
May 28, 2006
140
141
142
143
/* If we couldn't write, assume fatal error for now */
if ((Uint32) written != this->hidden->mixlen) {
this->enabled = 0;
}
144
#ifdef DEBUG_AUDIO
May 29, 2006
May 29, 2006
145
fprintf(stderr, "Wrote %d bytes of audio data\n", written);
146
147
148
#endif
}
May 28, 2006
May 28, 2006
149
static Uint8 *
May 29, 2006
May 29, 2006
150
DISKAUD_GetAudioBuf(_THIS)
May 28, 2006
May 28, 2006
152
return (this->hidden->mixbuf);
May 28, 2006
May 28, 2006
155
static void
May 29, 2006
May 29, 2006
156
DISKAUD_CloseAudio(_THIS)
May 28, 2006
May 28, 2006
158
if (this->hidden->mixbuf != NULL) {
May 29, 2006
May 29, 2006
159
SDL_FreeAudioMem(this->hidden->mixbuf);
May 28, 2006
May 28, 2006
160
161
162
this->hidden->mixbuf = NULL;
}
if (this->hidden->output != NULL) {
May 29, 2006
May 29, 2006
163
SDL_RWclose(this->hidden->output);
May 28, 2006
May 28, 2006
164
165
this->hidden->output = NULL;
}
May 28, 2006
May 28, 2006
168
static int
May 29, 2006
May 29, 2006
169
DISKAUD_OpenAudio(_THIS, SDL_AudioSpec * spec)
May 29, 2006
May 29, 2006
171
const char *fname = DISKAUD_GetOutputFilename();
May 28, 2006
May 28, 2006
173
/* Open the audio device */
May 29, 2006
May 29, 2006
174
this->hidden->output = SDL_RWFromFile(fname, "wb");
May 28, 2006
May 28, 2006
175
176
177
if (this->hidden->output == NULL) {
return (-1);
}
Mar 4, 2006
Mar 4, 2006
178
#if HAVE_STDIO_H
May 29, 2006
May 29, 2006
179
180
fprintf(stderr, "WARNING: You are using the SDL disk writer"
" audio driver!\n Writing to file [%s].\n", fname);
Mar 4, 2006
Mar 4, 2006
181
#endif
May 28, 2006
May 28, 2006
183
184
/* Allocate mixing buffer */
this->hidden->mixlen = spec->size;
May 29, 2006
May 29, 2006
185
this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen);
May 28, 2006
May 28, 2006
186
187
188
if (this->hidden->mixbuf == NULL) {
return (-1);
}
May 29, 2006
May 29, 2006
189
SDL_memset(this->hidden->mixbuf, spec->silence, spec->size);
May 28, 2006
May 28, 2006
191
192
/* We're ready to rock and roll. :-) */
return (0);
May 28, 2006
May 28, 2006
195
/* vi: set ts=4 sw=4 expandtab: */