From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: Testers needed: memio-mmap patch (rme32,rme96,nm256) Date: Fri, 02 Jul 2004 14:50:22 +0200 Sender: alsa-devel-admin@lists.sourceforge.net Message-ID: References: <20040620101135.GA755@tuba.home> <20040701201326.GA567@tuba.home> Mime-Version: 1.0 (generated by SEMI 1.14.5 - "Awara-Onsen") Content-Type: multipart/mixed; boundary="Multipart_Fri_Jul__2_14:50:22_2004-1" Return-path: In-Reply-To: <20040701201326.GA567@tuba.home> Errors-To: alsa-devel-admin@lists.sourceforge.net List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , List-Archive: To: Martin Langer Cc: alsa-devel@lists.sourceforge.net, pilo.c@wanadoo.fr List-Id: alsa-devel@alsa-project.org --Multipart_Fri_Jul__2_14:50:22_2004-1 Content-Type: text/plain; charset=US-ASCII At Thu, 1 Jul 2004 22:13:26 +0200, Martin Langer wrote: > > On Thu, Jul 01, 2004 at 03:44:11PM +0200, Takashi Iwai wrote: > > At Sun, 20 Jun 2004 12:11:35 +0200, > > Martin Langer wrote: > > > > > > Ok, let's try fullduplex now... > > > > JFYI: it's now on CVS tree. > > fullduplex module option is disabled as default, though. > > For enabling fullduplex you will need the following patch, too. Oh yes, thanks ;) > FYI: The situation is that I get only silence in fullduplex_mode after a > short time. But nevertheless in the beginning it is correct. How about the attached patch? Takashi --Multipart_Fri_Jul__2_14:50:22_2004-1 Content-Type: text/plain; charset=US-ASCII Index: alsa-kernel/include/pcm-indirect.h =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/include/pcm-indirect.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- alsa-kernel/include/pcm-indirect.h 1 Jul 2004 09:17:40 -0000 1.1 +++ alsa-kernel/include/pcm-indirect.h 2 Jul 2004 12:48:27 -0000 1.2 @@ -34,7 +34,7 @@ unsigned int sw_data; /* Offset to next dst (or src) in sw ring buffer */ unsigned int sw_io; /* Current software pointer in bytes */ int sw_ready; /* Bytes ready to be transferred to/from hw */ - size_t appl_ptr; /* Last seen appl_ptr */ + snd_pcm_uframes_t appl_ptr; /* Last seen appl_ptr */ } snd_pcm_indirect_t; typedef void (*snd_pcm_indirect_copy_t)(snd_pcm_substream_t *substream, @@ -51,19 +51,19 @@ snd_pcm_runtime_t *runtime = substream->runtime; snd_pcm_uframes_t appl_ptr = runtime->control->appl_ptr; snd_pcm_sframes_t diff = appl_ptr - rec->appl_ptr; - snd_pcm_uframes_t qsize; + int qsize; if (diff) { if (diff < -(snd_pcm_sframes_t) (runtime->boundary / 2)) diff += runtime->boundary; - rec->sw_ready += frames_to_bytes(runtime, diff); + rec->sw_ready += (int)frames_to_bytes(runtime, diff); rec->appl_ptr = appl_ptr; } qsize = rec->hw_queue_size ? rec->hw_queue_size : rec->hw_buffer_size; while (rec->hw_ready < qsize && rec->sw_ready > 0) { - size_t hw_to_end = rec->hw_buffer_size - rec->hw_data; - size_t sw_to_end = rec->sw_buffer_size - rec->sw_data; - size_t bytes = rec->hw_buffer_size - rec->hw_ready; + unsigned int hw_to_end = rec->hw_buffer_size - rec->hw_data; + unsigned int sw_to_end = rec->sw_buffer_size - rec->sw_data; + unsigned int bytes = qsize - rec->hw_ready; if (rec->sw_ready < (int)bytes) bytes = rec->sw_ready; if (hw_to_end < bytes) @@ -74,7 +74,7 @@ break; copy(substream, rec, bytes); rec->hw_data += bytes; - if ((int)rec->hw_data == rec->hw_buffer_size) + if (rec->hw_data == rec->hw_buffer_size) rec->hw_data = 0; rec->sw_data += bytes; if (rec->sw_data == rec->sw_buffer_size) @@ -90,9 +90,9 @@ */ static inline snd_pcm_uframes_t snd_pcm_indirect_playback_pointer(snd_pcm_substream_t *substream, - snd_pcm_indirect_t *rec, size_t ptr) + snd_pcm_indirect_t *rec, unsigned int ptr) { - ssize_t bytes = ptr - rec->hw_io; + int bytes = ptr - rec->hw_io; if (bytes < 0) bytes += rec->hw_buffer_size; rec->hw_io = ptr; @@ -155,9 +155,9 @@ */ static inline snd_pcm_uframes_t snd_pcm_indirect_capture_pointer(snd_pcm_substream_t *substream, - snd_pcm_indirect_t *rec, size_t ptr) + snd_pcm_indirect_t *rec, unsigned int ptr) { - ssize_t bytes = ptr - rec->hw_io; + int bytes = ptr - rec->hw_io; if (bytes < 0) bytes += rec->hw_buffer_size; rec->hw_io = ptr; Index: alsa-kernel/pci/rme32.c =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/pci/rme32.c,v retrieving revision 1.40 diff -u -r1.40 rme32.c --- alsa-kernel/pci/rme32.c 1 Jul 2004 09:17:52 -0000 1.40 +++ alsa-kernel/pci/rme32.c 2 Jul 2004 11:14:58 -0000 @@ -1210,20 +1210,16 @@ snd_rme32_playback_fd_pointer(snd_pcm_substream_t * substream) { rme32_t *rme32 = snd_pcm_substream_chip(substream); - size_t ptr; - - ptr = readl(rme32->iobase + RME32_IO_GET_POS) & RME32_RCR_AUDIO_ADDR_MASK; - return snd_pcm_indirect_playback_pointer(substream, &rme32->playback_pcm, ptr); + return snd_pcm_indirect_playback_pointer(substream, &rme32->playback_pcm, + snd_rme32_pcm_byteptr(rme32)); } static snd_pcm_uframes_t snd_rme32_capture_fd_pointer(snd_pcm_substream_t * substream) { rme32_t *rme32 = snd_pcm_substream_chip(substream); - size_t ptr; - - ptr = readl(rme32->iobase + RME32_IO_GET_POS) & RME32_RCR_AUDIO_ADDR_MASK; - return snd_pcm_indirect_capture_pointer(substream, &rme32->capture_pcm, ptr); + return snd_pcm_indirect_capture_pointer(substream, &rme32->capture_pcm, + snd_rme32_pcm_byteptr(rme32)); } /* for halfduplex mode */ @@ -1990,6 +1986,8 @@ rme32->card = card; rme32->pci = pci; snd_card_set_dev(card, &pci->dev); + if (fullduplex[dev]) + rme32->fullduplex_mode = 1; if ((err = snd_rme32_create(rme32)) < 0) { snd_card_free(card); return err; --Multipart_Fri_Jul__2_14:50:22_2004-1-- ------------------------------------------------------- This SF.Net email sponsored by Black Hat Briefings & Training. Attend Black Hat Briefings & Training, Las Vegas July 24-29 - digital self defense, top technical experts, no vendor pitches, unmatched networking opportunities. Visit www.blackhat.com