Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Updated WinCE support by Dmitry (with some tweaks)
Converted the disk audio driver to SDL_RWops for portability
  • Loading branch information
slouken committed Mar 4, 2006
1 parent 5fed3fe commit 78fa4b0
Show file tree
Hide file tree
Showing 19 changed files with 376 additions and 179 deletions.
Binary file modified VisualC.zip
Binary file not shown.
Binary file modified VisualCE.zip
Binary file not shown.
30 changes: 24 additions & 6 deletions include/SDL_config_win32.h
Expand Up @@ -26,18 +26,34 @@
/* This is a set of defines to configure the SDL features */

#ifdef _MSC_VER
typedef __int8 int8_t;
typedef signed __int8 int8_t;
typedef unsigned __int8 uint8_t;
typedef __int16 int16_t;
typedef signed __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef __int32 int32_t;
typedef signed __int32 int32_t;
typedef unsigned __int32 uint32_t;
typedef __int64 int64_t;
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;
#if _MSC_VER <= 1200
typedef unsigned long uintptr_t;
#ifndef _UINTPTR_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 uintptr_t;
#else
typedef unsigned int uintptr_t;
#endif
#define _UINTPTR_T_DEFINED
#endif
#else
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
typedef unsigned int size_t;
typedef unsigned long uintptr_t;
#endif /* _MSC_VER */
#define SDL_HAS_64BIT_TYPE 1

/* Useful headers */
Expand Down Expand Up @@ -79,8 +95,10 @@ typedef unsigned long uintptr_t;
#define SDL_VIDEO_DRIVER_WINDIB 1

/* Enable OpenGL support */
#ifndef _WIN32_WCE
#define SDL_VIDEO_OPENGL 1
#define SDL_VIDEO_OPENGL_WGL 1
#endif

/* Enable assembly routines */
#define SDL_ASSEMBLY_ROUTINES 1
Expand Down
5 changes: 2 additions & 3 deletions include/SDL_thread.h
Expand Up @@ -59,7 +59,9 @@ typedef struct SDL_Thread SDL_Thread;
So, in short:
Always use the _beginthread() and _endthread() of the calling runtime library!
*/
#ifndef _WIN32_WCE
#include <process.h> // This has _beginthread() and _endthread() defined!
#endif
#ifdef __EMX__
#include <stdlib.h> // This has _beginthread() and _endthread() defined, if -Zmt flag is used!
#endif
Expand All @@ -68,9 +70,6 @@ typedef struct SDL_Thread SDL_Thread;
typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg);
typedef void (*pfnSDL_CurrentEndThread)(void);
#else
#ifdef __GNUC__
#include <stdint.h>
#endif
typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned,
unsigned (__stdcall *func)(void *), void *arg,
unsigned, unsigned *threadID);
Expand Down
6 changes: 3 additions & 3 deletions src/SDL.c
Expand Up @@ -325,8 +325,8 @@ unsigned _System LibMain(unsigned hmod, unsigned termination)

#elif defined(__WIN32__)

#if !defined(HAVE_LIBC) || defined(_WIN32_WCE) || (defined(__WATCOMC__) && defined(BUILD_DLL))
/* Need to include DllMain() on Windows CE and Watcom C for some reason.. */
#if !defined(HAVE_LIBC) || (defined(__WATCOMC__) && defined(BUILD_DLL))
/* Need to include DllMain() on Watcom C for some reason.. */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

Expand All @@ -343,6 +343,6 @@ BOOL APIENTRY _DllMainCRTStartup( HANDLE hModule,
}
return TRUE;
}
#endif /* _WIN32_WCE and building DLL with Watcom C */
#endif /* building DLL with Watcom C */

#endif /* OS/2 elif __WIN32__ */
13 changes: 7 additions & 6 deletions src/audio/SDL_wave.c
Expand Up @@ -550,12 +550,13 @@ SDL_AudioSpec * SDL_LoadWAV_RW (SDL_RWops *src, int freesrc,
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;
Expand Down
82 changes: 23 additions & 59 deletions src/audio/disk/SDL_diskaudio.c
Expand Up @@ -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"
Expand All @@ -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)
Expand All @@ -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));
Expand All @@ -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;
Expand All @@ -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
Expand All @@ -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;
Expand Down
9 changes: 5 additions & 4 deletions src/audio/disk/SDL_diskaudio.h
Expand Up @@ -24,17 +24,18 @@
#ifndef _SDL_diskaudio_h
#define _SDL_diskaudio_h

#include "SDL_rwops.h"
#include "../SDL_sysaudio.h"

/* Hidden "this" pointer for the video functions */
#define _THIS SDL_AudioDevice *this

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 */

0 comments on commit 78fa4b0

Please sign in to comment.