diff src/audio/nto/SDL_nto_audio.c @ 1895:c121d94672cb

SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 10 Jul 2006 21:04:37 +0000
parents d910939febfa
children 3b4ce57c6215
line wrap: on
line diff
--- a/src/audio/nto/SDL_nto_audio.c	Thu Jul 06 18:01:37 2006 +0000
+++ b/src/audio/nto/SDL_nto_audio.c	Mon Jul 10 21:04:37 2006 +0000
@@ -57,72 +57,70 @@
 
 struct BuggyCards
 {
-   char* cardname;
-   unsigned long bugtype;
+    char *cardname;
+    unsigned long bugtype;
 };
 
 #define QSA_WA_CARDS 3
 
-struct BuggyCards buggycards[QSA_WA_CARDS]=
-{
-   {"Sound Blaster Live!", QSA_MMAP_WORKAROUND},
-   {"Vortex 8820",         QSA_MMAP_WORKAROUND},
-   {"Vortex 8830",         QSA_MMAP_WORKAROUND},
+struct BuggyCards buggycards[QSA_WA_CARDS] = {
+    {"Sound Blaster Live!", QSA_MMAP_WORKAROUND},
+    {"Vortex 8820", QSA_MMAP_WORKAROUND},
+    {"Vortex 8830", QSA_MMAP_WORKAROUND},
 };
 
 /* Audio driver functions */
 static void NTO_ThreadInit(_THIS);
-static int NTO_OpenAudio(_THIS, SDL_AudioSpec* spec);
+static int NTO_OpenAudio(_THIS, SDL_AudioSpec * spec);
 static void NTO_WaitAudio(_THIS);
 static void NTO_PlayAudio(_THIS);
-static Uint8* NTO_GetAudioBuf(_THIS);
+static Uint8 *NTO_GetAudioBuf(_THIS);
 static void NTO_CloseAudio(_THIS);
 
 /* card names check to apply the workarounds */
-static int NTO_CheckBuggyCards(_THIS, unsigned long checkfor)
+static int
+NTO_CheckBuggyCards(_THIS, unsigned long checkfor)
 {
     char scardname[33];
     int it;
-    
-    if (snd_card_get_name(cardno, scardname, 32)<0)
-    {
+
+    if (snd_card_get_name(cardno, scardname, 32) < 0) {
         return 0;
     }
 
-    for (it=0; it<QSA_WA_CARDS; it++)
-    {
-       if (SDL_strcmp(buggycards[it].cardname, scardname)==0)
-       {
-          if (buggycards[it].bugtype==checkfor)
-          {
-              return 1;
-          }
-       }
+    for (it = 0; it < QSA_WA_CARDS; it++) {
+        if (SDL_strcmp(buggycards[it].cardname, scardname) == 0) {
+            if (buggycards[it].bugtype == checkfor) {
+                return 1;
+            }
+        }
     }
 
     return 0;
 }
 
-static void NTO_ThreadInit(_THIS)
+static void
+NTO_ThreadInit(_THIS)
 {
-   int status;
-   struct sched_param param;
+    int status;
+    struct sched_param param;
 
-   /* increasing default 10 priority to 25 to avoid jerky sound */
-   status=SchedGet(0, 0, &param);
-   param.sched_priority=param.sched_curpriority+15;
-   status=SchedSet(0, 0, SCHED_NOCHANGE, &param);
+    /* increasing default 10 priority to 25 to avoid jerky sound */
+    status = SchedGet(0, 0, &param);
+    param.sched_priority = param.sched_curpriority + 15;
+    status = SchedSet(0, 0, SCHED_NOCHANGE, &param);
 }
 
 /* PCM transfer channel parameters initialize function */
-static void NTO_InitAudioParams(snd_pcm_channel_params_t* cpars)
+static void
+NTO_InitAudioParams(snd_pcm_channel_params_t * cpars)
 {
     SDL_memset(cpars, 0, sizeof(snd_pcm_channel_params_t));
 
     cpars->channel = SND_PCM_CHANNEL_PLAYBACK;
     cpars->mode = SND_PCM_MODE_BLOCK;
     cpars->start_mode = SND_PCM_START_DATA;
-    cpars->stop_mode  = SND_PCM_STOP_STOP;
+    cpars->stop_mode = SND_PCM_STOP_STOP;
     cpars->format.format = SND_PCM_SFMT_S16_LE;
     cpars->format.interleave = 1;
     cpars->format.rate = DEFAULT_CPARAMS_RATE;
@@ -132,69 +130,67 @@
     cpars->buf.block.frags_max = DEFAULT_CPARAMS_FRAGS_MAX;
 }
 
-static int NTO_AudioAvailable(void)
+static int
+NTO_AudioAvailable(void)
 {
     /*  See if we can open a nonblocking channel.
-        Return value '1' means we can.
-        Return value '0' means we cannot. */
+       Return value '1' means we can.
+       Return value '0' means we cannot. */
 
     int available;
     int rval;
-    snd_pcm_t* handle;
+    snd_pcm_t *handle;
 
     available = 0;
     handle = NULL;
 
     rval = snd_pcm_open_preferred(&handle, NULL, NULL, OPEN_FLAGS);
 
-    if (rval >= 0)
-    {
+    if (rval >= 0) {
         available = 1;
 
-        if ((rval = snd_pcm_close(handle)) < 0)
-        {
-            SDL_SetError("NTO_AudioAvailable(): snd_pcm_close failed: %s\n", snd_strerror(rval));
+        if ((rval = snd_pcm_close(handle)) < 0) {
+            SDL_SetError
+                ("NTO_AudioAvailable(): snd_pcm_close failed: %s\n",
+                 snd_strerror(rval));
             available = 0;
         }
-    }
-    else
-    {
-        SDL_SetError("NTO_AudioAvailable(): there are no available audio devices.\n");
+    } else {
+        SDL_SetError
+            ("NTO_AudioAvailable(): there are no available audio devices.\n");
     }
 
     return (available);
 }
 
-static void NTO_DeleteAudioDevice(SDL_AudioDevice *device)
+static void
+NTO_DeleteAudioDevice(SDL_AudioDevice * device)
 {
-    if ((device)&&(device->hidden))
-    {
+    if ((device) && (device->hidden)) {
         SDL_free(device->hidden);
     }
-    if (device)
-    {
+    if (device) {
         SDL_free(device);
     }
 }
 
-static SDL_AudioDevice* NTO_CreateAudioDevice(int devindex)
+static SDL_AudioDevice *
+NTO_CreateAudioDevice(int devindex)
 {
     SDL_AudioDevice *this;
 
     /* Initialize all variables that we clean on shutdown */
-    this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice));
-    if (this)
-    {
+    this = (SDL_AudioDevice *) SDL_malloc(sizeof(SDL_AudioDevice));
+    if (this) {
         SDL_memset(this, 0, sizeof(SDL_AudioDevice));
-        this->hidden = (struct SDL_PrivateAudioData *)SDL_malloc(sizeof(struct SDL_PrivateAudioData));
+        this->hidden = (struct SDL_PrivateAudioData *)
+            SDL_malloc(sizeof(struct SDL_PrivateAudioData));
     }
-    if ((this == NULL) || (this->hidden == NULL))
-    {
+    if ((this == NULL) || (this->hidden == NULL)) {
         SDL_OutOfMemory();
-        if (this)
-        {
+        if (this) {
             SDL_free(this);
-	}
+        }
         return (0);
     }
     SDL_memset(this->hidden, 0, sizeof(struct SDL_PrivateAudioData));
@@ -213,15 +209,15 @@
     return this;
 }
 
-AudioBootStrap QNXNTOAUDIO_bootstrap =
-{
+AudioBootStrap QNXNTOAUDIO_bootstrap = {
     DRIVER_NAME, "QNX6 QSA-NTO Audio",
     NTO_AudioAvailable,
     NTO_CreateAudioDevice
 };
 
 /* This function waits until it is possible to write a full sound buffer */
-static void NTO_WaitAudio(_THIS)
+static void
+NTO_WaitAudio(_THIS)
 {
     fd_set wfds;
     int selectret;
@@ -230,121 +226,125 @@
     FD_SET(audio_fd, &wfds);
 
     do {
-        selectret=select(audio_fd + 1, NULL, &wfds, NULL, NULL);
-        switch (selectret)
-        {
-            case -1:
-            case  0: SDL_SetError("NTO_WaitAudio(): select() failed: %s\n", strerror(errno));
-                     return;
-            default: if (FD_ISSET(audio_fd, &wfds))
-                     {
-                         return;
-                     }
-                     break;
+        selectret = select(audio_fd + 1, NULL, &wfds, NULL, NULL);
+        switch (selectret) {
+        case -1:
+        case 0:
+            SDL_SetError("NTO_WaitAudio(): select() failed: %s\n",
+                         strerror(errno));
+            return;
+        default:
+            if (FD_ISSET(audio_fd, &wfds)) {
+                return;
+            }
+            break;
         }
-    } while(1);
+    }
+    while (1);
 }
 
-static void NTO_PlayAudio(_THIS)
+static void
+NTO_PlayAudio(_THIS)
 {
     int written, rval;
     int towrite;
-    void* pcmbuffer;
+    void *pcmbuffer;
 
-    if (!this->enabled)
-    {
+    if (!this->enabled) {
         return;
     }
-    
+
     towrite = this->spec.size;
     pcmbuffer = pcm_buf;
 
     /* Write the audio data, checking for EAGAIN (buffer full) and underrun */
     do {
         written = snd_pcm_plugin_write(audio_handle, pcm_buf, towrite);
-        if (written != towrite)
-        {
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
-            {
+        if (written != towrite) {
+            if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
                 /* Let a little CPU time go by and try to write again */
                 SDL_Delay(1);
                 /* if we wrote some data */
                 towrite -= written;
                 pcmbuffer += written * this->spec.channels;
                 continue;
-            }		
-            else
-            {
-                if ((errno == EINVAL) || (errno == EIO))
-                {
+            } else {
+                if ((errno == EINVAL) || (errno == EIO)) {
                     SDL_memset(&cstatus, 0, sizeof(cstatus));
                     cstatus.channel = SND_PCM_CHANNEL_PLAYBACK;
-                    if ((rval = snd_pcm_plugin_status(audio_handle, &cstatus)) < 0)
-                    {
-                        SDL_SetError("NTO_PlayAudio(): snd_pcm_plugin_status failed: %s\n", snd_strerror(rval));
+                    if ((rval =
+                         snd_pcm_plugin_status(audio_handle, &cstatus)) < 0) {
+                        SDL_SetError
+                            ("NTO_PlayAudio(): snd_pcm_plugin_status failed: %s\n",
+                             snd_strerror(rval));
                         return;
-                    }	
-                    if ((cstatus.status == SND_PCM_STATUS_UNDERRUN) || (cstatus.status == SND_PCM_STATUS_READY))
-                    {
-                        if ((rval = snd_pcm_plugin_prepare(audio_handle, SND_PCM_CHANNEL_PLAYBACK)) < 0)
-                        {
-                            SDL_SetError("NTO_PlayAudio(): snd_pcm_plugin_prepare failed: %s\n", snd_strerror(rval));
+                    }
+                    if ((cstatus.status == SND_PCM_STATUS_UNDERRUN)
+                        || (cstatus.status == SND_PCM_STATUS_READY)) {
+                        if ((rval =
+                             snd_pcm_plugin_prepare(audio_handle,
+                                                    SND_PCM_CHANNEL_PLAYBACK))
+                            < 0) {
+                            SDL_SetError
+                                ("NTO_PlayAudio(): snd_pcm_plugin_prepare failed: %s\n",
+                                 snd_strerror(rval));
                             return;
                         }
-                    }		        		
+                    }
                     continue;
-                }
-                else
-                {
+                } else {
                     return;
                 }
             }
-        }
-        else
-        {
+        } else {
             /* we wrote all remaining data */
             towrite -= written;
             pcmbuffer += written * this->spec.channels;
         }
-    } while ((towrite > 0)  && (this->enabled));
+    }
+    while ((towrite > 0) && (this->enabled));
 
     /* If we couldn't write, assume fatal error for now */
-    if (towrite != 0)
-    {
+    if (towrite != 0) {
         this->enabled = 0;
     }
 
     return;
 }
 
-static Uint8* NTO_GetAudioBuf(_THIS)
+static Uint8 *
+NTO_GetAudioBuf(_THIS)
 {
     return pcm_buf;
 }
 
-static void NTO_CloseAudio(_THIS)
+static void
+NTO_CloseAudio(_THIS)
 {
     int rval;
 
     this->enabled = 0;
 
-    if (audio_handle != NULL)
-    {
-        if ((rval = snd_pcm_plugin_flush(audio_handle, SND_PCM_CHANNEL_PLAYBACK)) < 0)
-        {
-            SDL_SetError("NTO_CloseAudio(): snd_pcm_plugin_flush failed: %s\n", snd_strerror(rval));
+    if (audio_handle != NULL) {
+        if ((rval =
+             snd_pcm_plugin_flush(audio_handle,
+                                  SND_PCM_CHANNEL_PLAYBACK)) < 0) {
+            SDL_SetError
+                ("NTO_CloseAudio(): snd_pcm_plugin_flush failed: %s\n",
+                 snd_strerror(rval));
             return;
         }
-        if ((rval = snd_pcm_close(audio_handle)) < 0)
-        {
-            SDL_SetError("NTO_CloseAudio(): snd_pcm_close failed: %s\n",snd_strerror(rval));
+        if ((rval = snd_pcm_close(audio_handle)) < 0) {
+            SDL_SetError("NTO_CloseAudio(): snd_pcm_close failed: %s\n",
+                         snd_strerror(rval));
             return;
         }
         audio_handle = NULL;
     }
 }
 
-static int NTO_OpenAudio(_THIS, SDL_AudioSpec* spec)
+static int
+NTO_OpenAudio(_THIS, SDL_AudioSpec * spec)
 {
     int rval;
     int format;
@@ -354,9 +354,8 @@
     audio_handle = NULL;
     this->enabled = 0;
 
-    if (pcm_buf != NULL)
-    {
-        SDL_FreeAudioMem(pcm_buf); 
+    if (pcm_buf != NULL) {
+        SDL_FreeAudioMem(pcm_buf);
         pcm_buf = NULL;
     }
 
@@ -364,19 +363,21 @@
     NTO_InitAudioParams(&cparams);
 
     /* Open the audio device */
-    rval = snd_pcm_open_preferred(&audio_handle, &cardno, &deviceno, OPEN_FLAGS);
-    if (rval < 0)
-    {
-        SDL_SetError("NTO_OpenAudio(): snd_pcm_open failed: %s\n", snd_strerror(rval));
+    rval =
+        snd_pcm_open_preferred(&audio_handle, &cardno, &deviceno, OPEN_FLAGS);
+    if (rval < 0) {
+        SDL_SetError("NTO_OpenAudio(): snd_pcm_open failed: %s\n",
+                     snd_strerror(rval));
         return (-1);
     }
 
-    if (!NTO_CheckBuggyCards(this, QSA_MMAP_WORKAROUND))
-    {
+    if (!NTO_CheckBuggyCards(this, QSA_MMAP_WORKAROUND)) {
         /* enable count status parameter */
-        if ((rval = snd_pcm_plugin_set_disable(audio_handle, PLUGIN_DISABLE_MMAP)) < 0)
-        {
-            SDL_SetError("snd_pcm_plugin_set_disable failed: %s\n", snd_strerror(rval));
+        if ((rval =
+             snd_pcm_plugin_set_disable(audio_handle,
+                                        PLUGIN_DISABLE_MMAP)) < 0) {
+            SDL_SetError("snd_pcm_plugin_set_disable failed: %s\n",
+                         snd_strerror(rval));
             return (-1);
         }
     }
@@ -386,49 +387,46 @@
     /* can't use format as SND_PCM_SFMT_U8 = 0 in nto */
     found = 0;
 
-    for (test_format=SDL_FirstAudioFormat(spec->format); !found ;)
-    {
+    for (test_format = SDL_FirstAudioFormat(spec->format); !found;) {
         /* if match found set format to equivalent ALSA format */
-        switch (test_format)
-        {
-            case AUDIO_U8:
-                           format = SND_PCM_SFMT_U8;
-                           found = 1;
-                           break;
-            case AUDIO_S8:
-                           format = SND_PCM_SFMT_S8;
-                           found = 1;
-                           break;
-            case AUDIO_S16LSB:
-                           format = SND_PCM_SFMT_S16_LE;
-                           found = 1;
-                           break;
-            case AUDIO_S16MSB:
-                           format = SND_PCM_SFMT_S16_BE;
-                           found = 1;
-                           break;
-            case AUDIO_U16LSB:
-                           format = SND_PCM_SFMT_U16_LE;
-                           found = 1;
-                           break;
-            case AUDIO_U16MSB:
-                           format = SND_PCM_SFMT_U16_BE;
-                           found = 1;
-                           break;
-            default:
-                           break;
+        switch (test_format) {
+        case AUDIO_U8:
+            format = SND_PCM_SFMT_U8;
+            found = 1;
+            break;
+        case AUDIO_S8:
+            format = SND_PCM_SFMT_S8;
+            found = 1;
+            break;
+        case AUDIO_S16LSB:
+            format = SND_PCM_SFMT_S16_LE;
+            found = 1;
+            break;
+        case AUDIO_S16MSB:
+            format = SND_PCM_SFMT_S16_BE;
+            found = 1;
+            break;
+        case AUDIO_U16LSB:
+            format = SND_PCM_SFMT_U16_LE;
+            found = 1;
+            break;
+        case AUDIO_U16MSB:
+            format = SND_PCM_SFMT_U16_BE;
+            found = 1;
+            break;
+        default:
+            break;
         }
 
-        if (!found)
-        {
+        if (!found) {
             test_format = SDL_NextAudioFormat();
         }
     }
 
     /* assumes test_format not 0 on success */
-    if (test_format == 0)
-    {
-        SDL_SetError("NTO_OpenAudio(): Couldn't find any hardware audio formats");
+    if (test_format == 0) {
+        SDL_SetError
+            ("NTO_OpenAudio(): Couldn't find any hardware audio formats");
         return (-1);
     }
 
@@ -439,23 +437,23 @@
 
     /* Set mono or stereo audio (currently only two channels supported) */
     cparams.format.voices = spec->channels;
-	
+
     /* Set rate */
     cparams.format.rate = spec->freq;
 
     /* Setup the transfer parameters according to cparams */
     rval = snd_pcm_plugin_params(audio_handle, &cparams);
-    if (rval < 0)
-    {
-        SDL_SetError("NTO_OpenAudio(): snd_pcm_channel_params failed: %s\n", snd_strerror(rval));
+    if (rval < 0) {
+        SDL_SetError
+            ("NTO_OpenAudio(): snd_pcm_channel_params failed: %s\n",
+             snd_strerror(rval));
         return (-1);
     }
 
     /* Make sure channel is setup right one last time */
     SDL_memset(&csetup, 0x00, sizeof(csetup));
     csetup.channel = SND_PCM_CHANNEL_PLAYBACK;
-    if (snd_pcm_plugin_setup(audio_handle, &csetup) < 0)
-    {
+    if (snd_pcm_plugin_setup(audio_handle, &csetup) < 0) {
         SDL_SetError("NTO_OpenAudio(): Unable to setup playback channel\n");
         return -1;
     }
@@ -466,34 +464,37 @@
 
     pcm_len = spec->size;
 
-    if (pcm_len==0)
-    {
-        pcm_len = csetup.buf.block.frag_size * spec->channels * (snd_pcm_format_width(format)/8);
+    if (pcm_len == 0) {
+        pcm_len =
+            csetup.buf.block.frag_size * spec->channels *
+            (snd_pcm_format_width(format) / 8);
     }
 
     /* Allocate memory to the audio buffer and initialize with silence (Note that
        buffer size must be a multiple of fragment size, so find closest multiple)
-    */
-    pcm_buf = (Uint8*)SDL_AllocAudioMem(pcm_len);
-    if (pcm_buf == NULL)
-    {
+     */
+    pcm_buf = (Uint8 *) SDL_AllocAudioMem(pcm_len);
+    if (pcm_buf == NULL) {
         SDL_SetError("NTO_OpenAudio(): pcm buffer allocation failed\n");
         return (-1);
     }
     SDL_memset(pcm_buf, spec->silence, pcm_len);
 
     /* get the file descriptor */
-    if ((audio_fd = snd_pcm_file_descriptor(audio_handle, SND_PCM_CHANNEL_PLAYBACK)) < 0)
-    {
-        SDL_SetError("NTO_OpenAudio(): snd_pcm_file_descriptor failed with error code: %s\n", snd_strerror(rval));
+    if ((audio_fd =
+         snd_pcm_file_descriptor(audio_handle,
+                                 SND_PCM_CHANNEL_PLAYBACK)) < 0) {
+        SDL_SetError
+            ("NTO_OpenAudio(): snd_pcm_file_descriptor failed with error code: %s\n",
+             snd_strerror(rval));
         return (-1);
     }
 
     /* Trigger audio playback */
     rval = snd_pcm_plugin_prepare(audio_handle, SND_PCM_CHANNEL_PLAYBACK);
-    if (rval < 0)
-    {
-        SDL_SetError("snd_pcm_plugin_prepare failed: %s\n", snd_strerror(rval));
+    if (rval < 0) {
+        SDL_SetError("snd_pcm_plugin_prepare failed: %s\n",
+                     snd_strerror(rval));
         return (-1);
     }
 
@@ -505,3 +506,5 @@
     /* We're really ready to rock and roll. :-) */
     return (0);
 }
+
+/* vi: set ts=4 sw=4 expandtab: */