[alsa-devel] [PATCH RFC 16/26] ALSA: rme32: Convert to copy_silence ops

Takashi Iwai tiwai at suse.de
Wed Jul 18 12:56:56 CEST 2018


On Wed, 18 Jul 2018 12:22:11 +0200,
René Rebe wrote:
> 
> Hello everyone,
> 
> to have another digital audio i/o card for our studio / office, I got a pair of RME32 the other week from ebay. (mostly as reference to implement ADAT for the RAD1 Sgi/Octane ALSA driver, …)
> 
> Unfortunately they do not work with Linux. They are recognised and all the usual devices and /proc/… entries show up, however, the hardware pointer does not move during playback or capture no matter what clock source I choose.
> I tried attaching coax s/pdif as well as an 8-channel Behringer Ultragain ADAT source w/ clock.

Does the /proc/asound/card*/rme32 entry show the right setup?
RME32 seems to have only few registers, and it behaves differently for
read and write.  Maybe you should try to watch the register 0x20000.
The hwptr is the LSB 33 bits.


Takashi

> The two cards came from the same seller, look ok and both behave the same. 
> I went so far to install a Windows XP test install where both cards work “more”.
> (They are not perfect in windows, however, at least s/pdif can come out with or with-out external ADAT clock source. However, the digital signal strangely unclean, but that may be a bug in the window system sound device emulation, I only tested with foobar2k and not some Pro audio app which I do not really have).
> 
> Long story short, does someone still have such a card, or not moving hardware ptr (or missing interrupts?) does ring a bell regarding this RME generation? Instead of a working ADAT reference card, I apparently have two ALSA driver to hack on, … ;-)
> 
> I tested two different “PC” boards and the results were the same, too.
> 
> Thanks,
> 	René
> 
> On 11 May 2017, at 23:09, Takashi Iwai <tiwai at suse.de> wrote:
> 
> > Replace the copy and the silence ops with the new merged ops.
> > The conversion is straightforward with standard helper functions.
> > 
> > Signed-off-by: Takashi Iwai <tiwai at suse.de>
> > ---
> > sound/pci/rme32.c | 49 ++++++++++++++++++++++++-------------------------
> > 1 file changed, 24 insertions(+), 25 deletions(-)
> > 
> > diff --git a/sound/pci/rme32.c b/sound/pci/rme32.c
> > index 96d15db65dfd..d2b4a3ef0bd3 100644
> > --- a/sound/pci/rme32.c
> > +++ b/sound/pci/rme32.c
> > @@ -253,41 +253,42 @@ static inline unsigned int snd_rme32_pcm_byteptr(struct rme32 * rme32)
> > 		& RME32_RCR_AUDIO_ADDR_MASK);
> > }
> > 
> > -/* silence callback for halfduplex mode */
> > -static int snd_rme32_playback_silence(struct snd_pcm_substream *substream, int channel,	/* not used (interleaved data) */
> > -				      snd_pcm_uframes_t pos,
> > -				      snd_pcm_uframes_t count)
> > -{
> > -	struct rme32 *rme32 = snd_pcm_substream_chip(substream);
> > -	count <<= rme32->playback_frlog;
> > -	pos <<= rme32->playback_frlog;
> > -	memset_io(rme32->iobase + RME32_IO_DATA_BUFFER + pos, 0, count);
> > -	return 0;
> > -}
> > -
> > /* copy callback for halfduplex mode */
> > -static int snd_rme32_playback_copy(struct snd_pcm_substream *substream, int channel,	/* not used (interleaved data) */
> > +static int snd_rme32_playback_copy(struct snd_pcm_substream *substream,
> > +				   int channel,	/* not used (interleaved data) */
> > 				   snd_pcm_uframes_t pos,
> > -				   void __user *src, snd_pcm_uframes_t count)
> > +				   void __user *src, snd_pcm_uframes_t count,
> > +				   bool in_kernel)
> > {
> > 	struct rme32 *rme32 = snd_pcm_substream_chip(substream);
> > 	count <<= rme32->playback_frlog;
> > 	pos <<= rme32->playback_frlog;
> > -	if (copy_from_user_toio(rme32->iobase + RME32_IO_DATA_BUFFER + pos,
> > -			    src, count))
> > +	if (!src)
> > +		memset_io(rme32->iobase + RME32_IO_DATA_BUFFER + pos, 0, count);
> > +	else if (in_kernel)
> > +		memcpy_toio(rme32->iobase + RME32_IO_DATA_BUFFER + pos,
> > +			    (void *)src, count);
> > +	else if (copy_from_user_toio(rme32->iobase + RME32_IO_DATA_BUFFER + pos,
> > +				     src, count))
> > 		return -EFAULT;
> > 	return 0;
> > }
> > 
> > /* copy callback for halfduplex mode */
> > -static int snd_rme32_capture_copy(struct snd_pcm_substream *substream, int channel,	/* not used (interleaved data) */
> > +static int snd_rme32_capture_copy(struct snd_pcm_substream *substream,
> > +				  int channel,	/* not used (interleaved data) */
> > 				  snd_pcm_uframes_t pos,
> > -				  void __user *dst, snd_pcm_uframes_t count)
> > +				  void __user *dst, snd_pcm_uframes_t count,
> > +				  bool in_kernel)
> > {
> > 	struct rme32 *rme32 = snd_pcm_substream_chip(substream);
> > 	count <<= rme32->capture_frlog;
> > 	pos <<= rme32->capture_frlog;
> > -	if (copy_to_user_fromio(dst,
> > +	if (in_kernel)
> > +		memcpy_fromio((void *)dst,
> > +			      rme32->iobase + RME32_IO_DATA_BUFFER + pos,
> > +			      count);
> > +	else if (copy_to_user_fromio(dst,
> > 			    rme32->iobase + RME32_IO_DATA_BUFFER + pos,
> > 			    count))
> > 		return -EFAULT;
> > @@ -1205,8 +1206,7 @@ static const struct snd_pcm_ops snd_rme32_playback_spdif_ops = {
> > 	.prepare =	snd_rme32_playback_prepare,
> > 	.trigger =	snd_rme32_pcm_trigger,
> > 	.pointer =	snd_rme32_playback_pointer,
> > -	.copy =		snd_rme32_playback_copy,
> > -	.silence =	snd_rme32_playback_silence,
> > +	.copy_silence =	snd_rme32_playback_copy,
> > 	.mmap =		snd_pcm_lib_mmap_iomem,
> > };
> > 
> > @@ -1219,7 +1219,7 @@ static const struct snd_pcm_ops snd_rme32_capture_spdif_ops = {
> > 	.prepare =	snd_rme32_capture_prepare,
> > 	.trigger =	snd_rme32_pcm_trigger,
> > 	.pointer =	snd_rme32_capture_pointer,
> > -	.copy =		snd_rme32_capture_copy,
> > +	.copy_silence =	snd_rme32_capture_copy,
> > 	.mmap =		snd_pcm_lib_mmap_iomem,
> > };
> > 
> > @@ -1231,8 +1231,7 @@ static const struct snd_pcm_ops snd_rme32_playback_adat_ops = {
> > 	.prepare =	snd_rme32_playback_prepare,
> > 	.trigger =	snd_rme32_pcm_trigger,
> > 	.pointer =	snd_rme32_playback_pointer,
> > -	.copy =		snd_rme32_playback_copy,
> > -	.silence =	snd_rme32_playback_silence,
> > +	.copy_silence =	snd_rme32_playback_copy,
> > 	.mmap =		snd_pcm_lib_mmap_iomem,
> > };
> > 
> > @@ -1244,7 +1243,7 @@ static const struct snd_pcm_ops snd_rme32_capture_adat_ops = {
> > 	.prepare =	snd_rme32_capture_prepare,
> > 	.trigger =	snd_rme32_pcm_trigger,
> > 	.pointer =	snd_rme32_capture_pointer,
> > -	.copy =		snd_rme32_capture_copy,
> > +	.copy_silence =	snd_rme32_capture_copy,
> > 	.mmap =		snd_pcm_lib_mmap_iomem,
> > };
> > 
> > -- 
> > 2.12.2
> > 
> > _______________________________________________
> > Alsa-devel mailing list
> > Alsa-devel at alsa-project.org
> > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 
> -- 
>  ExactCODE GmbH, Lietzenburger Str. 42, DE-10789 Berlin
>  DE Legal: Amtsgericht Berlin (Charlottenburg) HRB 105123B, Tax-ID#: DE251602478
>  Managing Director: René Rebe
>  http://exactcode.com | http://exactscan.com | http://ocrkit.com | http://t2-project.org | http://rene.rebe.de
> 


More information about the Alsa-devel mailing list