/* CaptureThreadProc Used by "MMSYSTEM" Device. Called when a WaveIn buffer had been filled with new audio data. */ static DWORD WINAPI CaptureThreadProc(LPVOID lpParameter) { ALCdevice *pDevice = (ALCdevice*)lpParameter; WinMMData *pData = pDevice->ExtraData; LPWAVEHDR pWaveHdr; ALuint FrameSize; MSG msg; FrameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType); while(GetMessage(&msg, NULL, 0, 0)) { if(msg.message != WIM_DATA) continue; /* Don't wait for other buffers to finish before quitting. We're * closing so we don't need them. */ if(pData->bWaveShutdown) break; pWaveHdr = ((LPWAVEHDR)msg.lParam); WriteRingBuffer(pData->pRing, (ALubyte*)pWaveHdr->lpData, pWaveHdr->dwBytesRecorded/FrameSize); // Send buffer back to capture more data waveInAddBuffer(pData->hWaveHandle.In,pWaveHdr,sizeof(WAVEHDR)); InterlockedIncrement(&pData->lWaveBuffersCommitted); } // Signal Wave Thread completed event if(pData->hWaveThreadEvent) SetEvent(pData->hWaveThreadEvent); ExitThread(0); return 0; }
static ALuint OSSCaptureProc( ALvoid* ptr ) { ALCdevice* pDevice = ( ALCdevice* )ptr; oss_data* data = ( oss_data* )pDevice->ExtraData; int frameSize; int amt; SetRTPriority(); frameSize = aluFrameSizeFromFormat( pDevice->Format ); while ( !data->killNow ) { amt = read( data->fd, data->mix_data, data->data_size ); if ( amt < 0 ) { AL_PRINT( "read failed: %s\n", strerror( errno ) ); aluHandleDisconnect( pDevice ); break; } if ( amt == 0 ) { Sleep( 1 ); continue; } if ( data->doCapture ) { WriteRingBuffer( data->ring, data->mix_data, amt / frameSize ); } } return 0; }
static ALCuint alsa_available_samples(ALCdevice *Device) { alsa_data *data = (alsa_data*)Device->ExtraData; snd_pcm_sframes_t avail = 0; if(Device->Connected && data->doCapture) avail = snd_pcm_avail_update(data->pcmHandle); if(avail < 0) { ERR("avail update failed: %s\n", snd_strerror(avail)); if((avail=snd_pcm_recover(data->pcmHandle, avail, 1)) >= 0) { if(data->doCapture) avail = snd_pcm_start(data->pcmHandle); if(avail >= 0) avail = snd_pcm_avail_update(data->pcmHandle); } if(avail < 0) { ERR("restore error: %s\n", snd_strerror(avail)); aluHandleDisconnect(Device); } } if(!data->ring) { if(avail < 0) avail = 0; avail += snd_pcm_bytes_to_frames(data->pcmHandle, data->size); if(avail > data->last_avail) data->last_avail = avail; return data->last_avail; } while(avail > 0) { snd_pcm_sframes_t amt; amt = snd_pcm_bytes_to_frames(data->pcmHandle, data->size); if(avail < amt) amt = avail; amt = snd_pcm_readi(data->pcmHandle, data->buffer, amt); if(amt < 0) { ERR("read error: %s\n", snd_strerror(amt)); if(amt == -EAGAIN) continue; if((amt=snd_pcm_recover(data->pcmHandle, amt, 1)) >= 0) { if(data->doCapture) amt = snd_pcm_start(data->pcmHandle); if(amt >= 0) amt = snd_pcm_avail_update(data->pcmHandle); } if(amt < 0) { ERR("restore error: %s\n", snd_strerror(amt)); aluHandleDisconnect(Device); break; } avail = amt; continue; } WriteRingBuffer(data->ring, data->buffer, amt); avail -= amt; } return RingBufferSize(data->ring); }
static ALCuint alsa_available_samples( ALCdevice* Device ) { alsa_data* data = ( alsa_data* )Device->ExtraData; snd_pcm_sframes_t avail; avail = ( Device->Connected ? psnd_pcm_avail_update( data->pcmHandle ) : 0 ); if ( avail < 0 ) { AL_PRINT( "avail update failed: %s\n", psnd_strerror( avail ) ); if ( ( avail = psnd_pcm_recover( data->pcmHandle, avail, 1 ) ) >= 0 && ( avail = psnd_pcm_prepare( data->pcmHandle ) ) >= 0 ) { if ( data->doCapture ) { avail = psnd_pcm_start( data->pcmHandle ); } if ( avail >= 0 ) { avail = psnd_pcm_avail_update( data->pcmHandle ); } } if ( avail < 0 ) { AL_PRINT( "restore error: %s\n", psnd_strerror( avail ) ); aluHandleDisconnect( Device ); } } while ( avail > 0 ) { snd_pcm_sframes_t amt; amt = psnd_pcm_bytes_to_frames( data->pcmHandle, data->size ); if ( avail < amt ) { amt = avail; } amt = psnd_pcm_readi( data->pcmHandle, data->buffer, amt ); if ( amt < 0 ) { AL_PRINT( "read error: %s\n", psnd_strerror( amt ) ); if ( amt == -EAGAIN ) { continue; } if ( ( amt = psnd_pcm_recover( data->pcmHandle, amt, 1 ) ) >= 0 && ( amt = psnd_pcm_prepare( data->pcmHandle ) ) >= 0 ) { if ( data->doCapture ) { amt = psnd_pcm_start( data->pcmHandle ); } if ( amt >= 0 ) { amt = psnd_pcm_avail_update( data->pcmHandle ); } } if ( amt < 0 ) { AL_PRINT( "restore error: %s\n", psnd_strerror( amt ) ); aluHandleDisconnect( Device ); break; } avail = amt; continue; } WriteRingBuffer( data->ring, data->buffer, amt ); avail -= amt; } return RingBufferSize( data->ring ); }