Re: crash with assertion (?)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux