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

Latest commit

 

History

History
165 lines (139 loc) · 4.56 KB

SDL_diskaudio.c

File metadata and controls

165 lines (139 loc) · 4.56 KB
 
Apr 8, 2011
Apr 8, 2011
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.
Feb 21, 2006
Feb 21, 2006
21
#include "SDL_config.h"
22
23
24
/* Output raw audio data to a file. */
Mar 4, 2006
Mar 4, 2006
25
#if HAVE_STDIO_H
26
#include <stdio.h>
Mar 4, 2006
Mar 4, 2006
27
#endif
Mar 4, 2006
Mar 4, 2006
29
#include "SDL_rwops.h"
Feb 10, 2006
Feb 10, 2006
30
#include "SDL_timer.h"
31
#include "SDL_audio.h"
Feb 16, 2006
Feb 16, 2006
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
Jul 10, 2006
Jul 10, 2006
45
static const char *
Oct 17, 2006
Oct 17, 2006
46
DISKAUD_GetOutputFilename(const char *devname)
Oct 17, 2006
Oct 17, 2006
48
49
50
51
if (devname == NULL) {
devname = SDL_getenv(DISKENVR_OUTFILE);
if (devname == NULL) {
devname = DISKDEFAULT_OUTFILE;
Jul 10, 2006
Jul 10, 2006
52
53
}
}
Oct 17, 2006
Oct 17, 2006
54
return devname;
55
56
57
}
/* This function waits until it is possible to write a full sound buffer */
Jul 10, 2006
Jul 10, 2006
58
static void
Oct 17, 2006
Oct 17, 2006
59
DISKAUD_WaitDevice(_THIS)
Jul 10, 2006
Jul 10, 2006
61
SDL_Delay(this->hidden->write_delay);
Jul 10, 2006
Jul 10, 2006
64
static void
Oct 17, 2006
Oct 17, 2006
65
DISKAUD_PlayDevice(_THIS)
Sep 5, 2009
Sep 5, 2009
67
size_t written;
Jul 10, 2006
Jul 10, 2006
69
70
71
/* Write the audio data */
written = SDL_RWwrite(this->hidden->output,
this->hidden->mixbuf, 1, this->hidden->mixlen);
Jul 10, 2006
Jul 10, 2006
73
/* If we couldn't write, assume fatal error for now */
Sep 5, 2009
Sep 5, 2009
74
if (written != this->hidden->mixlen) {
Jul 10, 2006
Jul 10, 2006
75
76
this->enabled = 0;
}
77
#ifdef DEBUG_AUDIO
Jul 10, 2006
Jul 10, 2006
78
fprintf(stderr, "Wrote %d bytes of audio data\n", written);
79
80
81
#endif
}
Jul 10, 2006
Jul 10, 2006
82
static Uint8 *
Oct 17, 2006
Oct 17, 2006
83
DISKAUD_GetDeviceBuf(_THIS)
Jul 10, 2006
Jul 10, 2006
85
return (this->hidden->mixbuf);
Jul 10, 2006
Jul 10, 2006
88
static void
Oct 17, 2006
Oct 17, 2006
89
DISKAUD_CloseDevice(_THIS)
Oct 17, 2006
Oct 17, 2006
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;
Jul 10, 2006
Jul 10, 2006
102
}
Jul 10, 2006
Jul 10, 2006
105
static int
Oct 17, 2006
Oct 17, 2006
106
DISKAUD_OpenDevice(_THIS, const char *devname, int iscapture)
Oct 17, 2006
Oct 17, 2006
108
109
110
111
const char *envr = SDL_getenv(DISKENVR_WRITEDELAY);
const char *fname = DISKAUD_GetOutputFilename(devname);
this->hidden = (struct SDL_PrivateAudioData *)
Oct 28, 2006
Oct 28, 2006
112
SDL_malloc(sizeof(*this->hidden));
Oct 17, 2006
Oct 17, 2006
113
114
115
116
if (this->hidden == NULL) {
SDL_OutOfMemory();
return 0;
}
Oct 28, 2006
Oct 28, 2006
117
SDL_memset(this->hidden, 0, sizeof(*this->hidden));
Jul 10, 2006
Jul 10, 2006
119
120
121
/* Open the audio device */
this->hidden->output = SDL_RWFromFile(fname, "wb");
if (this->hidden->output == NULL) {
Oct 17, 2006
Oct 17, 2006
122
123
DISKAUD_CloseDevice(this);
return 0;
Jul 10, 2006
Jul 10, 2006
124
}
Jul 10, 2006
Jul 10, 2006
126
127
128
/* Allocate mixing buffer */
this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen);
if (this->hidden->mixbuf == NULL) {
Oct 17, 2006
Oct 17, 2006
129
130
DISKAUD_CloseDevice(this);
return 0;
Jul 10, 2006
Jul 10, 2006
131
}
Oct 17, 2006
Oct 17, 2006
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
Jul 10, 2006
Jul 10, 2006
144
/* We're ready to rock and roll. :-) */
Oct 17, 2006
Oct 17, 2006
145
146
147
148
return 1;
}
static int
Oct 28, 2006
Oct 28, 2006
149
DISKAUD_Init(SDL_AudioDriverImpl * impl)
Oct 17, 2006
Oct 17, 2006
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;
Jan 26, 2010
Jan 26, 2010
158
return 1; /* this audio target is available. */
Oct 17, 2006
Oct 17, 2006
161
162
163
164
AudioBootStrap DISKAUD_bootstrap = {
DISKAUD_DRIVER_NAME, "direct-to-disk audio", DISKAUD_Init, 1
};
Jul 10, 2006
Jul 10, 2006
165
/* vi: set ts=4 sw=4 expandtab: */