X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=snd_oss.c;h=05f91c92ff50ded803d3f5d9712294a692eece33;hp=2693e51b0c4e3ba1863f1dff0a9f3a1ddef5a112;hb=1f7645e73c1f099c486c716dbd21dda6d55297ea;hpb=844bad4f7cddcc970715f9fc9d22d74896cc9df4 diff --git a/snd_oss.c b/snd_oss.c index 2693e51b..05f91c92 100644 --- a/snd_oss.c +++ b/snd_oss.c @@ -20,13 +20,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // OSS module, used by Linux and FreeBSD +#include "quakedef.h" +#include #include #include #include #include -#include "quakedef.h" #include "snd_main.h" @@ -45,7 +46,7 @@ Create "snd_renderbuffer" with the proper sound format if the call is successful May return a suggested format if the requested format isn't available ==================== */ -qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) +qbool SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) { int flags, ioctl_param, prev_value; unsigned int fragmentsize; @@ -60,7 +61,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) if (suggested != NULL) { - memcpy(suggested, requested, sizeof(suggested)); + memcpy(suggested, requested, sizeof(*suggested)); if (requested->width < 1) suggested->width = 1; @@ -90,10 +91,8 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) else Con_Print("SndSys_Init: fcntl(F_GETFL) failed!\n"); - ioctl(audio_fd, SNDCTL_DSP_RESET, NULL); - // Set the fragment size (up to "NB_FRAGMENTS" fragments of "fragmentsize" bytes) - fragmentsize = requested->speed * requested->channels * requested->width / 5; + fragmentsize = requested->speed * requested->channels * requested->width / 10; fragmentsize = (unsigned int)ceilf((float)fragmentsize / (float)NB_FRAGMENTS); fragmentsize = CeilPowerOf2(fragmentsize); ioctl_param = (NB_FRAGMENTS << 16) | log2i(fragmentsize); @@ -103,6 +102,8 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) SndSys_Shutdown (); return false; } + Con_Printf ("SndSys_Init: using %u fragments of %u bytes\n", + ioctl_param >> 16, 1 << (ioctl_param & 0xFFFF)); // Set the sound width if (requested->width == 1) @@ -115,7 +116,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) { if (ioctl_param != prev_value && suggested != NULL) { - memcpy(suggested, requested, sizeof(suggested)); + memcpy(suggested, requested, sizeof(*suggested)); if (ioctl_param == AFMT_S16_NE) suggested->width = 2; @@ -136,7 +137,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) { if (ioctl_param != requested->channels && suggested != NULL) { - memcpy(suggested, requested, sizeof(suggested)); + memcpy(suggested, requested, sizeof(*suggested)); suggested->channels = ioctl_param; } @@ -153,7 +154,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) { if ((unsigned int)ioctl_param != requested->speed && suggested != NULL) { - memcpy(suggested, requested, sizeof(suggested)); + memcpy(suggested, requested, sizeof(*suggested)); suggested->speed = ioctl_param; } @@ -162,12 +163,10 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) SndSys_Shutdown(); return false; } - -#ifdef __linux__ - alsaspeakerlayout = true; -#else - alsaspeakerlayout = false; -#endif + + // TOCHECK: I'm not sure which channel layout OSS uses for 5.1 and 7.1 + if (snd_channellayout.integer == SND_CHANNELLAYOUT_AUTO) + Cvar_SetValueQuick (&snd_channellayout, SND_CHANNELLAYOUT_ALSA); old_osstime = 0; osssoundtime = 0; @@ -202,6 +201,42 @@ void SndSys_Shutdown (void) } +/* +==================== +SndSys_Write +==================== +*/ +static int SndSys_Write (const unsigned char* buffer, unsigned int nb_bytes) +{ + int written; + unsigned int factor; + + written = write (audio_fd, buffer, nb_bytes); + if (written < 0) + { + if (errno != EAGAIN) + Con_Printf ("SndSys_Write: audio write returned %d! (errno= %d)\n", + written, errno); + return written; + } + + factor = snd_renderbuffer->format.width * snd_renderbuffer->format.channels; + if (written % factor != 0) + Sys_Error ("SndSys_Write: nb of bytes written (%d) isn't aligned to a frame sample!\n", + written); + + snd_renderbuffer->startframe += written / factor; + + if ((unsigned int)written < nb_bytes) + { + Con_DPrintf("SndSys_Submit: audio can't keep up! (%u < %u)\n", + written, nb_bytes); + } + + return written; +} + + /* ==================== SndSys_Submit @@ -224,42 +259,15 @@ void SndSys_Submit (void) nbframes = snd_renderbuffer->endframe - snd_renderbuffer->startframe; if (nbframes > limit) { - written = write (audio_fd, &snd_renderbuffer->ring[startoffset * factor], limit * factor); - if (written < 0) - { - Con_Printf("SndSys_Submit: audio write returned %d!\n", written); + written = SndSys_Write (&snd_renderbuffer->ring[startoffset * factor], limit * factor); + if (written < 0 || (unsigned int)written < limit * factor) return; - } - - if (written % factor != 0) - Sys_Error("SndSys_Submit: nb of bytes written (%d) isn't aligned to a frame sample!\n", written); - - snd_renderbuffer->startframe += written / factor; - - if ((unsigned int)written < limit * factor) - { - Con_Printf("SndSys_Submit: audio can't keep up! (%u < %u)\n", written, limit * factor); - return; - } nbframes -= limit; startoffset = 0; } - written = write (audio_fd, &snd_renderbuffer->ring[startoffset * factor], nbframes * factor); - if (written < 0) - { - Con_Printf("SndSys_Submit: audio write returned %d!\n", written); - return; - } - - if (written % factor != 0) - Sys_Error("SndSys_Submit: nb of bytes written (%d) isn't aligned to a frame sample!\n", written); - - snd_renderbuffer->startframe += written / factor; - - if ((unsigned int)written < nbframes * factor) - Con_Printf("SndSys_Submit: audio can't keep up! (%u < %u)\n", written, nbframes * factor); + SndSys_Write (&snd_renderbuffer->ring[startoffset * factor], nbframes * factor); } @@ -276,7 +284,6 @@ unsigned int SndSys_GetSoundTime (void) int new_osstime; unsigned int timediff; - // TODO: use SNDCTL_DSP_GETODELAY instead if (ioctl (audio_fd, SNDCTL_DSP_GETOPTR, &count) == -1) { Con_Print ("SndSys_GetSoundTimeDiff: can't ioctl (SNDCTL_DSP_GETOPTR)\n"); @@ -305,7 +312,7 @@ SndSys_LockRenderBuffer Get the exclusive lock on "snd_renderbuffer" ==================== */ -qboolean SndSys_LockRenderBuffer (void) +qbool SndSys_LockRenderBuffer (void) { // Nothing to do return true; @@ -323,3 +330,15 @@ void SndSys_UnlockRenderBuffer (void) { // Nothing to do } + +/* +==================== +SndSys_SendKeyEvents + +Send keyboard events originating from the sound system (e.g. MIDI) +==================== +*/ +void SndSys_SendKeyEvents(void) +{ + // not supported +}