static void oss_capture_samples(ALCdevice *pDevice, ALCvoid *pBuffer, ALCuint lSamples) { oss_data *data = (oss_data*)pDevice->ExtraData; if(lSamples <= (ALCuint)RingBufferSize(data->ring)) ReadRingBuffer(data->ring, pBuffer, lSamples); else SetALCError(ALC_INVALID_VALUE); }
static void pa_capture_samples(ALCdevice *device, ALCvoid *buffer, ALCuint samples) { pa_data *data = device->ExtraData; if(samples <= (ALCuint)RingBufferSize(data->ring)) ReadRingBuffer(data->ring, buffer, samples); else alcSetError(device, ALC_INVALID_VALUE); }
static void WinMMCaptureSamples(ALCdevice *pDevice, ALCvoid *pBuffer, ALCuint lSamples) { WinMMData *pData = (WinMMData*)pDevice->ExtraData; if(WinMMAvailableSamples(pDevice) >= lSamples) ReadRingBuffer(pData->pRing, pBuffer, lSamples); else alcSetError(pDevice, ALC_INVALID_VALUE); }
static void alsa_capture_samples(ALCdevice *Device, ALCvoid *Buffer, ALCuint Samples) { alsa_data *data = (alsa_data*)Device->ExtraData; if(Samples <= alsa_available_samples(Device)) ReadRingBuffer(data->ring, Buffer, Samples); else alcSetError(Device, ALC_INVALID_VALUE); }
static void pulse_capture_samples(ALCdevice *device, ALCvoid *buffer, ALCuint samples) //{{{ { pulse_data *data = device->ExtraData; ALCuint available = RingBufferSize(data->ring); const void *buf; size_t length; available *= data->frame_size; samples *= data->frame_size; ppa_threaded_mainloop_lock(data->loop); if(available+ppa_stream_readable_size(data->stream) < samples) { ppa_threaded_mainloop_unlock(data->loop); alcSetError(device, ALC_INVALID_VALUE); return; } available = min(available, samples); if(available > 0) { ReadRingBuffer(data->ring, buffer, available/data->frame_size); buffer = (ALubyte*)buffer + available; samples -= available; } /* Capture is done in fragment-sized chunks, so we loop until we get all * that's requested */ while(samples > 0) { if(ppa_stream_peek(data->stream, &buf, &length) < 0) { AL_PRINT("pa_stream_peek() failed: %s\n", ppa_strerror(ppa_context_errno(data->context))); break; } available = min(length, samples); memcpy(buffer, buf, available); buffer = (ALubyte*)buffer + available; buf = (const ALubyte*)buf + available; samples -= available; length -= available; /* Any unread data in the fragment will be lost, so save it */ length /= data->frame_size; if(length > 0) { if(length > data->samples) length = data->samples; WriteRingBuffer(data->ring, buf, length); } ppa_stream_drop(data->stream); } ppa_threaded_mainloop_unlock(data->loop); } //}}}
static void pulse_capture_samples(ALCdevice *device, ALCvoid *buffer, ALCuint samples) //{{{ { pulse_data *data = device->ExtraData; ALCuint available = RingBufferSize(data->ring); if(available < samples) SetALCError(ALC_INVALID_VALUE); else ReadRingBuffer(data->ring, buffer, samples); } //}}}
static void pulse_capture_samples( ALCdevice* device, ALCvoid* buffer, ALCuint samples ) //{{{ { pulse_data* data = device->ExtraData; if ( pulse_available_samples( device ) >= samples ) { ReadRingBuffer( data->ring, buffer, samples ); } else { alcSetError( device, ALC_INVALID_VALUE ); } } //}}}
static OSStatus ca_capture_conversion_callback(AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets, AudioBufferList *ioData, AudioStreamPacketDescription **outDataPacketDescription, void* inUserData) { ALCdevice *device = (ALCdevice*)inUserData; ca_data *data = (ca_data*)device->ExtraData; // Read from the ring buffer and store temporarily in a large buffer ReadRingBuffer(data->ring, data->resampleBuffer, (ALsizei)(*ioNumberDataPackets)); // Set the input data ioData->mNumberBuffers = 1; ioData->mBuffers[0].mNumberChannels = data->format.mChannelsPerFrame; ioData->mBuffers[0].mData = data->resampleBuffer; ioData->mBuffers[0].mDataByteSize = (*ioNumberDataPackets) * data->format.mBytesPerFrame; return noErr; }
static ALCenum oss_capture_samples(ALCdevice *pDevice, ALCvoid *pBuffer, ALCuint lSamples) { oss_data *data = (oss_data*)pDevice->ExtraData; ReadRingBuffer(data->ring, pBuffer, lSamples); return ALC_NO_ERROR; }
static ALCenum WinMMCaptureSamples(ALCdevice *Device, ALCvoid *Buffer, ALCuint Samples) { WinMMData *data = (WinMMData*)Device->ExtraData; ReadRingBuffer(data->Ring, Buffer, Samples); return ALC_NO_ERROR; }
static ALCenum pa_capture_samples(ALCdevice *device, ALCvoid *buffer, ALCuint samples) { pa_data *data = device->ExtraData; ReadRingBuffer(data->ring, buffer, samples); return ALC_NO_ERROR; }
static ALCenum DSoundCaptureSamples(ALCdevice *Device, ALCvoid *pBuffer, ALCuint lSamples) { DSoundCaptureData *data = Device->ExtraData; ReadRingBuffer(data->Ring, pBuffer, lSamples); return ALC_NO_ERROR; }
static ALCenum WinMMCaptureSamples(ALCdevice *pDevice, ALCvoid *pBuffer, ALCuint lSamples) { WinMMData *pData = (WinMMData*)pDevice->ExtraData; ReadRingBuffer(pData->pRing, pBuffer, lSamples); return ALC_NO_ERROR; }
static ALCenum alsa_capture_samples(ALCdevice *Device, ALCvoid *Buffer, ALCuint Samples) { alsa_data *data = (alsa_data*)Device->ExtraData; if(data->ring) { ReadRingBuffer(data->ring, Buffer, Samples); return ALC_NO_ERROR; } data->last_avail -= Samples; while(Device->Connected && Samples > 0) { snd_pcm_sframes_t amt = 0; if(data->size > 0) { /* First get any data stored from the last stop */ amt = snd_pcm_bytes_to_frames(data->pcmHandle, data->size); if((snd_pcm_uframes_t)amt > Samples) amt = Samples; amt = snd_pcm_frames_to_bytes(data->pcmHandle, amt); memmove(Buffer, data->buffer, amt); if(data->size > amt) { memmove(data->buffer, data->buffer+amt, data->size - amt); data->size -= amt; } else { free(data->buffer); data->buffer = NULL; data->size = 0; } amt = snd_pcm_bytes_to_frames(data->pcmHandle, amt); } else if(data->doCapture) amt = snd_pcm_readi(data->pcmHandle, Buffer, Samples); 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) { 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; } /* If the amount available is less than what's asked, we lost it * during recovery. So just give silence instead. */ if((snd_pcm_uframes_t)amt < Samples) break; continue; } Buffer = (ALbyte*)Buffer + amt; Samples -= amt; } if(Samples > 0) memset(Buffer, ((Device->FmtType == DevFmtUByte) ? 0x80 : 0), snd_pcm_frames_to_bytes(data->pcmHandle, Samples)); return ALC_NO_ERROR; }
static ALCenum alsa_capture_samples(ALCdevice *Device, ALCvoid *Buffer, ALCuint Samples) { alsa_data *data = (alsa_data*)Device->ExtraData; ReadRingBuffer(data->ring, Buffer, Samples); return ALC_NO_ERROR; }