Updated WinCE support by Dmitry (with some tweaks)
Converted the disk audio driver to SDL_RWops for portability --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401469
This commit is contained in:
parent
2180b13d61
commit
7d970e27e2
19 changed files with 377 additions and 180 deletions
|
@ -550,12 +550,13 @@ done:
|
|||
if ( format != NULL ) {
|
||||
SDL_free(format);
|
||||
}
|
||||
if ( freesrc && src ) {
|
||||
SDL_RWclose(src);
|
||||
}
|
||||
else {
|
||||
// seek to the end of the file (given by the RIFF chunk)
|
||||
SDL_RWseek(src, wavelen - chunk.length - headerDiff, RW_SEEK_CUR);
|
||||
if ( src ) {
|
||||
if ( freesrc ) {
|
||||
SDL_RWclose(src);
|
||||
} else {
|
||||
// seek to the end of the file (given by the RIFF chunk)
|
||||
SDL_RWseek(src, wavelen - chunk.length - headerDiff, RW_SEEK_CUR);
|
||||
}
|
||||
}
|
||||
if ( was_error ) {
|
||||
spec = NULL;
|
||||
|
|
|
@ -26,16 +26,11 @@
|
|||
|
||||
/* Output raw audio data to a file. */
|
||||
|
||||
#if HAVE_STDIO_H
|
||||
#include <stdio.h>
|
||||
#include <string.h> /* For strerror() */
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#endif
|
||||
|
||||
#include "SDL_rwops.h"
|
||||
#include "SDL_timer.h"
|
||||
#include "SDL_audio.h"
|
||||
#include "../SDL_audiomem.h"
|
||||
|
@ -61,44 +56,18 @@ static void DISKAUD_CloseAudio(_THIS);
|
|||
|
||||
static const char *DISKAUD_GetOutputFilename(void)
|
||||
{
|
||||
const char *envr = SDL_getenv(DISKENVR_OUTFILE);
|
||||
return((envr != NULL) ? envr : DISKDEFAULT_OUTFILE);
|
||||
const char *envr = SDL_getenv(DISKENVR_OUTFILE);
|
||||
return((envr != NULL) ? envr : DISKDEFAULT_OUTFILE);
|
||||
}
|
||||
|
||||
/* Audio driver bootstrap functions */
|
||||
static int DISKAUD_Available(void)
|
||||
{
|
||||
#if 0
|
||||
int fd;
|
||||
int available;
|
||||
int exists = 0;
|
||||
struct stat statbuf;
|
||||
const char *fname = DISKAUD_GetOutputFilename();
|
||||
const char *envr = SDL_getenv("SDL_AUDIODRIVER");
|
||||
available = 0;
|
||||
|
||||
if ((envr) && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
|
||||
if (stat(fname, &statbuf) == 0)
|
||||
exists = 1;
|
||||
|
||||
fd = open(fname, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
|
||||
if ( fd != -1 ) {
|
||||
available = 1;
|
||||
close(fd);
|
||||
if (!exists) {
|
||||
unlink(fname);
|
||||
}
|
||||
}
|
||||
}
|
||||
return(available);
|
||||
#else
|
||||
const char *envr = SDL_getenv("SDL_AUDIODRIVER");
|
||||
if ((envr) && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
|
||||
if (envr && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
|
||||
return(1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void DISKAUD_DeleteDevice(SDL_AudioDevice *device)
|
||||
|
@ -110,7 +79,7 @@ static void DISKAUD_DeleteDevice(SDL_AudioDevice *device)
|
|||
static SDL_AudioDevice *DISKAUD_CreateDevice(int devindex)
|
||||
{
|
||||
SDL_AudioDevice *this;
|
||||
const char *envr;
|
||||
const char *envr;
|
||||
|
||||
/* Initialize all variables that we clean on shutdown */
|
||||
this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice));
|
||||
|
@ -128,8 +97,8 @@ static SDL_AudioDevice *DISKAUD_CreateDevice(int devindex)
|
|||
}
|
||||
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
|
||||
|
||||
envr = SDL_getenv(DISKENVR_WRITEDELAY);
|
||||
this->hidden->write_delay = (envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY;
|
||||
envr = SDL_getenv(DISKENVR_WRITEDELAY);
|
||||
this->hidden->write_delay = (envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY;
|
||||
|
||||
/* Set the function pointers */
|
||||
this->OpenAudio = DISKAUD_OpenAudio;
|
||||
|
@ -151,26 +120,20 @@ AudioBootStrap DISKAUD_bootstrap = {
|
|||
/* This function waits until it is possible to write a full sound buffer */
|
||||
static void DISKAUD_WaitAudio(_THIS)
|
||||
{
|
||||
SDL_Delay(this->hidden->write_delay);
|
||||
SDL_Delay(this->hidden->write_delay);
|
||||
}
|
||||
|
||||
static void DISKAUD_PlayAudio(_THIS)
|
||||
{
|
||||
int written;
|
||||
|
||||
/* Write the audio data, checking for EAGAIN on broken audio drivers */
|
||||
do {
|
||||
written = write(this->hidden->audio_fd,
|
||||
this->hidden->mixbuf,
|
||||
/* Write the audio data */
|
||||
written = SDL_RWwrite(this->hidden->output,
|
||||
this->hidden->mixbuf, 1,
|
||||
this->hidden->mixlen);
|
||||
if ( (written < 0) && ((errno == 0) || (errno == EAGAIN)) ) {
|
||||
SDL_Delay(1); /* Let a little CPU time go by */
|
||||
}
|
||||
} while ( (written < 0) &&
|
||||
((errno == 0) || (errno == EAGAIN) || (errno == EINTR)) );
|
||||
|
||||
/* If we couldn't write, assume fatal error for now */
|
||||
if ( written < 0 ) {
|
||||
if ( written != this->hidden->mixlen ) {
|
||||
this->enabled = 0;
|
||||
}
|
||||
#ifdef DEBUG_AUDIO
|
||||
|
@ -189,25 +152,26 @@ static void DISKAUD_CloseAudio(_THIS)
|
|||
SDL_FreeAudioMem(this->hidden->mixbuf);
|
||||
this->hidden->mixbuf = NULL;
|
||||
}
|
||||
if ( this->hidden->audio_fd >= 0 ) {
|
||||
close(this->hidden->audio_fd);
|
||||
this->hidden->audio_fd = -1;
|
||||
if ( this->hidden->output != NULL ) {
|
||||
SDL_RWclose(this->hidden->output);
|
||||
this->hidden->output = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||
{
|
||||
const char *fname = DISKAUD_GetOutputFilename();
|
||||
const char *fname = DISKAUD_GetOutputFilename();
|
||||
|
||||
/* Open the audio device */
|
||||
this->hidden->audio_fd = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
|
||||
if ( this->hidden->audio_fd < 0 ) {
|
||||
SDL_SetError("Couldn't open %s: %s", fname, strerror(errno));
|
||||
this->hidden->output = SDL_RWFromFile(fname, "wb");
|
||||
if ( this->hidden->output == NULL ) {
|
||||
return(-1);
|
||||
}
|
||||
|
||||
fprintf(stderr, "WARNING: You are using the SDL disk writer"
|
||||
#if HAVE_STDIO_H
|
||||
fprintf(stderr, "WARNING: You are using the SDL disk writer"
|
||||
" audio driver!\n Writing to file [%s].\n", fname);
|
||||
#endif
|
||||
|
||||
/* Allocate mixing buffer */
|
||||
this->hidden->mixlen = spec->size;
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#ifndef _SDL_diskaudio_h
|
||||
#define _SDL_diskaudio_h
|
||||
|
||||
#include "SDL_rwops.h"
|
||||
#include "../SDL_sysaudio.h"
|
||||
|
||||
/* Hidden "this" pointer for the video functions */
|
||||
|
@ -31,10 +32,10 @@
|
|||
|
||||
struct SDL_PrivateAudioData {
|
||||
/* The file descriptor for the audio device */
|
||||
int audio_fd;
|
||||
Uint8 *mixbuf;
|
||||
Uint32 mixlen;
|
||||
Uint32 write_delay;
|
||||
SDL_RWops *output;
|
||||
Uint8 *mixbuf;
|
||||
Uint32 mixlen;
|
||||
Uint32 write_delay;
|
||||
};
|
||||
|
||||
#endif /* _SDL_diskaudio_h */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue