I am working on an app which must change the configuration for sample rate on 
the fly.  I have produced code which seems to work.  However, for some 
reason, the app doing capturing runs only for about 2 seconds after capturing 
begins, at which point the app crashes with a segfault.  This is due to the 
sampling, and in fact changing of the hwparams because if I comment out the 
code which does that, I am able to sample continuously, which does not 
satisfy my needs.

The code attached executes flawlessly.  However, approximately two seconds 
after executing it, I get teh segault with no explanation.

I am using the plughw device so as to allow a lot of this stuff to happen in 
software for me.

I would appreciate any suggestions or refferences that you can point me to.

Garrett Kajmowicz
[EMAIL PROTECTED]

Initial initialization code for the device:

                std::cout << "Initializting capture device\n";
                stream = SND_PCM_STREAM_CAPTURE;
                pcm_name = strdup("plughw:0");
                snd_pcm_hw_params_alloca(&hwparams);
                int retval;
                int retdir;

                if ((retval = snd_pcm_open(&pcm_handle, pcm_name, stream, 
SND_PCM_NONBLOCK)) 
< 0) {
                        return;
                }
                if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
                        return;
                }
                if (snd_pcm_hw_params_set_access(pcm_handle, hwparams, 
SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) {
                        return;
                }
                if (snd_pcm_hw_params_set_format(pcm_handle, hwparams, 
SND_PCM_FORMAT_S16_LE) < 0) {
                        return;
                }
                retdir = 0;
                snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, 16000, &retdir);

                if (snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 1) < 0) {
                        return;
                }

                if (snd_pcm_hw_params(pcm_handle, hwparams) < 0) {
                        return;
                }



The code section used to change the settings is as follows:
                        The stream, pcm_handle and the hwparams are teh same objects 
as above; 
global object

                        if(snd_pcm_drop(pcm_handle)<0){
                                std::cout << "PCM drop failed\n";
                        }else{
                                std::cout <<"PCM drop succeded\n";
                        }

                        if(snd_pcm_close(pcm_handle)<0){
                                std::cout << "PCM close failed\n";
                        }else{
                                std::cout << "PCM close succeded\n";
                        }

                        std::cout << "Opening PCM device" << std::endl;

                        if (snd_pcm_open(&pcm_handle, pcm_name, stream, 
SND_PCM_NONBLOCK) < 0) {
                                std::cout <<"pcm_open failed\n";
                                return;
                        }else{
                                std::cout << "PCM open succeded\n";
                        }
                        
                        if(snd_pcm_hw_params_any(pcm_handle, hwparams) < 0){
                                std::cout << "Error setting snd_pcm_hw_params_any";
                        }else{
                                std::cout << "Succeded setting params_any\n";
                        }
                        if(snd_pcm_hw_params_set_access(pcm_handle, hwparams, 
SND_PCM_ACCESS_MMAP_INTERLEAVED)<0){
                                std::cout << "Error setting access mode\n";
                        }else{
                                std::cout << "Succeded setting access mode\n";
                        }

                        if (snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 1) < 
0) {
                                return;
                        }else{
                                std::cout <<"Channels set for recording\n";
                        }

                        std::cout << "Setting sample rate\n";
                        retdir=0;

                        std::cout << "Sample rate set to: " << 
snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, currentSampleRate, 
&retdir) << std::endl;

                        std::cout <<"Setting data format\n";

                        //SNIP - doing a lot of comparisons to see what data format to 
select. 
                        //Sample code:
                        snd_pcm_hw_params_set_format(pcm_handle, hwparams, 
SND_PCM_FORMAT_U8);
                        //End of SNIP

                        if (snd_pcm_hw_params(pcm_handle, hwparams) < 0) {
                                std::cout << "***Error setting playback HW params";
                                return;
                        } else{
                                std::cout << "Update of hwparams succeded\n";
                        }



-------------------------------------------------------
This SF.Net email sponsored by: Parasoft
Error proof Web apps, automate testing & more.
Download & eval WebKing and get a free book.
www.parasoft.com/bulletproofapps1
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to