mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Bryan Wu" <cooloney@kernel.org>
To: "Takashi Iwai" <tiwai@suse.de>
Cc: "ALSA devel" <alsa-devel@alsa-project.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [Question] Can I open a substream in kernel space without attach to a file pointer?
Date: Thu, 11 Dec 2008 21:19:21 +0800	[thread overview]
Message-ID: <386072610812110519j78aa8971ga37635658741b021@mail.gmail.com> (raw)
In-Reply-To: <s5hoczidimg.wl%tiwai@suse.de>

On Thu, Dec 11, 2008 at 8:03 PM, Takashi Iwai <tiwai@suse.de> wrote:
> At Thu, 11 Dec 2008 18:40:38 +0800,
> Bryan Wu wrote:
>>
>> Hi Takashi,
>>
>> I just made some progress about this USB audio gadget driver. But I
>> still got some questions about the audio playback.
>> Please kindly help me to work out here, as you're the best one to ask, -:)
>>
>> I can receive ISO transfer packets from PC host. The packet includes
>> 192 bytes audio data.
>> So I tried to use vfs_write() function to write this 192 bytes to the
>> opened snd card.
>> There is no sound.
>>
>> Then I create a buffer which is 6K bytes size and a workqueue. I will
>> fill the 6K buffer with the ISO packets data.
>> When the 6K buffer is full, in the workqueue handler I will call
>> vfs_write() function to write these 6K bytes data to the sound card.
>> This time, sound played and it works although it is not very smooth.
>>
>> So I guess the audio buffer I great is very important to playback audio.
>> How to choose the buffer size? If the size < 6K, there is no sound.
>> I guess it depends on the sound card hardware, but I failed to find
>> any info from hw_params and sw_params.
>
> Well, this pretty much depends on the "sound card" you are accessing.
> You mentioned about AD1980 but the question is rather what
> controller is used.  The codec chip is basically independent from the
> DMA transfer parameter.
>

Right, currently I'm trying AD1980 which using DMA transfer by
Blackfin BF54x processor.

>> Actually, I want to remove the audio buffer here, just write the 192
>> audio data to sound card directly. Is that possible?
>
> Also depends on the hardware.  If the audio chip requires the DMA
> transfer, you'd need anyway a buffer.
>

So how to determine the buffer size based on the DMA hardware configuration?
I tried to change the period_size and buffer_size of the runtime struct.
It also didn't work.

Thanks a lot
-Bryan

