On 2010-09-07 19:06, Clemens Ladisch wrote: > IOhannes m zmoelnig wrote: >> i'm requesting my "plughw" device with 44100Hz >> the request is done with something like: >> rate=44100; >> err = snd_pcm_hw_params_set_rate_min(handle, params, &rate, 0); > > This requests a sample rate of at least 44100 Hz. yes. this is good enough for me. (it shouldn't crash though) > >> [...] >> err = snd_pcm_hw_params(handle, params); >> >> what happens: >> in the snd_pcm_hw_params(), my program exits with: >> "interval_inline.h:52: snd_interval_single: Assertion >> `!snd_interval_empty(i)' failed." > > You called snd_pcm_hw_params with an invalid params structure. > I'd guess that snd_pcm_hw_params_set_rate_min (or some other > snd_pcm_hw_params_set_*) returned an error. i wish you were right. however, it seems like i am blindfolded. i noticed however, that i need to set both the rate (i use snd_pcm_hw_params_set_rate_min()) and the period size (i use snd_pcm_hw_params_set_period_size_near()), in order to make it crash. attached is an example code that triggers the crash. please someone shed some light... gmasdr IOhannes PS: that's how i use the sample program: $ gcc -o alsatest alsatest.c $(pkg-config --cflags --libs alsa) $ ./alsatest trying to open 'hw:0' as CAPTURE configuring device succeeded CAPTURE configured trying to open 'hw:0' as PLAYBACK configuring device succeeded PLAYBACK configured trying to open 'plughw:0' as CAPTURE configuring device succeeded CAPTURE configured trying to open 'plughw:0' as PLAYBACK alsatest: interval_inline.h:55: snd_interval_single: Assertion `!snd_interval_empty(i)' failed. Aborted so it seems to work fine with "hw:0" but not with "plughw:0". you can specify the device to be opened on the cmdline: $ ./alsatest hw:2
#include <stdio.h> #include <alsa/asoundlib.h> #define ENABLE_SETPARAMS_RATE 1 #define ENABLE_SETPARAMS_PERIOD 2 /* neither set_rate_min() nor set_period_size_near() is ok (but trivial) */ //#define ENABLE_SETPARAMS 0 /* only set_rate_min() is ok */ //#define ENABLE_SETPARAMS ENABLE_SETPARAMS_RATE /* only set_period_size_near() is ok as well */ //#define ENABLE_SETPARAMS ENABLE_SETPARAMS_PERIOD /* both set_rate_min() and set_period_size_near() -> CRASH */ #define ENABLE_SETPARAMS ENABLE_SETPARAMS_RATE | ENABLE_SETPARAMS_PERIOD int pcm_configure(snd_pcm_t *pcm) { unsigned int rate=44100; snd_pcm_uframes_t uframes = 64; snd_pcm_hw_params_t* hw_params; int err; snd_pcm_hw_params_alloca(&hw_params); err = snd_pcm_hw_params_any(pcm, hw_params); if(err<0){fprintf(stderr, "snd_pcm_hw_params_any failed: %s\n", snd_strerror(err));return err;} #if ENABLE_SETPARAMS & 1 err = snd_pcm_hw_params_set_rate_min(pcm, hw_params, &rate, 0); if(err<0){fprintf(stderr, "snd_pcm_hw_params_set_rate_min failed: %s\n", snd_strerror(err));return err;} #endif #if ENABLE_SETPARAMS & 2 err = snd_pcm_hw_params_set_period_size_near(pcm, hw_params, &uframes, 0); if(err<0){fprintf(stderr, "snd_pcm_hw_params_set_period_size failed: %s\n", snd_strerror(err));return err;} #endif err = snd_pcm_hw_params(pcm, hw_params); if(err<0){fprintf(stderr, "snd_pcm_hw_params failed: %s\n", snd_strerror(err));return err;} printf("configuring device succeeded\n"); return 0; } void pcm_open(char*name) { int err=0; snd_pcm_t *pcmIn=0, *pcmOut=0; printf("trying to open '%s' as CAPTURE\n", name); err = snd_pcm_open(&pcmIn, name, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK); if(err<0){fprintf(stderr, "snd_pcm_open(CAPTURE) failed: %s\n", snd_strerror(err));goto closeit;} err=snd_pcm_nonblock(pcmIn, 1); if(err<0){fprintf(stderr, "snd_pcm_nonblock failed: %s\n", snd_strerror(err));goto closeit;} pcm_configure(pcmIn); fprintf(stderr, "CAPTURE configured\n"); printf("trying to open '%s' as PLAYBACK\n", name); err = snd_pcm_open(&pcmOut, name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); if(err<0){fprintf(stderr, "snd_pcm_open(PLAYBACK) failed: %s\n", snd_strerror(err));goto closeit;} err=snd_pcm_nonblock(pcmOut, 1); if(err<0){fprintf(stderr, "snd_pcm_nonblock failed: %s\n", snd_strerror(err));goto closeit;} pcm_configure(pcmOut); fprintf(stderr, "PLAYBACK configured\n"); closeit: if(pcmIn)snd_pcm_close(pcmIn); if(pcmOut)snd_pcm_close(pcmOut); } int main(int argc, char**argv) { int i=0; if(argc>1) { for(i=1; i<argc; i++) { pcm_open(argv[i]); } } else { pcm_open("hw:0"); pcm_open("plughw:0"); } fprintf(stderr, "bye bye\n"); return 0; }
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel