From mboxrd@z Thu Jan 1 00:00:00 1970 From: IOhannes m zmoelnig Subject: Re: crash with assertion (?) Date: Wed, 08 Sep 2010 10:41:02 +0200 Message-ID: <4C874C1E.8040007@iem.at> References: <4C8662AD.1040607@iem.at> <4C8670FD.5020906@ladisch.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5004146096519382743==" Return-path: Received: from mail.iem.at (iem.kug.ac.at [193.170.191.180]) by alsa0.perex.cz (Postfix) with ESMTP id BEA212442A for ; Wed, 8 Sep 2010 10:41:03 +0200 (CEST) In-Reply-To: <4C8670FD.5020906@ladisch.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@alsa-project.org Errors-To: alsa-devel-bounces@alsa-project.org To: Clemens Ladisch Cc: alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org This is a cryptographically signed message in MIME format. --===============5004146096519382743== Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="------------ms000403010707020508060102" This is a cryptographically signed message in MIME format. --------------ms000403010707020508060102 Content-Type: multipart/mixed; boundary="------------090805020500080807020104" This is a multi-part message in MIME format. --------------090805020500080807020104 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable 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=3D44100; >> err =3D snd_pcm_hw_params_set_rate_min(handle, params, &rate, 0); >=20 > This requests a sample rate of at least 44100 Hz. yes. this is good enough for me. (it shouldn't crash though) >=20 >> [...] >> err =3D 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." >=20 > 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 --------------090805020500080807020104 Content-Type: text/x-csrc; name="alsatest.c" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="alsatest.c" #include #include #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=3D44100; snd_pcm_uframes_t uframes =3D 64; snd_pcm_hw_params_t* hw_params; int err; snd_pcm_hw_params_alloca(&hw_params); err =3D snd_pcm_hw_params_any(pcm, hw_params); if(err<0){fprintf(stderr, "snd_pcm_hw_params_any failed: %s\n", snd_st= rerror(err));return err;} #if ENABLE_SETPARAMS & 1 err =3D 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 =3D 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 =3D snd_pcm_hw_params(pcm, hw_params); if(err<0){fprintf(stderr, "snd_pcm_hw_params failed: %s\n", snd_strerr= or(err));return err;} printf("configuring device succeeded\n"); return 0; } void pcm_open(char*name) { int err=3D0; snd_pcm_t *pcmIn=3D0, *pcmOut=3D0; printf("trying to open '%s' as CAPTURE\n", name); err =3D snd_pcm_open(&pcmIn, name, SND_PCM_STREAM_CAPTURE, SND_PCM_NONB= LOCK); if(err<0){fprintf(stderr, "snd_pcm_open(CAPTURE) failed: %s\n", snd_st= rerror(err));goto closeit;} err=3Dsnd_pcm_nonblock(pcmIn, 1); if(err<0){fprintf(stderr, "snd_pcm_nonblock failed: %s\n", snd_strerro= r(err));goto closeit;} pcm_configure(pcmIn); fprintf(stderr, "CAPTURE configured\n"); printf("trying to open '%s' as PLAYBACK\n", name); err =3D snd_pcm_open(&pcmOut, name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NO= NBLOCK); if(err<0){fprintf(stderr, "snd_pcm_open(PLAYBACK) failed: %s\n", snd_s= trerror(err));goto closeit;} err=3Dsnd_pcm_nonblock(pcmOut, 1); if(err<0){fprintf(stderr, "snd_pcm_nonblock failed: %s\n", snd_strerro= r(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=3D0; if(argc>1) { for(i=3D1; i