>
> Takashi
>
>>
>> Thanks a lot.
>> -Bryan
>>
>>
>> On Thu, Nov 20, 2008 at 12:01 AM, Takashi Iwai <tiwai@suse.de> wrote:
>> > At Wed, 19 Nov 2008 23:42:48 +0800,
>> > Bryan Wu wrote:
>> >>
>> >> On Wed, Nov 19, 2008 at 9:49 PM, Takashi Iwai <tiwai@suse.de> wrote:
>> >> > At Wed, 19 Nov 2008 18:00:36 +0800,
>> >> > Bryan Wu wrote:
>> >> >>
>> >> >> Hi Takashi,
>> >> >>
>> >> >> I am developing a USB gadget driver compliant to USB Audio Class Spec 2.0.
>> >> >> So I want to open a PCM substream and do some playback of capture,
>> >> >> then close them?
>> >> >>
>> >> >> I found snd_pcm_open_substream() is for opening a substream and attach
>> >> >> it to a file.
>> >> >> But in my application, there is no need to open a file before opening
>> >> >> a substream.
>> >> >>
>> >> >> - Is there any interface for me to open a substream in kernel space
>> >> >> without attach to a file?
>> >> >> - How to playback and capture in kernel space, use snd_pcm_lib_write
>> >> >> and snd_pcm_lib_read?
>> >> >> - How to get the snd_pcm_hardware struct from low level driver,
>> >> >> because I have to get the hardware configuration of the snd pcm
>> >> >> device?
>> >> >>
>> >> >> And I am reading the code of OSS emulator in ALSA. It provides some
>> >> >> info about the kernel space sound card programming.
>> >> >
>> >> > Yes, OSS emulation code handles the PCM in the kernel.
>> >> > But, basically I don't recommend you to do this -- it's not the job of
>> >> > the sound card driver.  The whole PCM stuff is handled by the PCM
>> >> > middle layer, not the driver itself.
>> >>
>> >> No, my plan is not a sound card driver. It is an USB gadget audio driver.
>> >> When an embedded system for example Blackfin board connects to a USB host (PC),
>> >> PC will recognize this USB device as a USB Audio Class device.
>> >>
>> >> Generally, there should be a sound card on the embedded system. Our
>> >> Blackfin board
>> >> has an AD1980 ALSA sound card. The USB gadget audio driver will open this sound
>> >> card and export this device to USB host PC by some USB audio class specific
>> >> descriptors. Then the PC can playback some audio stream by USB cable, USB gadget
>> >> audio driver will receive this stream and playback the data by AD1980
>> >> ALSA playback
>> >> substream. Capture is the similar.
>> >>
>> >> > Any reason why you handle the PCM stuff completely in your driver
>> >> > code?
>> >> >
>> >>
>> >> There is USB gadget MIDI driver in kernel. But it asked the user to
>> >> use aconnect tool to
>> >> connect the virtual MIDI card to a real one. I don't want travel to
>> >> user space and it should
>> >> be more efficient in kernel space to handle all things including PCM
>> >> open/release/read/write
>> >> and Mixer control.
>> >>
>> >> Any hints about this? I really need some help from ALSA guru, cause
>> >> I'm not familiar the internal
>> >> things here.
>> >
>> > Well, the access in the kernel space is fairly similar as in the user
>> > space.  It opens, issues ioctls, reads and writes.  The difference is
>> > that you access via dedicated function calls instead of syscalls.
>> > There is no way to poke the driver internal from other drivers.
>> > To answer your questions...
>> >
>> >> >> - Is there any interface for me to open a substream in kernel space
>> >> >> without attach to a file?
>> >
>> > No.
>> >
>> >> >> - How to playback and capture in kernel space, use snd_pcm_lib_write
>> >> >> and snd_pcm_lib_read?
>> >
>> > Yes.  But for the kernel space buffer, you'd need to fake the
>> > user-space pointer by snd_enter_user() and snd_leave_user().  See
>> > snd_pcm_oss_write3().
>> >
>> >> >> - How to get the snd_pcm_hardware struct from low level driver,
>> >> >> because I have to get the hardware configuration of the snd pcm
>> >> >> device?
>> >
>> > Not way to peek/poke the driver internals from the outside.
>> > You'll need to negotiate via snd_pcm_kernel_ioctl() like user-space
>> > programs.
>> >
>> >
>> > HTH,
>> >
>> > Takashi
>> >
>>
>

  reply	other threads:[~2008-12-11 13:19 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-19 10:00 Bryan Wu
2008-11-19 13:49 ` Takashi Iwai
2008-11-19 15:42   ` Bryan Wu
2008-11-19 16:01     ` Takashi Iwai
2008-11-20  6:27       ` Bryan Wu
2008-12-11 10:40       ` Bryan Wu
2008-12-11 12:03         ` Takashi Iwai
2008-12-11 13:19           ` Bryan Wu [this message]
2008-12-11 13:24             ` Takashi Iwai
2008-12-11 14:12               ` Bryan Wu
2008-12-12  6:59                 ` [alsa-devel] " Takashi Iwai
2008-12-12  8:49                   ` Bryan Wu
2008-12-12  9:07                     ` Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=386072610812110519j78aa8971ga37635658741b021@mail.gmail.com \
    --to=cooloney@kernel.org \
    --cc=alsa-devel@alsa-project.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®