Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: (348 commits) ALSA: hda - Fix NULL-derefence with a single mic in STAC auto-mic detection ALSA: hda - Add missing NID 0x19 fixup for Sony VAIO ALSA: hda - Fix ALC275 enable hardware EQ for SONY VAIO ALSA: oxygen: fix Xonar DG input ALSA: hda - Fix EAPD on Lenovo NB ALC269 to low ALSA: hda - Fix missing EAPD for Acer 4930G ALSA: hda: Disable 4/6 channels on some NVIDIA GPUs. ALSA: hda - Add static_hdmi_pcm option to HDMI codec parser ALSA: hda - Don't refer ELD when unplugged ASoC: tpa6130a2: Fix compiler warning ASoC: tlv320dac33: Add DAPM selection for LOM invert ASoC: DMIC codec: Adding a generic DMIC codec ALSA: snd-usb-us122l: Fix missing NULL checks ALSA: snd-usb-us122l: Fix MIDI output ASoC: soc-cache: Fix invalid memory access during snd_soc_lzo_cache_sync() ASoC: Fix section mismatch in wm8995.c ALSA: oxygen: add S/PDIF source selection for Claro cards ALSA: oxygen: fix CD/MIDI for X-Meridian (2G) ASoC: fix migor audio build ALSA: include delay.h for msleep in Xonar DG support ...
This commit is contained in:
@ -1488,7 +1488,7 @@ int snd_ctl_create(struct snd_card *card)
|
||||
}
|
||||
|
||||
/*
|
||||
* Frequently used control callbacks
|
||||
* Frequently used control callbacks/helpers
|
||||
*/
|
||||
int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
@ -1513,3 +1513,29 @@ int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_ctl_boolean_stereo_info);
|
||||
|
||||
/**
|
||||
* snd_ctl_enum_info - fills the info structure for an enumerated control
|
||||
* @info: the structure to be filled
|
||||
* @channels: the number of the control's channels; often one
|
||||
* @items: the number of control values; also the size of @names
|
||||
* @names: an array containing the names of all control values
|
||||
*
|
||||
* Sets all required fields in @info to their appropriate values.
|
||||
* If the control's accessibility is not the default (readable and writable),
|
||||
* the caller has to fill @info->access.
|
||||
*/
|
||||
int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels,
|
||||
unsigned int items, const char *const names[])
|
||||
{
|
||||
info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
||||
info->count = channels;
|
||||
info->value.enumerated.items = items;
|
||||
if (info->value.enumerated.item >= items)
|
||||
info->value.enumerated.item = items - 1;
|
||||
strlcpy(info->value.enumerated.name,
|
||||
names[info->value.enumerated.item],
|
||||
sizeof(info->value.enumerated.name));
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_ctl_enum_info);
|
||||
|
@ -453,8 +453,10 @@ static int snd_pcm_hw_param_near(struct snd_pcm_substream *pcm,
|
||||
} else {
|
||||
*params = *save;
|
||||
max = snd_pcm_hw_param_max(pcm, params, var, max, &maxdir);
|
||||
if (max < 0)
|
||||
if (max < 0) {
|
||||
kfree(save);
|
||||
return max;
|
||||
}
|
||||
last = 1;
|
||||
}
|
||||
_end:
|
||||
|
@ -373,6 +373,27 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
|
||||
(unsigned long)new_hw_ptr,
|
||||
(unsigned long)runtime->hw_ptr_base);
|
||||
}
|
||||
|
||||
if (runtime->no_period_wakeup) {
|
||||
/*
|
||||
* Without regular period interrupts, we have to check
|
||||
* the elapsed time to detect xruns.
|
||||
*/
|
||||
jdelta = jiffies - runtime->hw_ptr_jiffies;
|
||||
if (jdelta < runtime->hw_ptr_buffer_jiffies / 2)
|
||||
goto no_delta_check;
|
||||
hdelta = jdelta - delta * HZ / runtime->rate;
|
||||
while (hdelta > runtime->hw_ptr_buffer_jiffies / 2 + 1) {
|
||||
delta += runtime->buffer_size;
|
||||
hw_base += runtime->buffer_size;
|
||||
if (hw_base >= runtime->boundary)
|
||||
hw_base = 0;
|
||||
new_hw_ptr = hw_base + pos;
|
||||
hdelta -= runtime->hw_ptr_buffer_jiffies;
|
||||
}
|
||||
goto no_delta_check;
|
||||
}
|
||||
|
||||
/* something must be really wrong */
|
||||
if (delta >= runtime->buffer_size + runtime->period_size) {
|
||||
hw_ptr_error(substream,
|
||||
@ -442,6 +463,7 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
|
||||
(long)old_hw_ptr);
|
||||
}
|
||||
|
||||
no_delta_check:
|
||||
if (runtime->status->hw_ptr == new_hw_ptr)
|
||||
return 0;
|
||||
|
||||
|
@ -422,6 +422,9 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
runtime->info = params->info;
|
||||
runtime->rate_num = params->rate_num;
|
||||
runtime->rate_den = params->rate_den;
|
||||
runtime->no_period_wakeup =
|
||||
(params->info & SNDRV_PCM_INFO_NO_PERIOD_WAKEUP) &&
|
||||
(params->flags & SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP);
|
||||
|
||||
bits = snd_pcm_format_physical_width(runtime->format);
|
||||
runtime->sample_bits = bits;
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "seq_timer.h"
|
||||
#include "seq_system.h"
|
||||
#include "seq_info.h"
|
||||
#include <sound/minors.h>
|
||||
#include <sound/seq_device.h>
|
||||
|
||||
#if defined(CONFIG_SND_SEQ_DUMMY_MODULE)
|
||||
@ -73,6 +74,9 @@ MODULE_PARM_DESC(seq_default_timer_subdevice, "The default timer subdevice numbe
|
||||
module_param(seq_default_timer_resolution, int, 0644);
|
||||
MODULE_PARM_DESC(seq_default_timer_resolution, "The default timer resolution in Hz.");
|
||||
|
||||
MODULE_ALIAS_CHARDEV(CONFIG_SND_MAJOR, SNDRV_MINOR_SEQUENCER);
|
||||
MODULE_ALIAS("devname:snd/seq");
|
||||
|
||||
/*
|
||||
* INIT PART
|
||||
*/
|
||||
|
@ -188,14 +188,22 @@ static const struct file_operations snd_fops =
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SND_DYNAMIC_MINORS
|
||||
static int snd_find_free_minor(void)
|
||||
static int snd_find_free_minor(int type)
|
||||
{
|
||||
int minor;
|
||||
|
||||
/* static minors for module auto loading */
|
||||
if (type == SNDRV_DEVICE_TYPE_SEQUENCER)
|
||||
return SNDRV_MINOR_SEQUENCER;
|
||||
if (type == SNDRV_DEVICE_TYPE_TIMER)
|
||||
return SNDRV_MINOR_TIMER;
|
||||
|
||||
for (minor = 0; minor < ARRAY_SIZE(snd_minors); ++minor) {
|
||||
/* skip minors still used statically for autoloading devices */
|
||||
if (SNDRV_MINOR_DEVICE(minor) == SNDRV_MINOR_CONTROL ||
|
||||
minor == SNDRV_MINOR_SEQUENCER)
|
||||
/* skip static minors still used for module auto loading */
|
||||
if (SNDRV_MINOR_DEVICE(minor) == SNDRV_MINOR_CONTROL)
|
||||
continue;
|
||||
if (minor == SNDRV_MINOR_SEQUENCER ||
|
||||
minor == SNDRV_MINOR_TIMER)
|
||||
continue;
|
||||
if (!snd_minors[minor])
|
||||
return minor;
|
||||
@ -269,7 +277,7 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev,
|
||||
preg->private_data = private_data;
|
||||
mutex_lock(&sound_mutex);
|
||||
#ifdef CONFIG_SND_DYNAMIC_MINORS
|
||||
minor = snd_find_free_minor();
|
||||
minor = snd_find_free_minor(type);
|
||||
#else
|
||||
minor = snd_kernel_minor(type, card, dev);
|
||||
if (minor >= 0 && snd_minors[minor])
|
||||
|
@ -34,8 +34,8 @@
|
||||
#include <sound/initval.h>
|
||||
#include <linux/kmod.h>
|
||||
|
||||
#if defined(CONFIG_SND_HPET) || defined(CONFIG_SND_HPET_MODULE)
|
||||
#define DEFAULT_TIMER_LIMIT 3
|
||||
#if defined(CONFIG_SND_HRTIMER) || defined(CONFIG_SND_HRTIMER_MODULE)
|
||||
#define DEFAULT_TIMER_LIMIT 4
|
||||
#elif defined(CONFIG_SND_RTCTIMER) || defined(CONFIG_SND_RTCTIMER_MODULE)
|
||||
#define DEFAULT_TIMER_LIMIT 2
|
||||
#else
|
||||
@ -52,6 +52,9 @@ MODULE_PARM_DESC(timer_limit, "Maximum global timers in system.");
|
||||
module_param(timer_tstamp_monotonic, int, 0444);
|
||||
MODULE_PARM_DESC(timer_tstamp_monotonic, "Use posix monotonic clock source for timestamps (default).");
|
||||
|
||||
MODULE_ALIAS_CHARDEV(CONFIG_SND_MAJOR, SNDRV_MINOR_TIMER);
|
||||
MODULE_ALIAS("devname:snd/timer");
|
||||
|
||||
struct snd_timer_user {
|
||||
struct snd_timer_instance *timeri;
|
||||
int tread; /* enhanced read with timestamps and events */
|
||||
|
Reference in New Issue
Block a user