* duplex mode
@ 2002-04-27 18:44 Karsten Günther
2002-04-27 19:11 ` Paul Davis
0 siblings, 1 reply; 2+ messages in thread
From: Karsten Günther @ 2002-04-27 18:44 UTC (permalink / raw)
To: alsa-devel
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;
}
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: duplex mode
2002-04-27 18:44 duplex mode Karsten Günther
@ 2002-04-27 19:11 ` Paul Davis
0 siblings, 0 replies; 2+ messages in thread
From: Paul Davis @ 2002-04-27 19:11 UTC (permalink / raw)
To: Karsten G nther; +Cc: alsa-devel
>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.
i don't know anything specific here except that the awe64 is really
useless piece of junk for duplex work. you can't use both directions
at 16 bits, for example. save yourself the hassle and get a decent
soundcard. they're not expensive ...
--p
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2002-04-27 19:11 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-04-27 18:44 duplex mode Karsten Günther
2002-04-27 19:11 ` Paul Davis
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.