This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_diskaudio.c
165 lines (139 loc) · 4.56 KB
1
/*
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Simple DirectMedia Layer
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
20
*/
21
#include "SDL_config.h"
22
23
24
/* Output raw audio data to a file. */
25
#if HAVE_STDIO_H
26
#include <stdio.h>
27
#endif
28
29
#include "SDL_rwops.h"
30
#include "SDL_timer.h"
31
#include "SDL_audio.h"
32
33
#include "../SDL_audiomem.h"
#include "../SDL_audio_c.h"
34
35
36
37
38
39
40
41
42
43
44
#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
45
static const char *
46
DISKAUD_GetOutputFilename(const char *devname)
47
{
48
49
50
51
if (devname == NULL) {
devname = SDL_getenv(DISKENVR_OUTFILE);
if (devname == NULL) {
devname = DISKDEFAULT_OUTFILE;
52
53
}
}
54
return devname;
55
56
57
}
/* This function waits until it is possible to write a full sound buffer */
58
static void
59
DISKAUD_WaitDevice(_THIS)
60
{
61
SDL_Delay(this->hidden->write_delay);
62
63
}
64
static void
65
DISKAUD_PlayDevice(_THIS)
66
{
67
size_t written;
68
69
70
71
/* Write the audio data */
written = SDL_RWwrite(this->hidden->output,
this->hidden->mixbuf, 1, this->hidden->mixlen);
72
73
/* If we couldn't write, assume fatal error for now */
74
if (written != this->hidden->mixlen) {
75
76
this->enabled = 0;
}
77
#ifdef DEBUG_AUDIO
78
fprintf(stderr, "Wrote %d bytes of audio data\n", written);
79
80
81
#endif
}
82
static Uint8 *
83
DISKAUD_GetDeviceBuf(_THIS)
84
{
85
return (this->hidden->mixbuf);
86
87
}
88
static void
89
DISKAUD_CloseDevice(_THIS)
90
{
91
92
93
94
95
96
97
98
99
100
101
if (this->hidden != NULL) {
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;
}
SDL_free(this->hidden);
this->hidden = NULL;
102
}
103
104
}
105
static int
106
DISKAUD_OpenDevice(_THIS, const char *devname, int iscapture)
107
{
108
109
110
111
const char *envr = SDL_getenv(DISKENVR_WRITEDELAY);
const char *fname = DISKAUD_GetOutputFilename(devname);
this->hidden = (struct SDL_PrivateAudioData *)
112
SDL_malloc(sizeof(*this->hidden));
113
114
115
116
if (this->hidden == NULL) {
SDL_OutOfMemory();
return 0;
}
117
SDL_memset(this->hidden, 0, sizeof(*this->hidden));
118
119
120
121
/* Open the audio device */
this->hidden->output = SDL_RWFromFile(fname, "wb");
if (this->hidden->output == NULL) {
122
123
DISKAUD_CloseDevice(this);
return 0;
124
}
125
126
127
128
/* Allocate mixing buffer */
this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen);
if (this->hidden->mixbuf == NULL) {
129
130
DISKAUD_CloseDevice(this);
return 0;
131
}
132
133
134
135
136
137
138
139
140
141
142
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
143
144
/* We're ready to rock and roll. :-) */
145
146
147
148
return 1;
}
static int
149
DISKAUD_Init(SDL_AudioDriverImpl * impl)
150
151
152
153
154
155
156
157
{
/* Set the function pointers */
impl->OpenDevice = DISKAUD_OpenDevice;
impl->WaitDevice = DISKAUD_WaitDevice;
impl->PlayDevice = DISKAUD_PlayDevice;
impl->GetDeviceBuf = DISKAUD_GetDeviceBuf;
impl->CloseDevice = DISKAUD_CloseDevice;
158
return 1; /* this audio target is available. */
159
160
}
161
162
163
164
AudioBootStrap DISKAUD_bootstrap = {
DISKAUD_DRIVER_NAME, "direct-to-disk audio", DISKAUD_Init, 1
};
165
/* vi: set ts=4 sw=4 expandtab: */