Пример #1
0
Файл: winmm.c Проект: 9heart/DT3
/*
    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;
}
Пример #3
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 );
}