Hello!
I'm trying to get access to my soundcard in duplex mode. I simply try to
open a pcm device twice, for capture and playback. But if I opened and
initialized the first device, I get an error message for the second,
that the sample format is not available. Is that, because my soundcard
does not support duplex? It's an AWE64, so I think, it should. I am
using this code.
Thanks for any help,
KG
int ALSAopen(short number,
int handle,
char *dir) {
int err, flags;
char name[10];
//Outputhandler
snd_output_t *output = NULL;
sprintf(name, "hw:%d,0", number);
switch (dir[0]){
case 'r': /* read */
flags = SND_PCM_STREAM_CAPTURE;
break;
case 'w': /* write */
flags = SND_PCM_STREAM_PLAYBACK;
break;
default: /* invalid argument */
return(-1);
}
//open the device
if ((err = snd_pcm_open((void *)handle, name, flags, SND_PCM_ASYNC))
< 0) {
printf("Unable to open the device: %s\n", snd_strerror(err));
return 0;
}
/* if ((err = snd_output_stdio_attach(&output, stderr, 0)) < 0) { */
/* fprintf(stderr, "snd_output_stdio_attach: %s\n",
snd_strerror(err)); */
/* return 0; */
/* } */
if (debug) printf("Device opened.\n");
return 1;
}
int ALSAclose(snd_pcm_t *handle)
{
return(snd_pcm_close(handle));
}
int ALSAinit(snd_pcm_t *handle,
int nbits,
int *nchan,
int samples,
int buffer_time,
int period_time,
snd_pcm_access_t accesstype)
{
int err, dir;
snd_pcm_hw_params_t *params;
snd_pcm_sw_params_t *swparams;
snd_pcm_sframes_t period_size;
snd_pcm_sframes_t buffer_size;
snd_pcm_format_t format;
snd_pcm_hw_params_alloca(¶ms);
snd_pcm_sw_params_alloca(&swparams);
if ((err = snd_pcm_hw_params_any(handle, params)) < 0) {
printf("Broken configuration for playback:"
" no configurations available: %s\n", snd_strerror(err));
return 0;
}
/* Interleaved read/write format */
err = snd_pcm_hw_params_set_access(handle, params, accesstype);
if (err < 0) {
printf("Hardware parameters not available: %s\n", snd_strerror(err));
return 0;
}
/* Sample format */
switch (nbits) {
case 8:
format = SND_PCM_FORMAT_S8;
break;
case 16:
format = SND_PCM_FORMAT_S16;
break;
case 32:
format = SND_PCM_FORMAT_S32;
break;
default:
printf("wrong sample format!");
}
if ((err = snd_pcm_hw_params_set_format(handle, params, format)) < 0) {
printf("Sample format not available: %s\n", snd_strerror(err));
return 0;
}
/* channels */
if ((err = snd_pcm_hw_params_set_channels_near(handle, params,
*nchan)) < 0) {
return 0;
}
//We only guess, how many channels we have, so we want the exact
count back ;-)
*nchan = snd_pcm_hw_params_get_channels(params);
if (debug) printf("Number of channels:
%d\n",snd_pcm_hw_params_get_channels(params));
/* Stream rate */
if ((err = snd_pcm_hw_params_set_rate_near(handle, params, samples,
0)) < 0) {
printf("Rate %iHz not possible: %s\n", samples, snd_strerror(err));
return 0;
}
if (debug) printf("Choosen sample rate: %d\n",
snd_pcm_hw_params_get_rate(params, 0));
if (err != samples) {
printf("Sampling-Rate stimmt nicht berein (angefordert: %iHz,
mglich: %iHz)\n", samples, err);
return -EINVAL;
}
/* buffer */
err = snd_pcm_hw_params_set_buffer_time_near(handle, params,
buffer_time, &dir);
if (err < 0) {
printf("Unable to set buffer time %i for playback: %s\n",
buffer_time, snd_strerror(err));
return 0;
}
buffer_size = snd_pcm_hw_params_get_buffer_size(params);
err = snd_pcm_hw_params_set_period_time_near(handle, params,
period_time, &dir);
if (err < 0) {
printf("Unable to set period time %i for playback: %s\n",
period_time, snd_strerror(err));
return 0;
}
period_size = snd_pcm_hw_params_get_period_size(params, &dir);
/* set the params */
err = snd_pcm_hw_params(handle, params);
if (err < 0) {
printf("Unable to set hardware parameter: %s\n", snd_strerror(err));
return 0;
}
snd_pcm_hw_params_free(params);
if (debug) printf("Hardware initialized.\n");
//software parameter
/* err = snd_pcm_sw_params_current(handle, swparams); */
/* if (err < 0) { */
/* printf("Unable to determine current swparams for playback: %s\n", */
/* snd_strerror(err)); */
/* return err; */
/* } */
/* err = snd_pcm_sw_params_set_start_threshold(handle, swparams, 0); */
/* if (err < 0) { */
/* printf("Unable to set start threshold mode for playback: %s\n", */
/* snd_strerror(err)); */
/* return err; */
/* } */
/* err = snd_pcm_sw_params_set_avail_min(handle, swparams,
period_size); */
/* if (err < 0) { */
/* printf("Unable to set avail min for playback: %s\n",
snd_strerror(err)); */
/* return err; */
/* } */
/* err = snd_pcm_sw_params_set_xfer_align(handle, swparams, 1); */
/* if (err < 0) { */
/* printf("Unable to set transfer align for playback: %s\n", */
/* snd_strerror(err)); */
/* return err; */
/* } */
/* err = snd_pcm_sw_params(handle, swparams); */
/* if (err < 0) { */
/* printf("Unable to set sw params for playback: %s\n",
snd_strerror(err)); */
/* return err; */
/* } */
/* if (debug) printf("Software parameter initialized.\n"); */
snd_pcm_prepare(handle);
return 1;
}
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel