src/audio/dma/SDL_dmaaudio.c
changeset 2060 866052b01ee5
parent 2049 5f6550e5184f
child 2669 e27bdcc80744
equal deleted inserted replaced
2059:4685ccd33d0e 2060:866052b01ee5
    72 {
    72 {
    73     int caps = 0;
    73     int caps = 0;
    74     struct audio_buf_info info;
    74     struct audio_buf_info info;
    75     if ((ioctl(fd, SNDCTL_DSP_GETCAPS, &caps) == 0) &&
    75     if ((ioctl(fd, SNDCTL_DSP_GETCAPS, &caps) == 0) &&
    76         (caps & DSP_CAP_TRIGGER) && (caps & DSP_CAP_MMAP) &&
    76         (caps & DSP_CAP_TRIGGER) && (caps & DSP_CAP_MMAP) &&
    77         (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info) == 0))
    77         (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info) == 0)) {
    78     {
       
    79         size_t len = info.fragstotal * info.fragsize;
    78         size_t len = info.fragstotal * info.fragsize;
    80         Uint8 *buf = (Uint8 *) mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
    79         Uint8 *buf = (Uint8 *) mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
    81         if (buf != MAP_FAILED) {
    80         if (buf != MAP_FAILED) {
    82             munmap(buf, len);
    81             munmap(buf, len);
    83             return 1;
    82             return 1;
   115     free_device_list(&outputDevices, &outputDeviceCount);
   114     free_device_list(&outputDevices, &outputDeviceCount);
   116     free_device_list(&inputDevices, &inputDeviceCount);
   115     free_device_list(&inputDevices, &inputDeviceCount);
   117 }
   116 }
   118 
   117 
   119 
   118 
   120 static void DMA_Deinitialize(void)
   119 static void
       
   120 DMA_Deinitialize(void)
   121 {
   121 {
   122     free_device_lists();
   122     free_device_lists();
   123 }
   123 }
   124 
   124 
   125 static int
   125 static int
   131     } else {
   131     } else {
   132         build_device_list(0, &outputDevices, &outputDeviceCount);
   132         build_device_list(0, &outputDevices, &outputDeviceCount);
   133         return outputDeviceCount;
   133         return outputDeviceCount;
   134     }
   134     }
   135 
   135 
   136     return 0;  /* shouldn't ever hit this. */
   136     return 0;                   /* shouldn't ever hit this. */
   137 }
   137 }
   138 
   138 
   139 
   139 
   140 static const char *
   140 static const char *
   141 DMA_GetDeviceName(int index, int iscapture)
   141 DMA_GetDeviceName(int index, int iscapture)
   238     struct audio_buf_info info;
   238     struct audio_buf_info info;
   239 
   239 
   240     /* We don't care what the devname is...we'll try to open anything. */
   240     /* We don't care what the devname is...we'll try to open anything. */
   241     /*  ...but default to first name in the list... */
   241     /*  ...but default to first name in the list... */
   242     if (devname == NULL) {
   242     if (devname == NULL) {
   243         if ( ((iscapture) && (inputDeviceCount == 0)) ||
   243         if (((iscapture) && (inputDeviceCount == 0)) ||
   244              ((!iscapture) && (outputDeviceCount == 0)) ) {
   244             ((!iscapture) && (outputDeviceCount == 0))) {
   245             SDL_SetError("No such audio device");
   245             SDL_SetError("No such audio device");
   246             return 0;
   246             return 0;
   247         }
   247         }
   248         devname = ((iscapture) ? inputDevices[0] : outputDevices[0]);
   248         devname = ((iscapture) ? inputDevices[0] : outputDevices[0]);
   249     }
   249     }
   250 
   250 
   251     /* Initialize all variables that we clean on shutdown */
   251     /* Initialize all variables that we clean on shutdown */
   252     this->hidden = (struct SDL_PrivateAudioData *)
   252     this->hidden = (struct SDL_PrivateAudioData *)
   253                         SDL_malloc((sizeof *this->hidden));
   253         SDL_malloc((sizeof *this->hidden));
   254     if (this->hidden == NULL) {
   254     if (this->hidden == NULL) {
   255         SDL_OutOfMemory();
   255         SDL_OutOfMemory();
   256         return 0;
   256         return 0;
   257     }
   257     }
   258     SDL_memset(this->hidden, 0, (sizeof *this->hidden));
   258     SDL_memset(this->hidden, 0, (sizeof *this->hidden));
   378     /* Check to see if we need to use select() workaround */
   378     /* Check to see if we need to use select() workaround */
   379     {
   379     {
   380         char *workaround;
   380         char *workaround;
   381         workaround = SDL_getenv("SDL_DSP_NOSELECT");
   381         workaround = SDL_getenv("SDL_DSP_NOSELECT");
   382         if (workaround) {
   382         if (workaround) {
   383             frame_ticks = (float) (this->spec.samples*1000) / this->spec.freq;
   383             frame_ticks =
       
   384                 (float) (this->spec.samples * 1000) / this->spec.freq;
   384             next_frame = SDL_GetTicks() + frame_ticks;
   385             next_frame = SDL_GetTicks() + frame_ticks;
   385         }
   386         }
   386     }
   387     }
   387 
   388 
   388     /* Trigger audio playback */
   389     /* Trigger audio playback */
   509     return (dma_buf + (filling * this->spec.size));
   510     return (dma_buf + (filling * this->spec.size));
   510 }
   511 }
   511 
   512 
   512 
   513 
   513 static int
   514 static int
   514 DMA_Init(SDL_AudioDriverImpl *impl)
   515 DMA_Init(SDL_AudioDriverImpl * impl)
   515 {
   516 {
   516     /* Set the function pointers */
   517     /* Set the function pointers */
   517     impl->DetectDevices = DMA_DetectDevices;
   518     impl->DetectDevices = DMA_DetectDevices;
   518     impl->GetDeviceName = DMA_GetDeviceName;
   519     impl->GetDeviceName = DMA_GetDeviceName;
   519     impl->OpenDevice = DMA_OpenDevice;
   520     impl->OpenDevice = DMA_OpenDevice;