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

Latest commit

 

History

History
192 lines (160 loc) · 5.28 KB

SDL_diskaudio.c

File metadata and controls

192 lines (160 loc) · 5.28 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 */
Oct 1, 2006
Oct 1, 2006
50
static int DISKAUD_OpenAudio(_THIS, const char *devname, int iscapture);
51
52
53
54
55
static void DISKAUD_WaitAudio(_THIS);
static void DISKAUD_PlayAudio(_THIS);
static Uint8 *DISKAUD_GetAudioBuf(_THIS);
static void DISKAUD_CloseAudio(_THIS);
Jul 10, 2006
Jul 10, 2006
56
57
static const char *
DISKAUD_GetOutputFilename(void)
Jul 10, 2006
Jul 10, 2006
59
60
const char *envr = SDL_getenv(DISKENVR_OUTFILE);
return ((envr != NULL) ? envr : DISKDEFAULT_OUTFILE);
61
62
63
}
/* Audio driver bootstrap functions */
Jul 10, 2006
Jul 10, 2006
64
65
static int
DISKAUD_Available(void)
Oct 1, 2006
Oct 1, 2006
67
68
/* !!! FIXME: check this at a higher level... */
/* only ever use this driver if explicitly requested. */
Jul 10, 2006
Jul 10, 2006
69
const char *envr = SDL_getenv("SDL_AUDIODRIVER");
Oct 1, 2006
Oct 1, 2006
70
if (envr && (SDL_strcasecmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
Jul 10, 2006
Jul 10, 2006
71
72
73
return (1);
}
return (0);
Oct 1, 2006
Oct 1, 2006
76
77
static int
DISKAUD_Init(SDL_AudioDriverImpl *impl)
Jul 10, 2006
Jul 10, 2006
79
/* Initialize all variables that we clean on shutdown */
Oct 1, 2006
Oct 1, 2006
80
SDL_memset(impl, '\0', sizeof (SDL_AudioDriverImpl));
Jul 10, 2006
Jul 10, 2006
81
82
/* Set the function pointers */
Oct 1, 2006
Oct 1, 2006
83
84
85
86
87
impl->OpenAudio = DISKAUD_OpenAudio;
impl->WaitAudio = DISKAUD_WaitAudio;
impl->PlayAudio = DISKAUD_PlayAudio;
impl->GetAudioBuf = DISKAUD_GetAudioBuf;
impl->CloseAudio = DISKAUD_CloseAudio;
Jul 10, 2006
Jul 10, 2006
88
Oct 1, 2006
Oct 1, 2006
89
return 1;
90
91
92
}
AudioBootStrap DISKAUD_bootstrap = {
Jul 10, 2006
Jul 10, 2006
93
DISKAUD_DRIVER_NAME, "direct-to-disk audio",
Oct 1, 2006
Oct 1, 2006
94
DISKAUD_Available, DISKAUD_Init
95
96
97
};
/* This function waits until it is possible to write a full sound buffer */
Jul 10, 2006
Jul 10, 2006
98
99
static void
DISKAUD_WaitAudio(_THIS)
Jul 10, 2006
Jul 10, 2006
101
SDL_Delay(this->hidden->write_delay);
Jul 10, 2006
Jul 10, 2006
104
105
static void
DISKAUD_PlayAudio(_THIS)
Jul 10, 2006
Jul 10, 2006
107
int written;
Jul 10, 2006
Jul 10, 2006
109
110
111
/* Write the audio data */
written = SDL_RWwrite(this->hidden->output,
this->hidden->mixbuf, 1, this->hidden->mixlen);
Jul 10, 2006
Jul 10, 2006
113
114
115
116
/* If we couldn't write, assume fatal error for now */
if ((Uint32) written != this->hidden->mixlen) {
this->enabled = 0;
}
117
#ifdef DEBUG_AUDIO
Jul 10, 2006
Jul 10, 2006
118
fprintf(stderr, "Wrote %d bytes of audio data\n", written);
119
120
121
#endif
}
Jul 10, 2006
Jul 10, 2006
122
123
static Uint8 *
DISKAUD_GetAudioBuf(_THIS)
Jul 10, 2006
Jul 10, 2006
125
return (this->hidden->mixbuf);
Jul 10, 2006
Jul 10, 2006
128
129
static void
DISKAUD_CloseAudio(_THIS)
Jul 10, 2006
Jul 10, 2006
131
132
133
134
135
136
137
138
if (this->hidden->mixbuf != NULL) {
SDL_FreeAudioMem(this->hidden->mixbuf);
this->hidden->mixbuf = NULL;
}
if (this->hidden->output != NULL) {
SDL_RWclose(this->hidden->output);
this->hidden->output = NULL;
}
Oct 1, 2006
Oct 1, 2006
139
140
SDL_free(this->hidden);
this->hidden = NULL;
Jul 10, 2006
Jul 10, 2006
143
static int
Oct 1, 2006
Oct 1, 2006
144
DISKAUD_OpenAudio(_THIS, const char *devname, int iscapture)
Oct 1, 2006
Oct 1, 2006
146
const char *envr = SDL_getenv(DISKENVR_WRITEDELAY);
Jul 10, 2006
Jul 10, 2006
147
const char *fname = DISKAUD_GetOutputFilename();
Oct 1, 2006
Oct 1, 2006
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/* !!! FIXME: use device name for non-default filename? */
if (devname != NULL) {
SDL_SetError("Disk audio device name must be NULL");
return 0;
}
this->hidden = (struct SDL_PrivateAudioData *)
SDL_malloc(sizeof (*this->hidden));
if (this->hidden == NULL) {
SDL_OutOfMemory();
return 0;
}
SDL_memset(this->hidden, 0, sizeof (*this->hidden));
Jul 10, 2006
Jul 10, 2006
163
164
165
/* Open the audio device */
this->hidden->output = SDL_RWFromFile(fname, "wb");
if (this->hidden->output == NULL) {
Oct 1, 2006
Oct 1, 2006
166
167
DISKAUD_CloseAudio(this);
return 0;
Jul 10, 2006
Jul 10, 2006
168
}
Jul 10, 2006
Jul 10, 2006
170
171
172
/* Allocate mixing buffer */
this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen);
if (this->hidden->mixbuf == NULL) {
Oct 1, 2006
Oct 1, 2006
173
174
DISKAUD_CloseAudio(this);
return 0;
Jul 10, 2006
Jul 10, 2006
175
}
Oct 1, 2006
Oct 1, 2006
176
177
178
179
180
181
182
183
184
185
186
SDL_memset(this->hidden->mixbuf, this->spec.silence, this->spec.size);
this->hidden->mixlen = this->spec.size;
this->hidden->write_delay =
(envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY;
#if HAVE_STDIO_H
fprintf(stderr,
"WARNING: You are using the SDL disk writer audio driver!\n"
" Writing to file [%s].\n", fname);
#endif
Jul 10, 2006
Jul 10, 2006
188
/* We're ready to rock and roll. :-) */
Oct 1, 2006
Oct 1, 2006
189
return 1;
Jul 10, 2006
Jul 10, 2006
192
/* vi: set ts=4 sw=4 expandtab: */