From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: Bug in pcm_plugin.c, function snd_pcm_plug_alloc? Date: Tue, 16 Sep 2003 18:31:47 +0200 Sender: alsa-devel-admin@lists.sourceforge.net Message-ID: References: Mime-Version: 1.0 (generated by SEMI 1.14.5 - "Awara-Onsen") Content-Type: multipart/mixed; boundary="Multipart_Tue_Sep_16_18:31:47_2003-1" Return-path: In-Reply-To: Errors-To: alsa-devel-admin@lists.sourceforge.net List-Help: List-Post: List-Subscribe: , List-Unsubscribe: , List-Archive: To: Nick Hogle Cc: alsa-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org --Multipart_Tue_Sep_16_18:31:47_2003-1 Content-Type: text/plain; charset=US-ASCII At Tue, 16 Sep 2003 02:26:43 -0700, Nick Hogle wrote: > > I believe this is a bug: the loop in plug_alloc doesn't iterate completely > through the plugin linked list. The problem with this, is that > snd_pcm_plugin_alloc won't get called for every plugin in the list, and > vital components of those plugins won't be initialized. > > The solution would be to replace the while (plugin->next/prev) lines with > while (plugin), to move lines: plugin = plugin->next/prev to the spot just > after if (err < 0) return err; > > I found that the aformentioned changes fixed a problem I was having with > reading from /dev/dsp. Unless I set the rate to 48000, then read() would > always return 0. This was because when read_transfer iterated through the > plugins, the "rate conversion" plugin, which had not been initialized, had > the value 0 in dst_channels[0].frames. This caused the entire read call to > return 0. > > BTW, I'm using the intel8x0 driver, and the latest 0.9.6 release of > alsa-drivers. > > Anyone else agree that this is a bug? Or am I missing something, that > requires that plug_alloc to NOT iterate completely through the list? at least i agree that is a bug, but it's in the different place :) you don't need allocate the buffer for the last plugin because the last one will write to the recording buffer directly. the attached patch will fix this problem. Takashi --Multipart_Tue_Sep_16_18:31:47_2003-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="plugin-rec-fix.dif" Content-Transfer-Encoding: 7bit Index: alsa-kernel/core/oss/pcm_plugin.c =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/core/oss/pcm_plugin.c,v retrieving revision 1.15 diff -u -r1.15 pcm_plugin.c --- alsa-kernel/core/oss/pcm_plugin.c 6 Aug 2003 17:43:13 -0000 1.15 +++ alsa-kernel/core/oss/pcm_plugin.c 16 Sep 2003 16:22:45 -0000 @@ -646,6 +646,7 @@ nchannels = format->channels; snd_assert(plugin->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED || format->channels <= 1, return -ENXIO); for (channel = 0; channel < nchannels; channel++, v++) { + v->frames = count; v->enabled = 1; v->wanted = (stream == SNDRV_PCM_STREAM_CAPTURE); v->area.addr = buf; --Multipart_Tue_Sep_16_18:31:47_2003-1-- ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf