FunWithElectronics.com
          - Collection of Information for those with Electronics as a Hobby
Up one level (Programming)

Laste lyd inn i minnebuffer ved hjelp av ALSA (norwegian)

Det første en må gjøre for å leke med lydsignaler som kommer inn på maskinen er få disse inn i programmet på en eller annen måte. Det en gjør er å sette opp ALSA-systemet til å kontinuerlig lagre sampler i en programvarebuffer. Deretter kan en bruke dedikerte ALSA-funksjoner for å hente disse samplene ut i grupper.

ALSA er lydsystemet som blir brukt som standard i Linux i dag. Tidligere hadde en et annet system som ble kalt OSS. Dette var for så vidt enklere å programmere til, ettersom en kunne bruke det ved å skrive til en fil i /dev-mappa på samme måte som en skriver til en hvilken som helst annen fil. Ulempene med OSS var blant annet det at det støttet kun avspilling av en lydkilde om gangen. I tillegg var mange av spesialfunksjonene til forskjellige lydkort ikke støttet. Derfor ble ALSA utvikla som et mer komplett system. ALSA står for Advanced Linux Sound Architecture.

Til ALSA har en et bibliotek som en må linke alle program som skal bruke ALSA til. Dette betyr at en har spesielle funksjoner som blir brukt ved kontakt med lydkortet.





#include <stdio.h>

#include <stdlib.h>
#include <alsa/asoundlib.h>


int input_initialize(snd_pcm_t * handle, short **buffer, int *buffer_l)
{
	int err;

	snd_pcm_hw_params_t *hwparams;
	
	snd_pcm_hw_params_alloca(&hwparams);
	
	if ((err = snd_pcm_hw_params_any(handle,hwparams)) < 0)
	{
		fprintf(stderr,"Error initializing hwparams\n");
		return -1;
	}

	if ((err = snd_pcm_hw_params_set_access(handle,hwparams,SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
	{
		fprintf(stderr,"Error setting access mode\n");
		return -1;
	}
	if ((err = snd_pcm_hw_params_set_format(handle,hwparams,SND_PCM_FORMAT_S16_LE)) < 0)
	{
		fprintf(stderr,"Error setting format\n");
		return -1;
	}
	int channels = 1;
	if ((err = snd_pcm_hw_params_set_channels(handle,hwparams,channels)) < 0)
	{
		fprintf(stderr,"Error setting mono mode\n");
		return -1;
	}
	
	int rate = 48000;

	if ((err = snd_pcm_hw_params_set_rate_near(handle,hwparams,&rate,0)) < 0)
	{
		fprintf(stderr,"Error setting samplerate\n");
		return -1;
	}
	snd_pcm_uframes_t size = 4096;
	int dir=0;
	
	if ((err = snd_pcm_hw_params_set_period_size_near(handle,hwparams, &size,&dir)) < 0)
	{
		fprintf(stderr,"Error setting buffer size\n");
		return -1;
	}

	if ((err = snd_pcm_hw_params(handle,hwparams)) < 0)
	{
		fprintf(stderr,"Error writing hwparams\n");
		return -1;
	}

	snd_pcm_hw_params_get_period_size(hwparams, &size, &dir);
	printf("Using sound buffer size: %d\n",(int)size);
	int extra = (int)size % 5;
	*buffer_l = (int)size - extra;

	if((*buffer = (short*)malloc((*buffer_l) * sizeof(short))) == NULL)
	{
		fprintf(stderr,"Error allocating memory\n");
		return -1;
	}

	return 0;
}




void input_read(snd_pcm_t *handle, short *buffer, int count)
{
	int err;

	err = snd_pcm_readi(handle,buffer,count);
//	printf("leser %d\n",count);
	if (err == -EPIPE)
	{
		fprintf(stderr,"Overrun\n");
		snd_pcm_prepare(handle);
	}
	else if(err < 0)
	{
		fprintf(stderr,"Write error\n");
	}
	else if (err != count)
	{
		fprintf(stderr,"Short read, read %d frames\n",err);
	}

}



Add a comment:

Fill in number
Name:
Title:
Text:
 


Privacy | Contact