Modules: USB generic driver
Move the common packet size calculation code from
prepare_startup_playback_urb() and prepare_playback_urb() to a new
function.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Modules: USB generic driver
This is my naive attempt at adding ALSA device support. The attached
patch provides support for the EDIROL UM-3ex. This is a 3-port USB midi
interface with a built-in USB hub and the ability to chain 2 other
UM-3x's in a master-slave configuration. I only have one, so I do not
know how this works in practice.
Though this is a 3-port device, I had to throw in that 4th 'Control' interface
to the definition in order to make the 3rd port work. If I set in/out_cables
to 0x000b, a 3rd interface appears on the driver, but it does nothing.
Changing it to 0x000f allows the 3rd interface to work, but of course
interface 4 does not work because it does not exist.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Modules: USB generic driver
On the Audigy 2 ZS, disable all sample rate that are not a multiple of
48 kHz because the others work only with the digital output which is
not yet supported.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Modules: USB generic driver
Some widespread USB interface chips with adaptive iso endpoints hang
after receiving a series of empty packets when they expect data (ALSA
bug#1585). To avoid this, we have to send packets containing silence
(zero samples) instead.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Modules: USB generic driver
Somebody at Edirol fucked up and released a new revision of the UA-20
without class-specific descriptors, so now we have to hard-code the
sample format.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Something noticed when studying use of VM_RESERVED in different drivers:
snd_usX2Y_hwdep_pcm_vm_nopage omitted to get_page: fixed.
And how did this work before? Aargh! That nopage is returning a page from
within a buffer allocated by snd_malloc_pages, which allocates a high-order
page, then does SetPageReserved on each 0-order page within.
That would have worked in 2.6.14, because when the area was unmapped,
PageReserved inhibited put_page. 2.6.15-rc1 removed that inhibition (while
leaving ineffective PageReserveds around for now), but it hasn't caused
trouble because.. we've not been freeing from VM_RESERVED at all.
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Modules: USB generic driver
If we submit all our URBs when a playback stream is started, the first
hwptr_done update for each URB happens at the same time. This results
in an underrun when there isn't enough PCM data available at this
point for all URBs.
To avoid this, we begin submitting our URBs earlier (when the stream
is prepared), with empy packets. When the stream is started, the
prepare_playback_urb() call for each URB will be run only when the
respective URB has completed previously, so the first hwptr_done
updates will be done nicely staggered.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Use schedule_timeout_{,un}interruptible() instead of
set_current_state()/schedule_timeout() to reduce kernel size. Also use
human-time conversion functions instead of hard-coded division to avoid
rounding issues.
Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Modules: USB generic driver
Remove the usb_reset_configuration() call from the probe callback
because it isn't needed and it may interfere with other drivers
already loaded for the device.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
- Remove vmalloc wrapper
- Add release_and_free_resource() to remove kfree_nocheck() from each driver
and simplify the code
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Modules: USB generic driver
Move the usb_complete_callback() compatibility wrapper out of the
kernel tree.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Modules: USB generic driver
Move the usb_pipe_needs_resubmit() compatibility wrapper out of the
kernel tree.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Modules: USB generic driver
Add more comments about other device modes and unsupported devices to
the Roland part of the quirks table.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Modules: USB generic driver
Add a quirk entry for the Hercules DJ Console to ignore timeouts on
some mixer control transfers.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Modules: USB generic driver
Simplify the handling of MIDI quirks by treating an interface without
quirks as a QUIRK_MIDI_STANDARD_INTERFACE.
This also fixes the bug where a MIDI_STANDARD quirk would not be
recognized.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Add a quirk entry for the external MIDI ports of the
Windows Edition of the Hercules DJ Console.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Add a mixer quirk entry for the Hercules DJ Console (Windows Edition)
that uses a different USB product ID.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Increase the maximum PCM buffer size to 1 MB. The USB driver doesn't
have any inherent buffer size limit, and big multichannel interfaces
may benefit from this.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
There is another revision of the PHASE26 with a different product ID;
add a quirk entry for that, too.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Add a quirk entry for the Roland RD-700SX.
This should work for the RD-300SX, too.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Add a quirk entry for the Hercules DJ Console to ignore timeouts on
some mixer control transfers.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Add the SNDRV_PCM_INFO_BATCH flag to the PCM hardware information to
indicate that the driver uses double buffering.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
29 July 2005, Cambridge, MA:
This afternoon Alan Stern submitted a patch to remove the URB_ASYNC_UNLINK
flag from the Linux kernel. Mr. Stern explained, "This flag is a relic
from an earlier, less-well-designed system. For over a year it hasn't
been used for anything other than printing warning messages."
An anonymous spokesman for the Linux kernel development community
commented, "This is exactly the sort of thing we see happening all the
time. As the kernel evolves, support for old techniques and old code can
be jettisoned and replaced by newer, better approaches. Proprietary
operating systems do not have the freedom or flexibility to change so
quickly."
Mr. Stern, a staff member at Harvard University's Rowland Institute who
works on Linux only as a hobby, noted that the patch (labelled as548) did
not update two files, keyspan.c and option.c, in the USB drivers' "serial"
subdirectory. "Those files need more extensive changes," he remarked.
"They examine the status field of several URBs at times when they're not
supposed to. That will need to be fixed before the URB_ASYNC_UNLINK flag
is removed."
Greg Kroah-Hartman, the kernel maintainer responsible for overseeing all
of Linux's USB drivers, did not respond to our inquiries or return our
calls. His only comment was "Applied, thanks."
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
USB generic driver
When a USB error occurs that might indicate that the device has been
unplugged, don't resubmit the URB immediately to prevent flooding the
log with error messages before khubd has us disconnect()ed.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Emagic devices pad their packets not with 0xff bytes but with a 0xff
byte followed by garbage, so we have to stop at the first such byte.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
With the double buffering, we no longer need contiguous memory for the
PCM buffer, so we can use vmalloc() instead of the preallocation
functions, and increase the maximum size to 256 KB.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Use the USB buffer allocation functions to avoid repeated DMA mappings
of our buffers, which are re-used quite a lot.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Take the substream lock when reading hwptr_done to avoid a race
condition with the updates in the URB callbacks.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
Change prepare_playback_urb() not to stop preparing packets before a
frame boundary has been reached.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
We always had to use double buffering when capturing, and when playback
data for one URB crosses a buffer boundary. The latter would make hwptr
updates less precise because the double-buffered data is read from the
buffer much earlier than the other data is read by the host controller.
Double-buffering all data allows to update hwptr immediately after the
data was copied to the USB buffer(s), which has the additional benefit
of avoiding the latency imposed by the host controller's delay of up to
one frame when interrupting.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
When preparing capture URBs, we don't need to stop when we cross a
period boundary because we now never handle more than one millisecond of
data per URB anyway.
When handling captured data, use an extra flag to call
snd_pcm_period_elapsed() no more than once. This allows us to move the
period boundary checking code before the copying of the data which
avoids a second locking of the substream's lock.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
The EHCI driver doesn't interrupt more than once per millisecond, and
organizes all iso transfers with frame-sized ITDs, so we can (try to)
be more efficient by aligning all URBs on frame boundaries.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
The nrpacks module parameter is used only when initializing a playback
stream, so it doesn't hurt to make it writeable.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
When determining how many packets are needed for one period, we cannot
assume that all packets have their maximum size -- we always use the
nominal sample rate when sending data, and could use an even lower rate
when the endpoint uses frequency feedback.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
USB generic driver
When capturing audio data, we do not know beforehand how many samples
the device sends per frame, so we have to use URBs that are as short as
possible to make sure that we can handle period boundaries without any
additional latencies.
Furthermore, the total count of URBs submitted doesn't matter when
capturing, so we can just use the maximum number.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
PCM Midlevel,ALSA<-OSS emulation,USB USX2Y
This patch removes open_flag from struct _snd_pcm_substream.
All of its uses are substituted by querying struct _snd_pcm_substream's
member ffile instead.
Signed-off-by: Karsten Wiese <annabellesgarden@yahoo.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
USB generic driver
Make the quirk type an enum instead of a #defined integer, and use a
table for the quirk constructor functions instead of a big switch
statement.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>