* using ALSA one call
@ 2009-02-10 12:30 kallipygos
2009-02-10 15:04 ` Clemens Ladisch
0 siblings, 1 reply; 4+ messages in thread
From: kallipygos @ 2009-02-10 12:30 UTC (permalink / raw)
To: alsa-devel
Hi Developers.
My name is Alf and i new in this list .
I physics student , and i write some sound programs under linux.
Big sorry for my english , in school i learn only deutsch.
So far i used old /dev/dsp open funntion also under ALSA.
/*--OSD--*/#define RATE 44100 /* the sampling rate */
/*--OSD--*/#define SIZE 16 /* sample size: 8 or 16 bits */
/*--OSD--*/#define CHANNELS 2 /* 1 = mono 2 = stereo */
/*--OSD--*/void open_sound_device_wr(void)
/*--OSD--*/{// fdo = open("/dev/dsp", O_RDWR );
/*--OSD--*/ fdo = open("/dev/dsp", O_WRONLY );
/*--OSD--*/ if (fdo < 0) { perror("open of /dev/dsp failed"); exit(1); }
/*--OSD--*/
/*--OSD--*/ arg = SIZE; //// sample size
/*--OSD--*/ status = ioctl(fdo, SOUND_PCM_WRITE_BITS, &arg);
/*--OSD--*/ if (status == -1) perror("SOUND_PCM_WRITE_BITS ioctl failed");
/*--OSD--*/ if (arg != SIZE) perror("unable to set sample size");
/*--OSD--*/
/*--OSD--*/ arg = CHANNELS; //// mono or stereo
/*--OSD--*/ status = ioctl(fdo, SOUND_PCM_WRITE_CHANNELS, &arg);
/*--OSD--*/ if (status == -1) perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
/*--OSD--*/ if (arg != CHANNELS) perror("unable to set number of channels");
/*--OSD--*/
/*--OSD--*/ arg = RATE; //// sampling rate
/*--OSD--*/ status = ioctl(fdo, SOUND_PCM_WRITE_RATE, &arg);
/*--OSD--*/ if (status == -1) perror("SOUND_PCM_WRITE_WRITE ioctl failed");
/*--OSD--*/}
----
Now i wana try da same with ALSA ,
for example all parameters put in one struckture and then simple call
one universal alsa_open funktion.
Is it posssible with ALSA ?
Is here copy-paste example/function for fast, comfortable and easy ALSA use ?
for example so :
====
#include "alsa/asoundlib.h"
...
alsa_parm_struckt.device = "default"; // "hw:0,0"; "hw:1,0";
alsa_parm_struckt.play_capt = SND_PCM_STREAM_PLAYBACK;
alsa_parm_struckt.format = SND_PCM_FORMAT_S16_LE;
alsa_parm_struckt.access = SND_PCM_ACCESS_RW_INTERLEAVED;
//alsa_parm_struckt.samplerate = 48000;
alsa_parm_struckt.samplerate = 44100;
alsa_parm_struckt.channelz =2;
alsa_parm_struckt.bytes_per_sample = 2;
alsa_parm_struckt.latency = 0; // ??
alsa_parm_struckt.nonblock = 1; // ??
... other parameters set ...
...
alsa_open_function( & handle , & alsa_parm_struckt [ , ...] );
and after this write data blocks
frames_2_write = ...
for(;;)
{
...
frames = snd_pcm_writei(handle, buffer, frames_2_write );
...
}
====
OK , this example works
http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm__min_8c-example.html
but only if samplerate = 48000;
if samplerate = 44100 - then not :(
44k file play in 48k mode :D it sounds funnee :D
I remixed this program so that it read data from wave file.
gcc pcm_min01.c -lasound -O2 -o pcm_min01
./pcm_min01 '/mnt/hda2/Booty Luv - Shine/Booty Luv - Shine (Ian Carey remix).wav'
i gotta this :
ALSA lib pcm.c:7160:(snd_pcm_set_params) Rate doesn't match (requested 44100Hz, get 0Hz)
Playback open error: Invalid argument
With aplay no problems, it is played in da correct speed.
--
aplay '/mnt/hda2/Booty Luv - Shine/Booty Luv - Shine (Ian Carey remix).wav'
Playing WAVE '/mnt/hda2/Booty Luv - Shine/Booty Luv - Shine (Ian Carey remix).wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
--
Any ideas/examples/... welcome
Tnx in advance
Alf
====
----
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: using ALSA one call 2009-02-10 12:30 using ALSA one call kallipygos @ 2009-02-10 15:04 ` Clemens Ladisch 2009-02-10 22:47 ` Alfs Kurmis 0 siblings, 1 reply; 4+ messages in thread From: Clemens Ladisch @ 2009-02-10 15:04 UTC (permalink / raw) To: kallipygos; +Cc: alsa-devel kallipygos@inbox.lv wrote: > OK , this example works > http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm__min_8c-example.html > but only if samplerate = 48000; > if samplerate = 44100 - then not :( > 44k file play in 48k mode :D it sounds funnee :D > > I remixed this program so that it read data from wave file. > > gcc pcm_min01.c -lasound -O2 -o pcm_min01 > ./pcm_min01 '/mnt/hda2/Booty Luv - Shine/Booty Luv - Shine (Ian Carey remix).wav' > i gotta this : > ALSA lib pcm.c:7160:(snd_pcm_set_params) Rate doesn't match (requested 44100Hz, get 0Hz) Please show the source code of your program. Best regards, Clemens ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: using ALSA one call 2009-02-10 15:04 ` Clemens Ladisch @ 2009-02-10 22:47 ` Alfs Kurmis 2009-02-11 8:55 ` Clemens Ladisch 0 siblings, 1 reply; 4+ messages in thread From: Alfs Kurmis @ 2009-02-10 22:47 UTC (permalink / raw) To: alsa-devel Moin Meister Quoting Clemens Ladisch <clemens@ladisch.de>: > > but only if samplerate = 48000; > > if samplerate = 44100 - then not :( > > 44k file play in 48k mode :D it sounds funnee :D > > > > i gotta this : > > ALSA lib pcm.c:7160:(snd_pcm_set_params) Rate doesn't match (requested > 44100Hz, get 0Hz) > > Please show the source code of your program. see below I have on my notebook 2 sound cards * built in $ lspci ... 00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 02) ... and second on USB wire - Edirol by Roland ... I have switch em to 44,1k As given here http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#g6aa164ed37308d66bcc079f5cd265a09 latency required overall latency in us (0 = optimum latency for players) i have try to set optimum latency = 0; snd_pcm_set_params(handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, channelz, samplerate , 0, 0) ./pcm_min01 '/mnt/hda2/Booty Luv - Shine/Booty Luv - Boogie 2nite (DJ Teddy-o remix).wav' Now playing to USB device "hw:1,0" gotta this : Short write (expected 4096, wrote 360) Short write (expected 4096, wrote 360) Short write (expected 4096, wrote 2427) wery fragmentary sound with latency = 500000 us USB play is OK. But why i can not play my wave on notebook sound device "hw:0,0" ?? Tnx in advance Alf /* * This extra small demo sends a random samples to your speakers. */ #include "alsa/asoundlib.h" #include <stdio.h> #include <fcntl.h> // #include <unistd.h> // #include <sys/types.h> // //static char *device = "default"; /* playback device */ //static char *device = "hw:0,0"; static char *device = "hw:1,0"; snd_output_t *output = NULL; //unsigned char buffer[16*1024]; /* some random data */ /*unsigned*/ short buffer[/*4*1024*/8192]; int main( int argc, char *argv[] ) { int err; unsigned int i; int channelz, bytes_per_sample, samplerate; snd_pcm_t *handle; snd_pcm_sframes_t frames , frames_2_write; int einfd ; int rdstatus ; // samplerate = 48000; samplerate = 44100; channelz =2; bytes_per_sample = 2; frames_2_write = sizeof(buffer) / (channelz * bytes_per_sample); //for (i = 0; i < (4*1024) ; i++){ buffer[i] = random() & 0xffff; } einfd = open( argv[1] , O_RDONLY ); lseek(einfd, 48L ,SEEK_SET); if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { printf("Playback open error: %s\n", snd_strerror(err)); exit(EXIT_FAILURE); } if ((err = snd_pcm_set_params(handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, channelz, samplerate , 0, 500000)) < 0) { /* 500000 0.5sec */ printf("Playback open error: %s\n", snd_strerror(err)); exit(EXIT_FAILURE); } for (i = 0; i < 128; i++) { rdstatus = read(einfd,&buffer[0],sizeof(buffer)); frames = snd_pcm_writei(handle, buffer, frames_2_write ); if (frames < 0) frames = snd_pcm_recover(handle, frames, 1); if (frames < 0) { printf("snd_pcm_writei failed: %s\n", snd_strerror(err)); /*break;*/ goto yuck_off; } if (frames > 0 && frames < (long) frames_2_write) printf("Short write (expected %li, wrote %li)\n", (long) frames_2_write, frames); } yuck_off: close(einfd); snd_pcm_close(handle); return 0; } ---- ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: using ALSA one call 2009-02-10 22:47 ` Alfs Kurmis @ 2009-02-11 8:55 ` Clemens Ladisch 0 siblings, 0 replies; 4+ messages in thread From: Clemens Ladisch @ 2009-02-11 8:55 UTC (permalink / raw) To: Alfs Kurmis; +Cc: alsa-devel Alfs Kurmis wrote: > As given here > http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#g6aa164ed37308d66bcc079f5cd265a09 > latency required overall latency in us (0 = optimum latency for players) > i have try to set optimum latency = 0; That documentation is wrong; 0 is not allowed. Just use 0.5 s, or some larger value. > But why i can not play my wave on notebook sound device "hw:0,0" ?? Because the "hw" device goes straight to the hardware and disallows any conversion of sample rate/format. Use "default", or something like "default:0" to select a specific card. > snd_pcm_set_params(handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, > channelz, samplerate , 0, 500000) ... and setting soft_resample to 0 disallows resampling in any case. HTH Clemens ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-02-11 8:55 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-02-10 12:30 using ALSA one call kallipygos 2009-02-10 15:04 ` Clemens Ladisch 2009-02-10 22:47 ` Alfs Kurmis 2009-02-11 8:55 ` Clemens Ladisch
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.