mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
Merge branch 'linus' of master.kernel.org:/pub/scm/linux/kernel/git/perex/alsa
* 'linus' of master.kernel.org:/pub/scm/linux/kernel/git/perex/alsa: (264 commits) [ALSA] version 1.0.15 [ALSA] Fix thinko in cs4231 mce down check [ALSA] sun-cs4231: improved waiting after MCE down [ALSA] sun-cs4231: use cs4231-regs.h [ALSA] This simplifies and fixes waiting loops of the mce_down() [ALSA] This patch adds support for a wavetable chip on [ALSA] This patch removes open_mutex from the ad1848-lib as [ALSA] fix bootup crash in snd_gus_interrupt() [ALSA] hda-codec - Fix SKU ID function for realtek codecs [ALSA] Support ASUS P701 eeepc [0x1043 0x82a1] support [ALSA] hda-codec - Add array terminator for dmic in STAC codec [ALSA] hdsp - Fix zero division [ALSA] usb-audio - Fix double comment [ALSA] hda-codec - Fix STAC922x volume knob control [ALSA] Changed Jaroslav Kysela's e-mail from perex@suse.cz to perex@perex.cz [ALSA] hda-codec - Fix for Fujitsu Lifebook C1410 [ALSA] mpu-401: remove MPU401_INFO_UART_ONLY flag [ALSA] mpu-401: do not require an ACK byte for the ENTER_UART command [ALSA] via82xx - Add DXS quirk for Shuttle AK31v2 [ALSA] hda-codec - Fix input_mux numbers for vaio stac92xx ...
This commit is contained in:
commit
fc8a327db6
370 changed files with 11195 additions and 5980 deletions
2
CREDITS
2
CREDITS
|
@ -1933,7 +1933,7 @@ M: seasons@makosteszta.sote.hu
|
||||||
D: Original author of software suspend
|
D: Original author of software suspend
|
||||||
|
|
||||||
N: Jaroslav Kysela
|
N: Jaroslav Kysela
|
||||||
E: perex@suse.cz
|
E: perex@perex.cz
|
||||||
W: http://www.perex.cz
|
W: http://www.perex.cz
|
||||||
D: Original Author and Maintainer for HP 10/100 Mbit Network Adapters
|
D: Original Author and Maintainer for HP 10/100 Mbit Network Adapters
|
||||||
D: ISA PnP
|
D: ISA PnP
|
||||||
|
|
|
@ -365,13 +365,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
Module snd-cmipci
|
Module snd-cmipci
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Module for C-Media CMI8338 and 8738 PCI sound cards.
|
Module for C-Media CMI8338/8738/8768/8770 PCI sound cards.
|
||||||
|
|
||||||
mpu_port - 0x300,0x310,0x320,0x330 = legacy port,
|
mpu_port - port address of MIDI interface (8338 only):
|
||||||
1 = integrated PCI port,
|
0x300,0x310,0x320,0x330 = legacy port,
|
||||||
0 = disable (default)
|
0 = disable (default)
|
||||||
fm_port - 0x388 = legacy port,
|
fm_port - port address of OPL-3 FM synthesizer (8x38 only):
|
||||||
1 = integrated PCI port (default),
|
0x388 = legacy port,
|
||||||
|
1 = integrated PCI port (default on 8738),
|
||||||
0 = disable
|
0 = disable
|
||||||
soft_ac3 - Software-conversion of raw SPDIF packets (model 033 only)
|
soft_ac3 - Software-conversion of raw SPDIF packets (model 033 only)
|
||||||
(default = 1)
|
(default = 1)
|
||||||
|
@ -768,6 +769,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
single_cmd - Use single immediate commands to communicate with
|
single_cmd - Use single immediate commands to communicate with
|
||||||
codecs (for debugging only)
|
codecs (for debugging only)
|
||||||
enable_msi - Enable Message Signaled Interrupt (MSI) (default = off)
|
enable_msi - Enable Message Signaled Interrupt (MSI) (default = off)
|
||||||
|
power_save - Automatic power-saving timtout (in second, 0 =
|
||||||
|
disable)
|
||||||
|
power_save_controller - Reset HD-audio controller in power-saving mode
|
||||||
|
(default = on)
|
||||||
|
|
||||||
This module supports one card and autoprobe.
|
This module supports one card and autoprobe.
|
||||||
|
|
||||||
|
@ -828,6 +833,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
|
|
||||||
ALC268
|
ALC268
|
||||||
3stack 3-stack model
|
3stack 3-stack model
|
||||||
|
toshiba Toshiba A205
|
||||||
|
acer Acer laptops
|
||||||
auto auto-config reading BIOS (default)
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
ALC662
|
ALC662
|
||||||
|
@ -842,7 +849,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
3stack-dig 3-jack with SPDIF I/O
|
3stack-dig 3-jack with SPDIF I/O
|
||||||
6stack-dig 6-jack digital with SPDIF I/O
|
6stack-dig 6-jack digital with SPDIF I/O
|
||||||
arima Arima W820Di1
|
arima Arima W820Di1
|
||||||
|
targa Targa T8, MSI-1049 T8
|
||||||
|
asus-a7j ASUS A7J
|
||||||
|
asus-a7m ASUS A7M
|
||||||
macpro MacPro support
|
macpro MacPro support
|
||||||
|
mbp3 Macbook Pro rev3
|
||||||
imac24 iMac 24'' with jack detection
|
imac24 iMac 24'' with jack detection
|
||||||
w2jc ASUS W2JC
|
w2jc ASUS W2JC
|
||||||
auto auto-config reading BIOS (default)
|
auto auto-config reading BIOS (default)
|
||||||
|
@ -854,6 +865,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
3stack-6ch-dig 3-jack 6-channel with SPDIF I/O
|
3stack-6ch-dig 3-jack 6-channel with SPDIF I/O
|
||||||
6stack-dig-demo 6-jack digital for Intel demo board
|
6stack-dig-demo 6-jack digital for Intel demo board
|
||||||
acer Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)
|
acer Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)
|
||||||
|
acer-aspire Acer Aspire 9810
|
||||||
medion Medion Laptops
|
medion Medion Laptops
|
||||||
medion-md2 Medion MD2
|
medion-md2 Medion MD2
|
||||||
targa-dig Targa/MSI
|
targa-dig Targa/MSI
|
||||||
|
@ -862,6 +874,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
lenovo-101e Lenovo 101E
|
lenovo-101e Lenovo 101E
|
||||||
lenovo-nb0763 Lenovo NB0763
|
lenovo-nb0763 Lenovo NB0763
|
||||||
lenovo-ms7195-dig Lenovo MS7195
|
lenovo-ms7195-dig Lenovo MS7195
|
||||||
|
haier-w66 Haier W66
|
||||||
6stack-hp HP machines with 6stack (Nettle boards)
|
6stack-hp HP machines with 6stack (Nettle boards)
|
||||||
3stack-hp HP machines with 3stack (Lucknow, Samba boards)
|
3stack-hp HP machines with 3stack (Lucknow, Samba boards)
|
||||||
auto auto-config reading BIOS (default)
|
auto auto-config reading BIOS (default)
|
||||||
|
@ -885,6 +898,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
3stack-660-digout 3-jack with SPDIF OUT (for ALC660VD)
|
3stack-660-digout 3-jack with SPDIF OUT (for ALC660VD)
|
||||||
lenovo Lenovo 3000 C200
|
lenovo Lenovo 3000 C200
|
||||||
dallas Dallas laptops
|
dallas Dallas laptops
|
||||||
|
hp HP TX1000
|
||||||
auto auto-config reading BIOS (default)
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
CMI9880
|
CMI9880
|
||||||
|
@ -920,6 +934,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
3stack 3-stack, shared surrounds
|
3stack 3-stack, shared surrounds
|
||||||
laptop 2-channel only (FSC V2060, Samsung M50)
|
laptop 2-channel only (FSC V2060, Samsung M50)
|
||||||
laptop-eapd 2-channel with EAPD (Samsung R65, ASUS A6J)
|
laptop-eapd 2-channel with EAPD (Samsung R65, ASUS A6J)
|
||||||
|
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
||||||
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
||||||
|
|
||||||
AD1988
|
AD1988
|
||||||
|
@ -945,14 +960,30 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
can be adjusted. Appearing only when compiled with
|
can be adjusted. Appearing only when compiled with
|
||||||
$CONFIG_SND_DEBUG=y
|
$CONFIG_SND_DEBUG=y
|
||||||
|
|
||||||
STAC9200/9205/9254
|
STAC9200
|
||||||
ref Reference board
|
ref Reference board
|
||||||
|
dell-d21 Dell (unknown)
|
||||||
|
dell-d22 Dell (unknown)
|
||||||
|
dell-d23 Dell (unknown)
|
||||||
|
dell-m21 Dell Inspiron 630m, Dell Inspiron 640m
|
||||||
|
dell-m22 Dell Latitude D620, Dell Latitude D820
|
||||||
|
dell-m23 Dell XPS M1710, Dell Precision M90
|
||||||
|
dell-m24 Dell Latitude 120L
|
||||||
|
dell-m25 Dell Inspiron E1505n
|
||||||
|
dell-m26 Dell Inspiron 1501
|
||||||
|
dell-m27 Dell Inspiron E1705/9400
|
||||||
|
gateway Gateway laptops with EAPD control
|
||||||
|
|
||||||
|
STAC9205/9254
|
||||||
|
ref Reference board
|
||||||
|
dell-m42 Dell (unknown)
|
||||||
|
dell-m43 Dell Precision
|
||||||
|
dell-m44 Dell Inspiron
|
||||||
|
|
||||||
STAC9220/9221
|
STAC9220/9221
|
||||||
ref Reference board
|
ref Reference board
|
||||||
3stack D945 3stack
|
3stack D945 3stack
|
||||||
5stack D945 5stack + SPDIF
|
5stack D945 5stack + SPDIF
|
||||||
dell Dell XPS M1210
|
|
||||||
intel-mac-v1 Intel Mac Type 1
|
intel-mac-v1 Intel Mac Type 1
|
||||||
intel-mac-v2 Intel Mac Type 2
|
intel-mac-v2 Intel Mac Type 2
|
||||||
intel-mac-v3 Intel Mac Type 3
|
intel-mac-v3 Intel Mac Type 3
|
||||||
|
@ -964,6 +995,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
||||||
imac-intel Intel iMac (eq. type 2)
|
imac-intel Intel iMac (eq. type 2)
|
||||||
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
||||||
|
dell-d81 Dell (unknown)
|
||||||
|
dell-d82 Dell (unknown)
|
||||||
|
dell-m81 Dell (unknown)
|
||||||
|
dell-m82 Dell XPS M1210
|
||||||
|
|
||||||
STAC9202/9250/9251
|
STAC9202/9250/9251
|
||||||
ref Reference board, base config
|
ref Reference board, base config
|
||||||
|
@ -975,6 +1010,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
ref Reference board
|
ref Reference board
|
||||||
3stack D965 3stack
|
3stack D965 3stack
|
||||||
5stack D965 5stack + SPDIF
|
5stack D965 5stack + SPDIF
|
||||||
|
dell-3stack Dell Dimension E520
|
||||||
|
|
||||||
STAC9872
|
STAC9872
|
||||||
vaio Setup for VAIO FE550G/SZ110
|
vaio Setup for VAIO FE550G/SZ110
|
||||||
|
@ -989,6 +1025,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
subsystem ID (output of "lspci -nv") to ALSA BTS or alsa-devel
|
subsystem ID (output of "lspci -nv") to ALSA BTS or alsa-devel
|
||||||
ML (see the section "Links and Addresses").
|
ML (see the section "Links and Addresses").
|
||||||
|
|
||||||
|
power_save and power_save_controller options are for power-saving
|
||||||
|
mode. See powersave.txt for details.
|
||||||
|
|
||||||
Note 2: If you get click noises on output, try the module option
|
Note 2: If you get click noises on output, try the module option
|
||||||
position_fix=1 or 2. position_fix=1 will use the SD_LPIB
|
position_fix=1 or 2. position_fix=1 will use the SD_LPIB
|
||||||
register value without FIFO size correction as the current
|
register value without FIFO size correction as the current
|
||||||
|
@ -1349,7 +1388,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
port - port number or -1 (disable)
|
port - port number or -1 (disable)
|
||||||
irq - IRQ number or -1 (disable)
|
irq - IRQ number or -1 (disable)
|
||||||
pnp - PnP detection - 0 = disable, 1 = enable (default)
|
pnp - PnP detection - 0 = disable, 1 = enable (default)
|
||||||
uart_enter - Issue UART_ENTER command at open - bool, default = on
|
|
||||||
|
|
||||||
This module supports multiple devices and PnP.
|
This module supports multiple devices and PnP.
|
||||||
|
|
||||||
|
@ -1630,6 +1668,21 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
|
|
||||||
The power-management is supported.
|
The power-management is supported.
|
||||||
|
|
||||||
|
Module snd-sc6000
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Module for Gallant SC-6000 soundcard.
|
||||||
|
|
||||||
|
port - Port # (0x220 or 0x240)
|
||||||
|
mss_port - MSS Port # (0x530 or 0xe80)
|
||||||
|
irq - IRQ # (5,7,9,10,11)
|
||||||
|
mpu_irq - MPU-401 IRQ # (5,7,9,10) ,0 - no MPU-401 irq
|
||||||
|
dma - DMA # (1,3,0)
|
||||||
|
|
||||||
|
This module supports multiple cards.
|
||||||
|
|
||||||
|
This card is also known as Audio Excel DSP 16 or Zoltrix AV302.
|
||||||
|
|
||||||
Module snd-sgalaxy
|
Module snd-sgalaxy
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
@ -1650,9 +1703,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
Module for ENSONIQ SoundScape PnP cards.
|
Module for ENSONIQ SoundScape PnP cards.
|
||||||
|
|
||||||
port - Port # (PnP setup)
|
port - Port # (PnP setup)
|
||||||
|
wss_port - WSS Port # (PnP setup)
|
||||||
irq - IRQ # (PnP setup)
|
irq - IRQ # (PnP setup)
|
||||||
mpu_irq - MPU-401 IRQ # (PnP setup)
|
mpu_irq - MPU-401 IRQ # (PnP setup)
|
||||||
dma - DMA # (PnP setup)
|
dma - DMA # (PnP setup)
|
||||||
|
dma2 - 2nd DMA # (PnP setup, -1 to disable)
|
||||||
|
|
||||||
This module supports multiple cards. ISA PnP must be enabled.
|
This module supports multiple cards. ISA PnP must be enabled.
|
||||||
You need sscape_ctl tool in alsa-tools package for loading
|
You need sscape_ctl tool in alsa-tools package for loading
|
||||||
|
@ -1697,8 +1752,52 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
dma2 - DMA2 # for CS4232 PCM interface.
|
dma2 - DMA2 # for CS4232 PCM interface.
|
||||||
isapnp - ISA PnP detection - 0 = disable, 1 = enable (default)
|
isapnp - ISA PnP detection - 0 = disable, 1 = enable (default)
|
||||||
|
|
||||||
|
The below are options for wavefront_synth features:
|
||||||
|
wf_raw - Assume that we need to boot the OS (default:no)
|
||||||
|
If yes, then during driver loading, the state of the board is
|
||||||
|
ignored, and we reset the board and load the firmware anyway.
|
||||||
|
fx_raw - Assume that the FX process needs help (default:yes)
|
||||||
|
If false, we'll leave the FX processor in whatever state it is
|
||||||
|
when the driver is loaded. The default is to download the
|
||||||
|
microprogram and associated coefficients to set it up for
|
||||||
|
"default" operation, whatever that means.
|
||||||
|
debug_default - Debug parameters for card initialization
|
||||||
|
wait_usecs - How long to wait without sleeping, usecs
|
||||||
|
(default:150)
|
||||||
|
This magic number seems to give pretty optimal throughput
|
||||||
|
based on my limited experimentation.
|
||||||
|
If you want to play around with it and find a better value, be
|
||||||
|
my guest. Remember, the idea is to get a number that causes us
|
||||||
|
to just busy wait for as many WaveFront commands as possible,
|
||||||
|
without coming up with a number so large that we hog the whole
|
||||||
|
CPU.
|
||||||
|
Specifically, with this number, out of about 134,000 status
|
||||||
|
waits, only about 250 result in a sleep.
|
||||||
|
sleep_interval - How long to sleep when waiting for reply
|
||||||
|
(default: 100)
|
||||||
|
sleep_tries - How many times to try sleeping during a wait
|
||||||
|
(default: 50)
|
||||||
|
ospath - Pathname to processed ICS2115 OS firmware
|
||||||
|
(default:wavefront.os)
|
||||||
|
The path name of the ISC2115 OS firmware. In the recent
|
||||||
|
version, it's handled via firmware loader framework, so it
|
||||||
|
must be installed in the proper path, typically,
|
||||||
|
/lib/firmware.
|
||||||
|
reset_time - How long to wait for a reset to take effect
|
||||||
|
(default:2)
|
||||||
|
ramcheck_time - How many seconds to wait for the RAM test
|
||||||
|
(default:20)
|
||||||
|
osrun_time - How many seconds to wait for the ICS2115 OS
|
||||||
|
(default:10)
|
||||||
|
|
||||||
This module supports multiple cards and ISA PnP.
|
This module supports multiple cards and ISA PnP.
|
||||||
|
|
||||||
|
Note: the firmware file "wavefront.os" was located in the earlier
|
||||||
|
version in /etc. Now it's loaded via firmware loader, and
|
||||||
|
must be in the proper firmware path, such as /lib/firmware.
|
||||||
|
Copy (or symlink) the file appropriately if you get an error
|
||||||
|
regarding firmware downloading after upgrading the kernel.
|
||||||
|
|
||||||
Module snd-sonicvibes
|
Module snd-sonicvibes
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Brief Notes on C-Media 8738/8338 Driver
|
Brief Notes on C-Media 8338/8738/8768/8770 Driver
|
||||||
=======================================
|
=================================================
|
||||||
|
|
||||||
Takashi Iwai <tiwai@suse.de>
|
Takashi Iwai <tiwai@suse.de>
|
||||||
|
|
||||||
|
@ -209,10 +209,13 @@ In addition to the standard SB mixer, CM8x38 provides more functions.
|
||||||
MIDI CONTROLLER
|
MIDI CONTROLLER
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
The MPU401-UART interface is disabled as default. You need to set
|
With CMI8338 chips, the MPU401-UART interface is disabled as default.
|
||||||
module option "mpu_port" with a valid I/O port address to enable the
|
You need to set the module option "mpu_port" to a valid I/O port address
|
||||||
MIDI support. The valid I/O ports are 0x300, 0x310, 0x320 and 0x330.
|
to enable MIDI support. Valid I/O ports are 0x300, 0x310, 0x320 and
|
||||||
Choose the value which doesn't conflict with other cards.
|
0x330. Choose a value that doesn't conflict with other cards.
|
||||||
|
|
||||||
|
With CMI8738 and newer chips, the MIDI interface is enabled by default
|
||||||
|
and the driver automatically chooses a port address.
|
||||||
|
|
||||||
There is _no_ hardware wavetable function on this chip (except for
|
There is _no_ hardware wavetable function on this chip (except for
|
||||||
OPL3 synth below).
|
OPL3 synth below).
|
||||||
|
@ -230,6 +233,8 @@ Set "fm_port" module option for more cards.
|
||||||
The output quality of FM OPL/3 is, however, very weird.
|
The output quality of FM OPL/3 is, however, very weird.
|
||||||
I don't know why..
|
I don't know why..
|
||||||
|
|
||||||
|
CMI8768 and newer chips do not have the FM synth.
|
||||||
|
|
||||||
|
|
||||||
Joystick and Modem
|
Joystick and Modem
|
||||||
------------------
|
------------------
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
||||||
<date>November 17, 2005</date>
|
<date>September 10, 2007</date>
|
||||||
<edition>0.3.6</edition>
|
<edition>0.3.7</edition>
|
||||||
|
|
||||||
<abstract>
|
<abstract>
|
||||||
<para>
|
<para>
|
||||||
|
@ -405,8 +405,9 @@
|
||||||
/* definition of the chip-specific record */
|
/* definition of the chip-specific record */
|
||||||
struct mychip {
|
struct mychip {
|
||||||
struct snd_card *card;
|
struct snd_card *card;
|
||||||
// rest of implementation will be in the section
|
/* rest of implementation will be in the section
|
||||||
// "PCI Resource Managements"
|
* "PCI Resource Managements"
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
/* chip-specific destructor
|
/* chip-specific destructor
|
||||||
|
@ -414,7 +415,7 @@
|
||||||
*/
|
*/
|
||||||
static int snd_mychip_free(struct mychip *chip)
|
static int snd_mychip_free(struct mychip *chip)
|
||||||
{
|
{
|
||||||
.... // will be implemented later...
|
.... /* will be implemented later... */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* component-destructor
|
/* component-destructor
|
||||||
|
@ -440,8 +441,9 @@
|
||||||
|
|
||||||
*rchip = NULL;
|
*rchip = NULL;
|
||||||
|
|
||||||
// check PCI availability here
|
/* check PCI availability here
|
||||||
// (see "PCI Resource Managements")
|
* (see "PCI Resource Managements")
|
||||||
|
*/
|
||||||
....
|
....
|
||||||
|
|
||||||
/* allocate a chip-specific data with zero filled */
|
/* allocate a chip-specific data with zero filled */
|
||||||
|
@ -451,12 +453,13 @@
|
||||||
|
|
||||||
chip->card = card;
|
chip->card = card;
|
||||||
|
|
||||||
// rest of initialization here; will be implemented
|
/* rest of initialization here; will be implemented
|
||||||
// later, see "PCI Resource Managements"
|
* later, see "PCI Resource Managements"
|
||||||
|
*/
|
||||||
....
|
....
|
||||||
|
|
||||||
if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL,
|
err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
|
||||||
chip, &ops)) < 0) {
|
if (err < 0) {
|
||||||
snd_mychip_free(chip);
|
snd_mychip_free(chip);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -490,7 +493,8 @@
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* (3) */
|
/* (3) */
|
||||||
if ((err = snd_mychip_create(card, pci, &chip)) < 0) {
|
err = snd_mychip_create(card, pci, &chip);
|
||||||
|
if (err < 0) {
|
||||||
snd_card_free(card);
|
snd_card_free(card);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -502,10 +506,11 @@
|
||||||
card->shortname, chip->ioport, chip->irq);
|
card->shortname, chip->ioport, chip->irq);
|
||||||
|
|
||||||
/* (5) */
|
/* (5) */
|
||||||
.... // implemented later
|
.... /* implemented later */
|
||||||
|
|
||||||
/* (6) */
|
/* (6) */
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
err = snd_card_register(card);
|
||||||
|
if (err < 0) {
|
||||||
snd_card_free(card);
|
snd_card_free(card);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -605,7 +610,8 @@
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
struct mychip *chip;
|
struct mychip *chip;
|
||||||
....
|
....
|
||||||
if ((err = snd_mychip_create(card, pci, &chip)) < 0) {
|
err = snd_mychip_create(card, pci, &chip);
|
||||||
|
if (err < 0) {
|
||||||
snd_card_free(card);
|
snd_card_free(card);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -666,7 +672,8 @@
|
||||||
<informalexample>
|
<informalexample>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
err = snd_card_register(card);
|
||||||
|
if (err < 0) {
|
||||||
snd_card_free(card);
|
snd_card_free(card);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -1091,7 +1098,7 @@
|
||||||
static int snd_mychip_free(struct mychip *chip)
|
static int snd_mychip_free(struct mychip *chip)
|
||||||
{
|
{
|
||||||
/* disable hardware here if any */
|
/* disable hardware here if any */
|
||||||
.... // (not implemented in this document)
|
.... /* (not implemented in this document) */
|
||||||
|
|
||||||
/* release the irq */
|
/* release the irq */
|
||||||
if (chip->irq >= 0)
|
if (chip->irq >= 0)
|
||||||
|
@ -1119,7 +1126,8 @@
|
||||||
*rchip = NULL;
|
*rchip = NULL;
|
||||||
|
|
||||||
/* initialize the PCI entry */
|
/* initialize the PCI entry */
|
||||||
if ((err = pci_enable_device(pci)) < 0)
|
err = pci_enable_device(pci);
|
||||||
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
/* check PCI availability (28bit DMA) */
|
/* check PCI availability (28bit DMA) */
|
||||||
if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
|
if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
|
||||||
|
@ -1141,7 +1149,8 @@
|
||||||
chip->irq = -1;
|
chip->irq = -1;
|
||||||
|
|
||||||
/* (1) PCI resource allocation */
|
/* (1) PCI resource allocation */
|
||||||
if ((err = pci_request_regions(pci, "My Chip")) < 0) {
|
err = pci_request_regions(pci, "My Chip");
|
||||||
|
if (err < 0) {
|
||||||
kfree(chip);
|
kfree(chip);
|
||||||
pci_disable_device(pci);
|
pci_disable_device(pci);
|
||||||
return err;
|
return err;
|
||||||
|
@ -1156,10 +1165,10 @@
|
||||||
chip->irq = pci->irq;
|
chip->irq = pci->irq;
|
||||||
|
|
||||||
/* (2) initialization of the chip hardware */
|
/* (2) initialization of the chip hardware */
|
||||||
.... // (not implemented in this document)
|
.... /* (not implemented in this document) */
|
||||||
|
|
||||||
if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL,
|
err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
|
||||||
chip, &ops)) < 0) {
|
if (err < 0) {
|
||||||
snd_mychip_free(chip);
|
snd_mychip_free(chip);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -1233,7 +1242,8 @@
|
||||||
<informalexample>
|
<informalexample>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
if ((err = pci_enable_device(pci)) < 0)
|
err = pci_enable_device(pci);
|
||||||
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
|
if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
|
||||||
pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
|
pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
|
||||||
|
@ -1294,7 +1304,8 @@
|
||||||
<informalexample>
|
<informalexample>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
if ((err = pci_request_regions(pci, "My Chip")) < 0) {
|
err = pci_request_regions(pci, "My Chip");
|
||||||
|
if (err < 0) {
|
||||||
kfree(chip);
|
kfree(chip);
|
||||||
pci_disable_device(pci);
|
pci_disable_device(pci);
|
||||||
return err;
|
return err;
|
||||||
|
@ -1322,7 +1333,7 @@
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
if (request_irq(pci->irq, snd_mychip_interrupt,
|
if (request_irq(pci->irq, snd_mychip_interrupt,
|
||||||
IRQF_DISABLED|IRQF_SHARED, "My Chip", chip)) {
|
IRQF_SHARED, "My Chip", chip)) {
|
||||||
printk(KERN_ERR "cannot grab irq %d\n", pci->irq);
|
printk(KERN_ERR "cannot grab irq %d\n", pci->irq);
|
||||||
snd_mychip_free(chip);
|
snd_mychip_free(chip);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -1773,7 +1784,8 @@
|
||||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||||
|
|
||||||
runtime->hw = snd_mychip_playback_hw;
|
runtime->hw = snd_mychip_playback_hw;
|
||||||
// more hardware-initialization will be done here
|
/* more hardware-initialization will be done here */
|
||||||
|
....
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1781,7 +1793,8 @@
|
||||||
static int snd_mychip_playback_close(struct snd_pcm_substream *substream)
|
static int snd_mychip_playback_close(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct mychip *chip = snd_pcm_substream_chip(substream);
|
struct mychip *chip = snd_pcm_substream_chip(substream);
|
||||||
// the hardware-specific codes will be here
|
/* the hardware-specific codes will be here */
|
||||||
|
....
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1793,7 +1806,8 @@
|
||||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||||
|
|
||||||
runtime->hw = snd_mychip_capture_hw;
|
runtime->hw = snd_mychip_capture_hw;
|
||||||
// more hardware-initialization will be done here
|
/* more hardware-initialization will be done here */
|
||||||
|
....
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1801,7 +1815,8 @@
|
||||||
static int snd_mychip_capture_close(struct snd_pcm_substream *substream)
|
static int snd_mychip_capture_close(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct mychip *chip = snd_pcm_substream_chip(substream);
|
struct mychip *chip = snd_pcm_substream_chip(substream);
|
||||||
// the hardware-specific codes will be here
|
/* the hardware-specific codes will be here */
|
||||||
|
....
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1844,10 +1859,12 @@
|
||||||
{
|
{
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
// do something to start the PCM engine
|
/* do something to start the PCM engine */
|
||||||
|
....
|
||||||
break;
|
break;
|
||||||
case SNDRV_PCM_TRIGGER_STOP:
|
case SNDRV_PCM_TRIGGER_STOP:
|
||||||
// do something to stop the PCM engine
|
/* do something to stop the PCM engine */
|
||||||
|
....
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1900,8 +1917,8 @@
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if ((err = snd_pcm_new(chip->card, "My Chip", 0, 1, 1,
|
err = snd_pcm_new(chip->card, "My Chip", 0, 1, 1, &pcm);
|
||||||
&pcm)) < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
pcm->private_data = chip;
|
pcm->private_data = chip;
|
||||||
strcpy(pcm->name, "My Chip");
|
strcpy(pcm->name, "My Chip");
|
||||||
|
@ -1939,8 +1956,8 @@
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if ((err = snd_pcm_new(chip->card, "My Chip", 0, 1, 1,
|
err = snd_pcm_new(chip->card, "My Chip", 0, 1, 1, &pcm);
|
||||||
&pcm)) < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
pcm->private_data = chip;
|
pcm->private_data = chip;
|
||||||
strcpy(pcm->name, "My Chip");
|
strcpy(pcm->name, "My Chip");
|
||||||
|
@ -2097,7 +2114,7 @@
|
||||||
struct mychip *chip = snd_pcm_chip(pcm);
|
struct mychip *chip = snd_pcm_chip(pcm);
|
||||||
/* free your own data */
|
/* free your own data */
|
||||||
kfree(chip->my_private_pcm_data);
|
kfree(chip->my_private_pcm_data);
|
||||||
// do what you like else
|
/* do what you like else */
|
||||||
....
|
....
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2884,10 +2901,10 @@ struct _snd_pcm_runtime {
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
// do something to start the PCM engine
|
/* do something to start the PCM engine */
|
||||||
break;
|
break;
|
||||||
case SNDRV_PCM_TRIGGER_STOP:
|
case SNDRV_PCM_TRIGGER_STOP:
|
||||||
// do something to stop the PCM engine
|
/* do something to stop the PCM engine */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -3071,7 +3088,7 @@ struct _snd_pcm_runtime {
|
||||||
spin_unlock(&chip->lock);
|
spin_unlock(&chip->lock);
|
||||||
snd_pcm_period_elapsed(chip->substream);
|
snd_pcm_period_elapsed(chip->substream);
|
||||||
spin_lock(&chip->lock);
|
spin_lock(&chip->lock);
|
||||||
// acknowledge the interrupt if necessary
|
/* acknowledge the interrupt if necessary */
|
||||||
}
|
}
|
||||||
....
|
....
|
||||||
spin_unlock(&chip->lock);
|
spin_unlock(&chip->lock);
|
||||||
|
@ -3134,7 +3151,7 @@ struct _snd_pcm_runtime {
|
||||||
snd_pcm_period_elapsed(substream);
|
snd_pcm_period_elapsed(substream);
|
||||||
spin_lock(&chip->lock);
|
spin_lock(&chip->lock);
|
||||||
}
|
}
|
||||||
// acknowledge the interrupt if necessary
|
/* acknowledge the interrupt if necessary */
|
||||||
}
|
}
|
||||||
....
|
....
|
||||||
spin_unlock(&chip->lock);
|
spin_unlock(&chip->lock);
|
||||||
|
@ -3455,6 +3472,13 @@ struct _snd_pcm_runtime {
|
||||||
(casted to unsigned long) of some record to this field, too.
|
(casted to unsigned long) of some record to this field, too.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The <structfield>tlv</structfield> field can be used to provide
|
||||||
|
metadata about the control; see the
|
||||||
|
<link linkend="control-interface-tlv">
|
||||||
|
<citetitle>Metadata</citetitle></link> subsection.
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
The other three are
|
The other three are
|
||||||
<link linkend="control-interface-callbacks"><citetitle>
|
<link linkend="control-interface-callbacks"><citetitle>
|
||||||
|
@ -3604,7 +3628,7 @@ struct _snd_pcm_runtime {
|
||||||
<title>Example of info callback</title>
|
<title>Example of info callback</title>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
static int snd_myctl_info(struct snd_kcontrol *kcontrol,
|
static int snd_myctl_mono_info(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_info *uinfo)
|
struct snd_ctl_elem_info *uinfo)
|
||||||
{
|
{
|
||||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
||||||
|
@ -3639,7 +3663,7 @@ struct _snd_pcm_runtime {
|
||||||
<informalexample>
|
<informalexample>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
static int snd_myctl_info(struct snd_kcontrol *kcontrol,
|
static int snd_myctl_enum_info(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_info *uinfo)
|
struct snd_ctl_elem_info *uinfo)
|
||||||
{
|
{
|
||||||
static char *texts[4] = {
|
static char *texts[4] = {
|
||||||
|
@ -3658,6 +3682,16 @@ struct _snd_pcm_runtime {
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</informalexample>
|
</informalexample>
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Some common info callbacks are prepared for easy use:
|
||||||
|
<function>snd_ctl_boolean_mono_info()</function> and
|
||||||
|
<function>snd_ctl_boolean_stereo_info()</function>.
|
||||||
|
Obviously, the former is an info callback for a mono channel
|
||||||
|
boolean item, just like <function>snd_myctl_mono_info</function>
|
||||||
|
above, and the latter is for a stereo channel boolean item.
|
||||||
|
</para>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="control-interface-callbacks-get">
|
<section id="control-interface-callbacks-get">
|
||||||
|
@ -3794,7 +3828,8 @@ struct _snd_pcm_runtime {
|
||||||
<informalexample>
|
<informalexample>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
if ((err = snd_ctl_add(card, snd_ctl_new1(&my_control, chip))) < 0)
|
err = snd_ctl_add(card, snd_ctl_new1(&my_control, chip));
|
||||||
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
]]>
|
]]>
|
||||||
</programlisting>
|
</programlisting>
|
||||||
|
@ -3843,6 +3878,56 @@ struct _snd_pcm_runtime {
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section id="control-interface-tlv">
|
||||||
|
<title>Metadata</title>
|
||||||
|
<para>
|
||||||
|
To provide information about the dB values of a mixer control, use
|
||||||
|
on of the <constant>DECLARE_TLV_xxx</constant> macros from
|
||||||
|
<filename><sound/tlv.h></filename> to define a variable
|
||||||
|
containing this information, set the<structfield>tlv.p
|
||||||
|
</structfield> field to point to this variable, and include the
|
||||||
|
<constant>SNDRV_CTL_ELEM_ACCESS_TLV_READ</constant> flag in the
|
||||||
|
<structfield>access</structfield> field; like this:
|
||||||
|
<informalexample>
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[
|
||||||
|
static DECLARE_TLV_DB_SCALE(db_scale_my_control, -4050, 150, 0);
|
||||||
|
|
||||||
|
static struct snd_kcontrol_new my_control __devinitdata = {
|
||||||
|
...
|
||||||
|
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
||||||
|
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
|
||||||
|
...
|
||||||
|
.tlv.p = db_scale_my_control,
|
||||||
|
};
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</informalexample>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The <function>DECLARE_TLV_DB_SCALE</function> macro defines
|
||||||
|
information about a mixer control where each step in the control's
|
||||||
|
value changes the dB value by a constant dB amount.
|
||||||
|
The first parameter is the name of the variable to be defined.
|
||||||
|
The second parameter is the minimum value, in units of 0.01 dB.
|
||||||
|
The third parameter is the step size, in units of 0.01 dB.
|
||||||
|
Set the fourth parameter to 1 if the minimum value actually mutes
|
||||||
|
the control.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The <function>DECLARE_TLV_DB_LINEAR</function> macro defines
|
||||||
|
information about a mixer control where the control's value affects
|
||||||
|
the output linearly.
|
||||||
|
The first parameter is the name of the variable to be defined.
|
||||||
|
The second parameter is the minimum value, in units of 0.01 dB.
|
||||||
|
The third parameter is the maximum value, in units of 0.01 dB.
|
||||||
|
If the minimum value mutes the control, set the second parameter to
|
||||||
|
<constant>TLV_DB_GAIN_MUTE</constant>.
|
||||||
|
</para>
|
||||||
|
</section>
|
||||||
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
|
||||||
|
@ -3880,7 +3965,7 @@ struct _snd_pcm_runtime {
|
||||||
{
|
{
|
||||||
struct mychip *chip = ac97->private_data;
|
struct mychip *chip = ac97->private_data;
|
||||||
....
|
....
|
||||||
// read a register value here from the codec
|
/* read a register value here from the codec */
|
||||||
return the_register_value;
|
return the_register_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3889,7 +3974,7 @@ struct _snd_pcm_runtime {
|
||||||
{
|
{
|
||||||
struct mychip *chip = ac97->private_data;
|
struct mychip *chip = ac97->private_data;
|
||||||
....
|
....
|
||||||
// write the given register value to the codec
|
/* write the given register value to the codec */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int snd_mychip_ac97(struct mychip *chip)
|
static int snd_mychip_ac97(struct mychip *chip)
|
||||||
|
@ -3902,7 +3987,8 @@ struct _snd_pcm_runtime {
|
||||||
.read = snd_mychip_ac97_read,
|
.read = snd_mychip_ac97_read,
|
||||||
};
|
};
|
||||||
|
|
||||||
if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &bus)) < 0)
|
err = snd_ac97_bus(chip->card, 0, &ops, NULL, &bus);
|
||||||
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
memset(&ac97, 0, sizeof(ac97));
|
memset(&ac97, 0, sizeof(ac97));
|
||||||
ac97.private_data = chip;
|
ac97.private_data = chip;
|
||||||
|
@ -4447,10 +4533,10 @@ struct _snd_pcm_runtime {
|
||||||
<informalexample>
|
<informalexample>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
struct list_head *list;
|
|
||||||
struct snd_rawmidi_substream *substream;
|
struct snd_rawmidi_substream *substream;
|
||||||
list_for_each(list, &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams) {
|
list_for_each_entry(substream,
|
||||||
substream = list_entry(list, struct snd_rawmidi_substream, list);
|
&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams,
|
||||||
|
list {
|
||||||
sprintf(substream->name, "My MIDI Port %d", substream->number + 1);
|
sprintf(substream->name, "My MIDI Port %d", substream->number + 1);
|
||||||
}
|
}
|
||||||
/* same for SNDRV_RAWMIDI_STREAM_INPUT */
|
/* same for SNDRV_RAWMIDI_STREAM_INPUT */
|
||||||
|
|
|
@ -303,10 +303,3 @@ ICE1712 supports only the unconventional format, interleaved
|
||||||
the buffer as the conventional (mono or 2-channels, 8 or 16bit) format
|
the buffer as the conventional (mono or 2-channels, 8 or 16bit) format
|
||||||
on OSS.
|
on OSS.
|
||||||
|
|
||||||
USB devices
|
|
||||||
-----------
|
|
||||||
Some USB devices support only 24bit format packed in 3bytes. This
|
|
||||||
format is not supported by OSS and no conversion is provided by kernel
|
|
||||||
OSS emulation. You can use the user-space OSS emulation via libaoss
|
|
||||||
instead.
|
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,9 @@ struct hda_bus_ops {
|
||||||
unsigned int verb, unsigned int parm);
|
unsigned int verb, unsigned int parm);
|
||||||
unsigned int (*get_response)(struct hda_codec *codec);
|
unsigned int (*get_response)(struct hda_codec *codec);
|
||||||
void (*private_free)(struct hda_bus *);
|
void (*private_free)(struct hda_bus *);
|
||||||
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||||
|
void (*pm_notify)(struct hda_codec *codec);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
The command callback is called when the codec module needs to send a
|
The command callback is called when the codec module needs to send a
|
||||||
|
@ -56,9 +59,16 @@ VERB to the controller. It's always a single command.
|
||||||
The get_response callback is called when the codec requires the answer
|
The get_response callback is called when the codec requires the answer
|
||||||
for the last command. These two callbacks are mandatory and have to
|
for the last command. These two callbacks are mandatory and have to
|
||||||
be given.
|
be given.
|
||||||
The last, private_free callback, is optional. It's called in the
|
The third, private_free callback, is optional. It's called in the
|
||||||
destructor to release any necessary data in the lowlevel driver.
|
destructor to release any necessary data in the lowlevel driver.
|
||||||
|
|
||||||
|
The pm_notify callback is available only with
|
||||||
|
CONFIG_SND_HDA_POWER_SAVE kconfig. It's called when the codec needs
|
||||||
|
to power up or may power down. The controller should check the all
|
||||||
|
belonging codecs on the bus whether they are actually powered off
|
||||||
|
(check codec->power_on), and optionally the driver may power down the
|
||||||
|
contoller side, too.
|
||||||
|
|
||||||
The bus instance is created via snd_hda_bus_new(). You need to pass
|
The bus instance is created via snd_hda_bus_new(). You need to pass
|
||||||
the card instance, the template, and the pointer to store the
|
the card instance, the template, and the pointer to store the
|
||||||
resultant bus instance.
|
resultant bus instance.
|
||||||
|
@ -86,10 +96,8 @@ resultant codec instance (can be NULL if not needed).
|
||||||
The codec is stored in a linked list of bus instance. You can follow
|
The codec is stored in a linked list of bus instance. You can follow
|
||||||
the codec list like:
|
the codec list like:
|
||||||
|
|
||||||
struct list_head *p;
|
|
||||||
struct hda_codec *codec;
|
struct hda_codec *codec;
|
||||||
list_for_each(p, &bus->codec_list) {
|
list_for_each_entry(codec, &bus->codec_list, list) {
|
||||||
codec = list_entry(p, struct hda_codec, list);
|
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,10 +108,15 @@ initialization sequence is called when the controls are built later.
|
||||||
Codec Access
|
Codec Access
|
||||||
============
|
============
|
||||||
|
|
||||||
To access codec, use snd_codec_read() and snd_codec_write().
|
To access codec, use snd_hda_codec_read() and snd_hda_codec_write().
|
||||||
snd_hda_param_read() is for reading parameters.
|
snd_hda_param_read() is for reading parameters.
|
||||||
For writing a sequence of verbs, use snd_hda_sequence_write().
|
For writing a sequence of verbs, use snd_hda_sequence_write().
|
||||||
|
|
||||||
|
There are variants of cached read/write, snd_hda_codec_write_cache(),
|
||||||
|
snd_hda_sequence_write_cache(). These are used for recording the
|
||||||
|
register states for the power-mangement resume. When no PM is needed,
|
||||||
|
these are equivalent with non-cached version.
|
||||||
|
|
||||||
To retrieve the number of sub nodes connected to the given node, use
|
To retrieve the number of sub nodes connected to the given node, use
|
||||||
snd_hda_get_sub_nodes(). The connection list can be obtained via
|
snd_hda_get_sub_nodes(). The connection list can be obtained via
|
||||||
snd_hda_get_connections() call.
|
snd_hda_get_connections() call.
|
||||||
|
@ -239,6 +252,10 @@ set the codec->patch_ops field. This is defined as below:
|
||||||
int (*suspend)(struct hda_codec *codec, pm_message_t state);
|
int (*suspend)(struct hda_codec *codec, pm_message_t state);
|
||||||
int (*resume)(struct hda_codec *codec);
|
int (*resume)(struct hda_codec *codec);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||||
|
int (*check_power_status)(struct hda_codec *codec,
|
||||||
|
hda_nid_t nid);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
The build_controls callback is called from snd_hda_build_controls().
|
The build_controls callback is called from snd_hda_build_controls().
|
||||||
|
@ -251,6 +268,18 @@ The unsol_event callback is called when an unsolicited event is
|
||||||
received.
|
received.
|
||||||
|
|
||||||
The suspend and resume callbacks are for power management.
|
The suspend and resume callbacks are for power management.
|
||||||
|
They can be NULL if no special sequence is required. When the resume
|
||||||
|
callback is NULL, the driver calls the init callback and resumes the
|
||||||
|
registers from the cache. If other handling is needed, you'd need to
|
||||||
|
write your own resume callback. There, the amp values can be resumed
|
||||||
|
via
|
||||||
|
void snd_hda_codec_resume_amp(struct hda_codec *codec);
|
||||||
|
and the other codec registers via
|
||||||
|
void snd_hda_codec_resume_cache(struct hda_codec *codec);
|
||||||
|
|
||||||
|
The check_power_status callback is called when the amp value of the
|
||||||
|
given widget NID is changed. The codec code can turn on/off the power
|
||||||
|
appropriately from this information.
|
||||||
|
|
||||||
Each entry can be NULL if not necessary to be called.
|
Each entry can be NULL if not necessary to be called.
|
||||||
|
|
||||||
|
@ -267,8 +296,7 @@ Digital I/O
|
||||||
===========
|
===========
|
||||||
|
|
||||||
Call snd_hda_create_spdif_out_ctls() from the patch to create controls
|
Call snd_hda_create_spdif_out_ctls() from the patch to create controls
|
||||||
related with SPDIF out. In the patch resume callback, call
|
related with SPDIF out.
|
||||||
snd_hda_resume_spdif().
|
|
||||||
|
|
||||||
|
|
||||||
Helper Functions
|
Helper Functions
|
||||||
|
@ -284,12 +312,7 @@ as a module parameter, and PCI subsystem IDs. If the matching entry
|
||||||
is found, it returns the config field value.
|
is found, it returns the config field value.
|
||||||
|
|
||||||
snd_hda_add_new_ctls() can be used to create and add control entries.
|
snd_hda_add_new_ctls() can be used to create and add control entries.
|
||||||
Pass the zero-terminated array of struct snd_kcontrol_new. The same array
|
Pass the zero-terminated array of struct snd_kcontrol_new
|
||||||
can be passed to snd_hda_resume_ctls() for resume.
|
|
||||||
Note that this will call control->put callback of these entries. So,
|
|
||||||
put callback should check codec->in_resume and force to restore the
|
|
||||||
given value if it's non-zero even if the value is identical with the
|
|
||||||
cached value.
|
|
||||||
|
|
||||||
Macros HDA_CODEC_VOLUME(), HDA_CODEC_MUTE() and their variables can be
|
Macros HDA_CODEC_VOLUME(), HDA_CODEC_MUTE() and their variables can be
|
||||||
used for the entry of struct snd_kcontrol_new.
|
used for the entry of struct snd_kcontrol_new.
|
||||||
|
|
41
Documentation/sound/alsa/powersave.txt
Normal file
41
Documentation/sound/alsa/powersave.txt
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
Notes on Power-Saving Mode
|
||||||
|
==========================
|
||||||
|
|
||||||
|
AC97 and HD-audio drivers have the automatic power-saving mode.
|
||||||
|
This feature is enabled via Kconfig CONFIG_SND_AC97_POWER_SAVE
|
||||||
|
and CONFIG_SND_HDA_POWER_SAVE options, respectively.
|
||||||
|
|
||||||
|
With the automatic power-saving, the driver turns off the codec power
|
||||||
|
appropriately when no operation is required. When no applications use
|
||||||
|
the device and/or no analog loopback is set, the power disablement is
|
||||||
|
done fully or partially. It'll save a certain power consumption, thus
|
||||||
|
good for laptops (even for desktops).
|
||||||
|
|
||||||
|
The time-out for automatic power-off can be specified via power_save
|
||||||
|
module option of snd-ac97-codec and snd-hda-intel modules. Specify
|
||||||
|
the time-out value in seconds. 0 means to disable the automatic
|
||||||
|
power-saving. The default value of timeout is given via
|
||||||
|
CONFIG_SND_AC97_POWER_SAVE_DEFAULT and
|
||||||
|
CONFIG_SND_HDA_POWER_SAVE_DEFAULT Kconfig options. Setting this to 1
|
||||||
|
(the minimum value) isn't recommended because many applications try to
|
||||||
|
reopen the device frequently. 10 would be a good choice for normal
|
||||||
|
operations.
|
||||||
|
|
||||||
|
The power_save option is exported as writable. This means you can
|
||||||
|
adjust the value via sysfs on the fly. For example, to turn on the
|
||||||
|
automatic power-save mode with 10 seconds, write to
|
||||||
|
/sys/modules/snd_ac97_codec/parameters/power_save (usually as root):
|
||||||
|
|
||||||
|
# echo 10 > /sys/modules/snd_ac97_codec/parameters/power_save
|
||||||
|
|
||||||
|
|
||||||
|
Note that you might hear click noise/pop when changing the power
|
||||||
|
state. Also, it often takes certain time to wake up from the
|
||||||
|
power-down to the active state. These are often hardly to fix, so
|
||||||
|
don't report extra bug reports unless you have a fix patch ;-)
|
||||||
|
|
||||||
|
For HD-audio interface, there is another module option,
|
||||||
|
power_save_controller. This enables/disables the power-save mode of
|
||||||
|
the controller side. Setting this on may reduce a bit more power
|
||||||
|
consumption, but might result in longer wake-up time and click noise.
|
||||||
|
Try to turn it off when you experience such a thing too often.
|
|
@ -1769,7 +1769,7 @@ S: Maintained
|
||||||
|
|
||||||
HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series
|
HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series
|
||||||
P: Jaroslav Kysela
|
P: Jaroslav Kysela
|
||||||
M: perex@suse.cz
|
M: perex@perex.cz
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
HPET: High Precision Event Timers driver (hpet.c)
|
HPET: High Precision Event Timers driver (hpet.c)
|
||||||
|
@ -2132,7 +2132,7 @@ S: Maintained
|
||||||
|
|
||||||
ISAPNP
|
ISAPNP
|
||||||
P: Jaroslav Kysela
|
P: Jaroslav Kysela
|
||||||
M: perex@suse.cz
|
M: perex@perex.cz
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ISDN SUBSYSTEM
|
ISDN SUBSYSTEM
|
||||||
|
@ -3523,7 +3523,7 @@ S: Maintained
|
||||||
|
|
||||||
SOUND
|
SOUND
|
||||||
P: Jaroslav Kysela
|
P: Jaroslav Kysela
|
||||||
M: perex@suse.cz
|
M: perex@perex.cz
|
||||||
L: alsa-devel@alsa-project.org (subscribers-only)
|
L: alsa-devel@alsa-project.org (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* (c) 2005,2006 Ricardo Cerqueira <v4l@cerqueira.org>
|
* (c) 2005,2006 Ricardo Cerqueira <v4l@cerqueira.org>
|
||||||
* (c) 2005 Mauro Carvalho Chehab <mchehab@infradead.org>
|
* (c) 2005 Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||||
* Based on a dummy cx88 module by Gerd Knorr <kraxel@bytesex.org>
|
* Based on a dummy cx88 module by Gerd Knorr <kraxel@bytesex.org>
|
||||||
* Based on dummy.c by Jaroslav Kysela <perex@suse.cz>
|
* Based on dummy.c by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
** Extended for new busmaster capable chipsets by
|
** Extended for new busmaster capable chipsets by
|
||||||
** Siegfried "Frieder" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>
|
** Siegfried "Frieder" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>
|
||||||
**
|
**
|
||||||
** Maintained by: Jaroslav Kysela <perex@suse.cz>
|
** Maintained by: Jaroslav Kysela <perex@perex.cz>
|
||||||
**
|
**
|
||||||
** This driver has only been tested with
|
** This driver has only been tested with
|
||||||
** -- HP J2585B 10/100 Mbit/s PCI Busmaster
|
** -- HP J2585B 10/100 Mbit/s PCI Busmaster
|
||||||
|
@ -2951,7 +2951,7 @@ static struct pci_driver hp100_pci_driver = {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, "
|
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, "
|
||||||
"Siegfried \"Frieder\" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>");
|
"Siegfried \"Frieder\" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>");
|
||||||
MODULE_DESCRIPTION("HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters");
|
MODULE_DESCRIPTION("HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters");
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* interface.c - contains everything related to the user interface
|
* interface.c - contains everything related to the user interface
|
||||||
*
|
*
|
||||||
* Some code, especially possible resource dumping is based on isapnp_proc.c (c) Jaroslav Kysela <perex@suse.cz>
|
* Some code, especially possible resource dumping is based on isapnp_proc.c (c) Jaroslav Kysela <perex@perex.cz>
|
||||||
* Copyright 2002 Adam Belay <ambx1@neo.rr.com>
|
* Copyright 2002 Adam Belay <ambx1@neo.rr.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* ISA Plug & Play support
|
* ISA Plug & Play support
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -53,7 +53,7 @@ static int isapnp_rdp; /* Read Data Port */
|
||||||
static int isapnp_reset = 1; /* reset all PnP cards (deactivate) */
|
static int isapnp_reset = 1; /* reset all PnP cards (deactivate) */
|
||||||
static int isapnp_verbose = 1; /* verbose mode */
|
static int isapnp_verbose = 1; /* verbose mode */
|
||||||
|
|
||||||
MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
|
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
|
||||||
MODULE_DESCRIPTION("Generic ISA Plug & Play support");
|
MODULE_DESCRIPTION("Generic ISA Plug & Play support");
|
||||||
module_param(isapnp_disable, int, 0);
|
module_param(isapnp_disable, int, 0);
|
||||||
MODULE_PARM_DESC(isapnp_disable, "ISA Plug & Play disable");
|
MODULE_PARM_DESC(isapnp_disable, "ISA Plug & Play disable");
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* ISA Plug & Play support
|
* ISA Plug & Play support
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* manager.c - Resource Management, Conflict Resolution, Activation and Disabling of Devices
|
* manager.c - Resource Management, Conflict Resolution, Activation and Disabling of Devices
|
||||||
*
|
*
|
||||||
* based on isapnp.c resource management (c) Jaroslav Kysela <perex@suse.cz>
|
* based on isapnp.c resource management (c) Jaroslav Kysela <perex@perex.cz>
|
||||||
* Copyright 2003 Adam Belay <ambx1@neo.rr.com>
|
* Copyright 2003 Adam Belay <ambx1@neo.rr.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* resource.c - Contains functions for registering and analyzing resource information
|
* resource.c - Contains functions for registering and analyzing resource information
|
||||||
*
|
*
|
||||||
* based on isapnp.c resource management (c) Jaroslav Kysela <perex@suse.cz>
|
* based on isapnp.c resource management (c) Jaroslav Kysela <perex@perex.cz>
|
||||||
* Copyright 2003 Adam Belay <ambx1@neo.rr.com>
|
* Copyright 2003 Adam Belay <ambx1@neo.rr.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -120,6 +120,7 @@
|
||||||
#define I2C_DRIVERID_WM8753 91 /* Wolfson WM8753 audio codec */
|
#define I2C_DRIVERID_WM8753 91 /* Wolfson WM8753 audio codec */
|
||||||
#define I2C_DRIVERID_LM4857 92 /* LM4857 Audio Amplifier */
|
#define I2C_DRIVERID_LM4857 92 /* LM4857 Audio Amplifier */
|
||||||
#define I2C_DRIVERID_VP27SMPX 93 /* Panasonic VP27s tuner internal MPX */
|
#define I2C_DRIVERID_VP27SMPX 93 /* Panasonic VP27s tuner internal MPX */
|
||||||
|
#define I2C_DRIVERID_CS4270 94 /* Cirrus Logic 4270 audio codec */
|
||||||
|
|
||||||
#define I2C_DRIVERID_I2CDEV 900
|
#define I2C_DRIVERID_I2CDEV 900
|
||||||
#define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */
|
#define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */
|
||||||
|
|
25
include/linux/spi/at73c213.h
Normal file
25
include/linux/spi/at73c213.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Board-specific data used to set up AT73c213 audio DAC driver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LINUX_SPI_AT73C213_H
|
||||||
|
#define __LINUX_SPI_AT73C213_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* at73c213_board_info - how the external DAC is wired to the device.
|
||||||
|
*
|
||||||
|
* @ssc_id: SSC platform_driver id the DAC shall use to stream the audio.
|
||||||
|
* @dac_clk: the external clock used to provide master clock to the DAC.
|
||||||
|
* @shortname: a short discription for the DAC, seen by userspace tools.
|
||||||
|
*
|
||||||
|
* This struct contains the configuration of the hardware connection to the
|
||||||
|
* external DAC. The DAC needs a master clock and a I2S audio stream. It also
|
||||||
|
* provides a name which is used to identify it in userspace tools.
|
||||||
|
*/
|
||||||
|
struct at73c213_board_info {
|
||||||
|
int ssc_id;
|
||||||
|
struct clk *dac_clk;
|
||||||
|
char shortname[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __LINUX_SPI_AT73C213_H */
|
|
@ -2,7 +2,7 @@
|
||||||
#define __SOUND_AC97_CODEC_H
|
#define __SOUND_AC97_CODEC_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Universal interface for Audio Codec '97
|
* Universal interface for Audio Codec '97
|
||||||
*
|
*
|
||||||
* For more details look to AC '97 component specification revision 2.1
|
* For more details look to AC '97 component specification revision 2.1
|
||||||
|
@ -345,9 +345,9 @@
|
||||||
#define AC97_ALC650_GPIO_STATUS 0x78
|
#define AC97_ALC650_GPIO_STATUS 0x78
|
||||||
#define AC97_ALC650_CLOCK 0x7a
|
#define AC97_ALC650_CLOCK 0x7a
|
||||||
|
|
||||||
/* specific - Yamaha YMF753 */
|
/* specific - Yamaha YMF7x3 */
|
||||||
#define AC97_YMF753_DIT_CTRL2 0x66 /* DIT Control 2 */
|
#define AC97_YMF7X3_DIT_CTRL 0x66 /* DIT Control (YMF743) / 2 (YMF753) */
|
||||||
#define AC97_YMF753_3D_MODE_SEL 0x68 /* 3D Mode Select */
|
#define AC97_YMF7X3_3D_MODE_SEL 0x68 /* 3D Mode Select */
|
||||||
|
|
||||||
/* specific - C-Media */
|
/* specific - C-Media */
|
||||||
#define AC97_CM9738_VENDOR_CTRL 0x5a
|
#define AC97_CM9738_VENDOR_CTRL 0x5a
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define __SOUND_AD1848_H
|
#define __SOUND_AD1848_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Definitions for AD1847/AD1848/CS4248 chips
|
* Definitions for AD1847/AD1848/CS4248 chips
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
/* IO ports */
|
/* IO ports */
|
||||||
|
|
||||||
#define AD1848P( codec, x ) ( (chip) -> port + c_d_c_AD1848##x )
|
#define AD1848P( chip, x ) ( (chip) -> port + c_d_c_AD1848##x )
|
||||||
|
|
||||||
#define c_d_c_AD1848REGSEL 0
|
#define c_d_c_AD1848REGSEL 0
|
||||||
#define c_d_c_AD1848REG 1
|
#define c_d_c_AD1848REG 1
|
||||||
|
@ -154,7 +154,6 @@ struct snd_ad1848 {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spinlock_t reg_lock;
|
spinlock_t reg_lock;
|
||||||
struct mutex open_mutex;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* exported functions */
|
/* exported functions */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* Advanced Linux Sound Architecture
|
* Advanced Linux Sound Architecture
|
||||||
*
|
*
|
||||||
* GF1 (GUS) Patch Instrument Format
|
* GF1 (GUS) Patch Instrument Format
|
||||||
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* Advanced Linux Sound Architecture
|
* Advanced Linux Sound Architecture
|
||||||
*
|
*
|
||||||
* InterWave FFFF Instrument Format
|
* InterWave FFFF Instrument Format
|
||||||
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* Advanced Linux Sound Architecture
|
* Advanced Linux Sound Architecture
|
||||||
*
|
*
|
||||||
* Simple (MOD player) Instrument Format
|
* Simple (MOD player) Instrument Format
|
||||||
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routines for Asahi Kasei AK4114
|
* Routines for Asahi Kasei AK4114
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routines for Asahi Kasei AK4117
|
* Routines for Asahi Kasei AK4117
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define __SOUND_AK4531_CODEC_H
|
#define __SOUND_AK4531_CODEC_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Universal interface for Audio Codec '97
|
* Universal interface for Audio Codec '97
|
||||||
*
|
*
|
||||||
* For more details look to AC '97 component specification revision 2.1
|
* For more details look to AC '97 component specification revision 2.1
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381
|
* ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381
|
||||||
* AD and DA converters
|
* AD and DA converters
|
||||||
*
|
*
|
||||||
* Copyright (c) 2000 Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Main header file for the ALSA sequencer
|
* Main header file for the ALSA sequencer
|
||||||
* Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
|
* Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
|
||||||
* (c) 1998-1999 by Jaroslav Kysela <perex@suse.cz>
|
* (c) 1998-1999 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Advanced Linux Sound Architecture - ALSA - Driver
|
* Advanced Linux Sound Architecture - ALSA - Driver
|
||||||
* Copyright (c) 1994-2003 by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) 1994-2003 by Jaroslav Kysela <perex@perex.cz>,
|
||||||
* Abramo Bagnara <abramo@alsa-project.org>
|
* Abramo Bagnara <abramo@alsa-project.org>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -92,6 +92,7 @@ enum {
|
||||||
SNDRV_HWDEP_IFACE_USX2Y_PCM, /* Tascam US122, US224 & US428 rawusb pcm */
|
SNDRV_HWDEP_IFACE_USX2Y_PCM, /* Tascam US122, US224 & US428 rawusb pcm */
|
||||||
SNDRV_HWDEP_IFACE_PCXHR, /* Digigram PCXHR */
|
SNDRV_HWDEP_IFACE_PCXHR, /* Digigram PCXHR */
|
||||||
SNDRV_HWDEP_IFACE_SB_RC, /* SB Extigy/Audigy2NX remote control */
|
SNDRV_HWDEP_IFACE_SB_RC, /* SB Extigy/Audigy2NX remote control */
|
||||||
|
SNDRV_HWDEP_IFACE_HDA, /* HD-audio */
|
||||||
|
|
||||||
/* Don't forget to change the following: */
|
/* Don't forget to change the following: */
|
||||||
SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_SB_RC
|
SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_SB_RC
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* Advanced Linux Sound Architecture - ALSA
|
* Advanced Linux Sound Architecture - ALSA
|
||||||
*
|
*
|
||||||
* Interface file between ALSA driver & user space
|
* Interface file between ALSA driver & user space
|
||||||
* Copyright (c) 1994-98 by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) 1994-98 by Jaroslav Kysela <perex@perex.cz>,
|
||||||
* 4Front Technologies
|
* 4Front Technologies
|
||||||
*
|
*
|
||||||
* Direct FM control
|
* Direct FM control
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Advanced Linux Sound Architecture - ALSA - Driver
|
* Advanced Linux Sound Architecture - ALSA - Driver
|
||||||
* Copyright (c) 1994-2000 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1994-2000 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Header file for control interface
|
* Header file for control interface
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -161,4 +161,12 @@ static inline struct snd_ctl_elem_id *snd_ctl_build_ioff(struct snd_ctl_elem_id
|
||||||
return dst_id;
|
return dst_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Frequently used control callbacks
|
||||||
|
*/
|
||||||
|
int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
|
||||||
|
struct snd_ctl_elem_info *uinfo);
|
||||||
|
int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
|
||||||
|
struct snd_ctl_elem_info *uinfo);
|
||||||
|
|
||||||
#endif /* __SOUND_CONTROL_H */
|
#endif /* __SOUND_CONTROL_H */
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main header file for the ALSA driver
|
* Main header file for the ALSA driver
|
||||||
* Copyright (c) 1994-2001 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1994-2001 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
180
include/sound/cs4231-regs.h
Normal file
180
include/sound/cs4231-regs.h
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
#ifndef __SOUND_CS4231_REGS_H
|
||||||
|
#define __SOUND_CS4231_REGS_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
|
* Definitions for CS4231 & InterWave chips & compatible chips registers
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* IO ports */
|
||||||
|
|
||||||
|
#define CS4231P(x) (c_d_c_CS4231##x)
|
||||||
|
|
||||||
|
#define c_d_c_CS4231REGSEL 0
|
||||||
|
#define c_d_c_CS4231REG 1
|
||||||
|
#define c_d_c_CS4231STATUS 2
|
||||||
|
#define c_d_c_CS4231PIO 3
|
||||||
|
|
||||||
|
/* codec registers */
|
||||||
|
|
||||||
|
#define CS4231_LEFT_INPUT 0x00 /* left input control */
|
||||||
|
#define CS4231_RIGHT_INPUT 0x01 /* right input control */
|
||||||
|
#define CS4231_AUX1_LEFT_INPUT 0x02 /* left AUX1 input control */
|
||||||
|
#define CS4231_AUX1_RIGHT_INPUT 0x03 /* right AUX1 input control */
|
||||||
|
#define CS4231_AUX2_LEFT_INPUT 0x04 /* left AUX2 input control */
|
||||||
|
#define CS4231_AUX2_RIGHT_INPUT 0x05 /* right AUX2 input control */
|
||||||
|
#define CS4231_LEFT_OUTPUT 0x06 /* left output control register */
|
||||||
|
#define CS4231_RIGHT_OUTPUT 0x07 /* right output control register */
|
||||||
|
#define CS4231_PLAYBK_FORMAT 0x08 /* clock and data format - playback - bits 7-0 MCE */
|
||||||
|
#define CS4231_IFACE_CTRL 0x09 /* interface control - bits 7-2 MCE */
|
||||||
|
#define CS4231_PIN_CTRL 0x0a /* pin control */
|
||||||
|
#define CS4231_TEST_INIT 0x0b /* test and initialization */
|
||||||
|
#define CS4231_MISC_INFO 0x0c /* miscellaneaous information */
|
||||||
|
#define CS4231_LOOPBACK 0x0d /* loopback control */
|
||||||
|
#define CS4231_PLY_UPR_CNT 0x0e /* playback upper base count */
|
||||||
|
#define CS4231_PLY_LWR_CNT 0x0f /* playback lower base count */
|
||||||
|
#define CS4231_ALT_FEATURE_1 0x10 /* alternate #1 feature enable */
|
||||||
|
#define AD1845_AF1_MIC_LEFT 0x10 /* alternate #1 feature + MIC left */
|
||||||
|
#define CS4231_ALT_FEATURE_2 0x11 /* alternate #2 feature enable */
|
||||||
|
#define AD1845_AF2_MIC_RIGHT 0x11 /* alternate #2 feature + MIC right */
|
||||||
|
#define CS4231_LEFT_LINE_IN 0x12 /* left line input control */
|
||||||
|
#define CS4231_RIGHT_LINE_IN 0x13 /* right line input control */
|
||||||
|
#define CS4231_TIMER_LOW 0x14 /* timer low byte */
|
||||||
|
#define CS4231_TIMER_HIGH 0x15 /* timer high byte */
|
||||||
|
#define CS4231_LEFT_MIC_INPUT 0x16 /* left MIC input control register (InterWave only) */
|
||||||
|
#define AD1845_UPR_FREQ_SEL 0x16 /* upper byte of frequency select */
|
||||||
|
#define CS4231_RIGHT_MIC_INPUT 0x17 /* right MIC input control register (InterWave only) */
|
||||||
|
#define AD1845_LWR_FREQ_SEL 0x17 /* lower byte of frequency select */
|
||||||
|
#define CS4236_EXT_REG 0x17 /* extended register access */
|
||||||
|
#define CS4231_IRQ_STATUS 0x18 /* irq status register */
|
||||||
|
#define CS4231_LINE_LEFT_OUTPUT 0x19 /* left line output control register (InterWave only) */
|
||||||
|
#define CS4231_VERSION 0x19 /* CS4231(A) - version values */
|
||||||
|
#define CS4231_MONO_CTRL 0x1a /* mono input/output control */
|
||||||
|
#define CS4231_LINE_RIGHT_OUTPUT 0x1b /* right line output control register (InterWave only) */
|
||||||
|
#define AD1845_PWR_DOWN 0x1b /* power down control */
|
||||||
|
#define CS4235_LEFT_MASTER 0x1b /* left master output control */
|
||||||
|
#define CS4231_REC_FORMAT 0x1c /* clock and data format - record - bits 7-0 MCE */
|
||||||
|
#define CS4231_PLY_VAR_FREQ 0x1d /* playback variable frequency */
|
||||||
|
#define AD1845_CLOCK 0x1d /* crystal clock select and total power down */
|
||||||
|
#define CS4235_RIGHT_MASTER 0x1d /* right master output control */
|
||||||
|
#define CS4231_REC_UPR_CNT 0x1e /* record upper count */
|
||||||
|
#define CS4231_REC_LWR_CNT 0x1f /* record lower count */
|
||||||
|
|
||||||
|
/* definitions for codec register select port - CODECP( REGSEL ) */
|
||||||
|
|
||||||
|
#define CS4231_INIT 0x80 /* CODEC is initializing */
|
||||||
|
#define CS4231_MCE 0x40 /* mode change enable */
|
||||||
|
#define CS4231_TRD 0x20 /* transfer request disable */
|
||||||
|
|
||||||
|
/* definitions for codec status register - CODECP( STATUS ) */
|
||||||
|
|
||||||
|
#define CS4231_GLOBALIRQ 0x01 /* IRQ is active */
|
||||||
|
|
||||||
|
/* definitions for codec irq status */
|
||||||
|
|
||||||
|
#define CS4231_PLAYBACK_IRQ 0x10
|
||||||
|
#define CS4231_RECORD_IRQ 0x20
|
||||||
|
#define CS4231_TIMER_IRQ 0x40
|
||||||
|
#define CS4231_ALL_IRQS 0x70
|
||||||
|
#define CS4231_REC_UNDERRUN 0x08
|
||||||
|
#define CS4231_REC_OVERRUN 0x04
|
||||||
|
#define CS4231_PLY_OVERRUN 0x02
|
||||||
|
#define CS4231_PLY_UNDERRUN 0x01
|
||||||
|
|
||||||
|
/* definitions for CS4231_LEFT_INPUT and CS4231_RIGHT_INPUT registers */
|
||||||
|
|
||||||
|
#define CS4231_ENABLE_MIC_GAIN 0x20
|
||||||
|
|
||||||
|
#define CS4231_MIXS_LINE 0x00
|
||||||
|
#define CS4231_MIXS_AUX1 0x40
|
||||||
|
#define CS4231_MIXS_MIC 0x80
|
||||||
|
#define CS4231_MIXS_ALL 0xc0
|
||||||
|
|
||||||
|
/* definitions for clock and data format register - CS4231_PLAYBK_FORMAT */
|
||||||
|
|
||||||
|
#define CS4231_LINEAR_8 0x00 /* 8-bit unsigned data */
|
||||||
|
#define CS4231_ALAW_8 0x60 /* 8-bit A-law companded */
|
||||||
|
#define CS4231_ULAW_8 0x20 /* 8-bit U-law companded */
|
||||||
|
#define CS4231_LINEAR_16 0x40 /* 16-bit twos complement data - little endian */
|
||||||
|
#define CS4231_LINEAR_16_BIG 0xc0 /* 16-bit twos complement data - big endian */
|
||||||
|
#define CS4231_ADPCM_16 0xa0 /* 16-bit ADPCM */
|
||||||
|
#define CS4231_STEREO 0x10 /* stereo mode */
|
||||||
|
/* bits 3-1 define frequency divisor */
|
||||||
|
#define CS4231_XTAL1 0x00 /* 24.576 crystal */
|
||||||
|
#define CS4231_XTAL2 0x01 /* 16.9344 crystal */
|
||||||
|
|
||||||
|
/* definitions for interface control register - CS4231_IFACE_CTRL */
|
||||||
|
|
||||||
|
#define CS4231_RECORD_PIO 0x80 /* record PIO enable */
|
||||||
|
#define CS4231_PLAYBACK_PIO 0x40 /* playback PIO enable */
|
||||||
|
#define CS4231_CALIB_MODE 0x18 /* calibration mode bits */
|
||||||
|
#define CS4231_AUTOCALIB 0x08 /* auto calibrate */
|
||||||
|
#define CS4231_SINGLE_DMA 0x04 /* use single DMA channel */
|
||||||
|
#define CS4231_RECORD_ENABLE 0x02 /* record enable */
|
||||||
|
#define CS4231_PLAYBACK_ENABLE 0x01 /* playback enable */
|
||||||
|
|
||||||
|
/* definitions for pin control register - CS4231_PIN_CTRL */
|
||||||
|
|
||||||
|
#define CS4231_IRQ_ENABLE 0x02 /* enable IRQ */
|
||||||
|
#define CS4231_XCTL1 0x40 /* external control #1 */
|
||||||
|
#define CS4231_XCTL0 0x80 /* external control #0 */
|
||||||
|
|
||||||
|
/* definitions for test and init register - CS4231_TEST_INIT */
|
||||||
|
|
||||||
|
#define CS4231_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */
|
||||||
|
#define CS4231_DMA_REQUEST 0x10 /* DMA request in progress */
|
||||||
|
|
||||||
|
/* definitions for misc control register - CS4231_MISC_INFO */
|
||||||
|
|
||||||
|
#define CS4231_MODE2 0x40 /* MODE 2 */
|
||||||
|
#define CS4231_IW_MODE3 0x6c /* MODE 3 - InterWave enhanced mode */
|
||||||
|
#define CS4231_4236_MODE3 0xe0 /* MODE 3 - CS4236+ enhanced mode */
|
||||||
|
|
||||||
|
/* definitions for alternate feature 1 register - CS4231_ALT_FEATURE_1 */
|
||||||
|
|
||||||
|
#define CS4231_DACZ 0x01 /* zero DAC when underrun */
|
||||||
|
#define CS4231_TIMER_ENABLE 0x40 /* codec timer enable */
|
||||||
|
#define CS4231_OLB 0x80 /* output level bit */
|
||||||
|
|
||||||
|
/* definitions for Extended Registers - CS4236+ */
|
||||||
|
|
||||||
|
#define CS4236_REG(i23val) (((i23val << 2) & 0x10) | ((i23val >> 4) & 0x0f))
|
||||||
|
#define CS4236_I23VAL(reg) ((((reg)&0xf) << 4) | (((reg)&0x10) >> 2) | 0x8)
|
||||||
|
|
||||||
|
#define CS4236_LEFT_LINE 0x08 /* left LINE alternate volume */
|
||||||
|
#define CS4236_RIGHT_LINE 0x18 /* right LINE alternate volume */
|
||||||
|
#define CS4236_LEFT_MIC 0x28 /* left MIC volume */
|
||||||
|
#define CS4236_RIGHT_MIC 0x38 /* right MIC volume */
|
||||||
|
#define CS4236_LEFT_MIX_CTRL 0x48 /* synthesis and left input mixer control */
|
||||||
|
#define CS4236_RIGHT_MIX_CTRL 0x58 /* right input mixer control */
|
||||||
|
#define CS4236_LEFT_FM 0x68 /* left FM volume */
|
||||||
|
#define CS4236_RIGHT_FM 0x78 /* right FM volume */
|
||||||
|
#define CS4236_LEFT_DSP 0x88 /* left DSP serial port volume */
|
||||||
|
#define CS4236_RIGHT_DSP 0x98 /* right DSP serial port volume */
|
||||||
|
#define CS4236_RIGHT_LOOPBACK 0xa8 /* right loopback monitor volume */
|
||||||
|
#define CS4236_DAC_MUTE 0xb8 /* DAC mute and IFSE enable */
|
||||||
|
#define CS4236_ADC_RATE 0xc8 /* indenpendent ADC sample frequency */
|
||||||
|
#define CS4236_DAC_RATE 0xd8 /* indenpendent DAC sample frequency */
|
||||||
|
#define CS4236_LEFT_MASTER 0xe8 /* left master digital audio volume */
|
||||||
|
#define CS4236_RIGHT_MASTER 0xf8 /* right master digital audio volume */
|
||||||
|
#define CS4236_LEFT_WAVE 0x0c /* left wavetable serial port volume */
|
||||||
|
#define CS4236_RIGHT_WAVE 0x1c /* right wavetable serial port volume */
|
||||||
|
#define CS4236_VERSION 0x9c /* chip version and ID */
|
||||||
|
|
||||||
|
#endif /* __SOUND_CS4231_REGS_H */
|
|
@ -2,7 +2,7 @@
|
||||||
#define __SOUND_CS4231_H
|
#define __SOUND_CS4231_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Definitions for CS4231 & InterWave chips & compatible chips
|
* Definitions for CS4231 & InterWave chips & compatible chips
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -26,160 +26,7 @@
|
||||||
#include "pcm.h"
|
#include "pcm.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
/* IO ports */
|
#include "cs4231-regs.h"
|
||||||
|
|
||||||
#define CS4231P(x) (c_d_c_CS4231##x)
|
|
||||||
|
|
||||||
#define c_d_c_CS4231REGSEL 0
|
|
||||||
#define c_d_c_CS4231REG 1
|
|
||||||
#define c_d_c_CS4231STATUS 2
|
|
||||||
#define c_d_c_CS4231PIO 3
|
|
||||||
|
|
||||||
/* codec registers */
|
|
||||||
|
|
||||||
#define CS4231_LEFT_INPUT 0x00 /* left input control */
|
|
||||||
#define CS4231_RIGHT_INPUT 0x01 /* right input control */
|
|
||||||
#define CS4231_AUX1_LEFT_INPUT 0x02 /* left AUX1 input control */
|
|
||||||
#define CS4231_AUX1_RIGHT_INPUT 0x03 /* right AUX1 input control */
|
|
||||||
#define CS4231_AUX2_LEFT_INPUT 0x04 /* left AUX2 input control */
|
|
||||||
#define CS4231_AUX2_RIGHT_INPUT 0x05 /* right AUX2 input control */
|
|
||||||
#define CS4231_LEFT_OUTPUT 0x06 /* left output control register */
|
|
||||||
#define CS4231_RIGHT_OUTPUT 0x07 /* right output control register */
|
|
||||||
#define CS4231_PLAYBK_FORMAT 0x08 /* clock and data format - playback - bits 7-0 MCE */
|
|
||||||
#define CS4231_IFACE_CTRL 0x09 /* interface control - bits 7-2 MCE */
|
|
||||||
#define CS4231_PIN_CTRL 0x0a /* pin control */
|
|
||||||
#define CS4231_TEST_INIT 0x0b /* test and initialization */
|
|
||||||
#define CS4231_MISC_INFO 0x0c /* miscellaneaous information */
|
|
||||||
#define CS4231_LOOPBACK 0x0d /* loopback control */
|
|
||||||
#define CS4231_PLY_UPR_CNT 0x0e /* playback upper base count */
|
|
||||||
#define CS4231_PLY_LWR_CNT 0x0f /* playback lower base count */
|
|
||||||
#define CS4231_ALT_FEATURE_1 0x10 /* alternate #1 feature enable */
|
|
||||||
#define AD1845_AF1_MIC_LEFT 0x10 /* alternate #1 feature + MIC left */
|
|
||||||
#define CS4231_ALT_FEATURE_2 0x11 /* alternate #2 feature enable */
|
|
||||||
#define AD1845_AF2_MIC_RIGHT 0x11 /* alternate #2 feature + MIC right */
|
|
||||||
#define CS4231_LEFT_LINE_IN 0x12 /* left line input control */
|
|
||||||
#define CS4231_RIGHT_LINE_IN 0x13 /* right line input control */
|
|
||||||
#define CS4231_TIMER_LOW 0x14 /* timer low byte */
|
|
||||||
#define CS4231_TIMER_HIGH 0x15 /* timer high byte */
|
|
||||||
#define CS4231_LEFT_MIC_INPUT 0x16 /* left MIC input control register (InterWave only) */
|
|
||||||
#define AD1845_UPR_FREQ_SEL 0x16 /* upper byte of frequency select */
|
|
||||||
#define CS4231_RIGHT_MIC_INPUT 0x17 /* right MIC input control register (InterWave only) */
|
|
||||||
#define AD1845_LWR_FREQ_SEL 0x17 /* lower byte of frequency select */
|
|
||||||
#define CS4236_EXT_REG 0x17 /* extended register access */
|
|
||||||
#define CS4231_IRQ_STATUS 0x18 /* irq status register */
|
|
||||||
#define CS4231_LINE_LEFT_OUTPUT 0x19 /* left line output control register (InterWave only) */
|
|
||||||
#define CS4231_VERSION 0x19 /* CS4231(A) - version values */
|
|
||||||
#define CS4231_MONO_CTRL 0x1a /* mono input/output control */
|
|
||||||
#define CS4231_LINE_RIGHT_OUTPUT 0x1b /* right line output control register (InterWave only) */
|
|
||||||
#define AD1845_PWR_DOWN 0x1b /* power down control */
|
|
||||||
#define CS4235_LEFT_MASTER 0x1b /* left master output control */
|
|
||||||
#define CS4231_REC_FORMAT 0x1c /* clock and data format - record - bits 7-0 MCE */
|
|
||||||
#define CS4231_PLY_VAR_FREQ 0x1d /* playback variable frequency */
|
|
||||||
#define AD1845_CLOCK 0x1d /* crystal clock select and total power down */
|
|
||||||
#define CS4235_RIGHT_MASTER 0x1d /* right master output control */
|
|
||||||
#define CS4231_REC_UPR_CNT 0x1e /* record upper count */
|
|
||||||
#define CS4231_REC_LWR_CNT 0x1f /* record lower count */
|
|
||||||
|
|
||||||
/* definitions for codec register select port - CODECP( REGSEL ) */
|
|
||||||
|
|
||||||
#define CS4231_INIT 0x80 /* CODEC is initializing */
|
|
||||||
#define CS4231_MCE 0x40 /* mode change enable */
|
|
||||||
#define CS4231_TRD 0x20 /* transfer request disable */
|
|
||||||
|
|
||||||
/* definitions for codec status register - CODECP( STATUS ) */
|
|
||||||
|
|
||||||
#define CS4231_GLOBALIRQ 0x01 /* IRQ is active */
|
|
||||||
|
|
||||||
/* definitions for codec irq status */
|
|
||||||
|
|
||||||
#define CS4231_PLAYBACK_IRQ 0x10
|
|
||||||
#define CS4231_RECORD_IRQ 0x20
|
|
||||||
#define CS4231_TIMER_IRQ 0x40
|
|
||||||
#define CS4231_ALL_IRQS 0x70
|
|
||||||
#define CS4231_REC_UNDERRUN 0x08
|
|
||||||
#define CS4231_REC_OVERRUN 0x04
|
|
||||||
#define CS4231_PLY_OVERRUN 0x02
|
|
||||||
#define CS4231_PLY_UNDERRUN 0x01
|
|
||||||
|
|
||||||
/* definitions for CS4231_LEFT_INPUT and CS4231_RIGHT_INPUT registers */
|
|
||||||
|
|
||||||
#define CS4231_ENABLE_MIC_GAIN 0x20
|
|
||||||
|
|
||||||
#define CS4231_MIXS_LINE 0x00
|
|
||||||
#define CS4231_MIXS_AUX1 0x40
|
|
||||||
#define CS4231_MIXS_MIC 0x80
|
|
||||||
#define CS4231_MIXS_ALL 0xc0
|
|
||||||
|
|
||||||
/* definitions for clock and data format register - CS4231_PLAYBK_FORMAT */
|
|
||||||
|
|
||||||
#define CS4231_LINEAR_8 0x00 /* 8-bit unsigned data */
|
|
||||||
#define CS4231_ALAW_8 0x60 /* 8-bit A-law companded */
|
|
||||||
#define CS4231_ULAW_8 0x20 /* 8-bit U-law companded */
|
|
||||||
#define CS4231_LINEAR_16 0x40 /* 16-bit twos complement data - little endian */
|
|
||||||
#define CS4231_LINEAR_16_BIG 0xc0 /* 16-bit twos complement data - big endian */
|
|
||||||
#define CS4231_ADPCM_16 0xa0 /* 16-bit ADPCM */
|
|
||||||
#define CS4231_STEREO 0x10 /* stereo mode */
|
|
||||||
/* bits 3-1 define frequency divisor */
|
|
||||||
#define CS4231_XTAL1 0x00 /* 24.576 crystal */
|
|
||||||
#define CS4231_XTAL2 0x01 /* 16.9344 crystal */
|
|
||||||
|
|
||||||
/* definitions for interface control register - CS4231_IFACE_CTRL */
|
|
||||||
|
|
||||||
#define CS4231_RECORD_PIO 0x80 /* record PIO enable */
|
|
||||||
#define CS4231_PLAYBACK_PIO 0x40 /* playback PIO enable */
|
|
||||||
#define CS4231_CALIB_MODE 0x18 /* calibration mode bits */
|
|
||||||
#define CS4231_AUTOCALIB 0x08 /* auto calibrate */
|
|
||||||
#define CS4231_SINGLE_DMA 0x04 /* use single DMA channel */
|
|
||||||
#define CS4231_RECORD_ENABLE 0x02 /* record enable */
|
|
||||||
#define CS4231_PLAYBACK_ENABLE 0x01 /* playback enable */
|
|
||||||
|
|
||||||
/* definitions for pin control register - CS4231_PIN_CTRL */
|
|
||||||
|
|
||||||
#define CS4231_IRQ_ENABLE 0x02 /* enable IRQ */
|
|
||||||
#define CS4231_XCTL1 0x40 /* external control #1 */
|
|
||||||
#define CS4231_XCTL0 0x80 /* external control #0 */
|
|
||||||
|
|
||||||
/* definitions for test and init register - CS4231_TEST_INIT */
|
|
||||||
|
|
||||||
#define CS4231_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */
|
|
||||||
#define CS4231_DMA_REQUEST 0x10 /* DMA request in progress */
|
|
||||||
|
|
||||||
/* definitions for misc control register - CS4231_MISC_INFO */
|
|
||||||
|
|
||||||
#define CS4231_MODE2 0x40 /* MODE 2 */
|
|
||||||
#define CS4231_IW_MODE3 0x6c /* MODE 3 - InterWave enhanced mode */
|
|
||||||
#define CS4231_4236_MODE3 0xe0 /* MODE 3 - CS4236+ enhanced mode */
|
|
||||||
|
|
||||||
/* definitions for alternate feature 1 register - CS4231_ALT_FEATURE_1 */
|
|
||||||
|
|
||||||
#define CS4231_DACZ 0x01 /* zero DAC when underrun */
|
|
||||||
#define CS4231_TIMER_ENABLE 0x40 /* codec timer enable */
|
|
||||||
#define CS4231_OLB 0x80 /* output level bit */
|
|
||||||
|
|
||||||
/* definitions for Extended Registers - CS4236+ */
|
|
||||||
|
|
||||||
#define CS4236_REG(i23val) (((i23val << 2) & 0x10) | ((i23val >> 4) & 0x0f))
|
|
||||||
#define CS4236_I23VAL(reg) ((((reg)&0xf) << 4) | (((reg)&0x10) >> 2) | 0x8)
|
|
||||||
|
|
||||||
#define CS4236_LEFT_LINE 0x08 /* left LINE alternate volume */
|
|
||||||
#define CS4236_RIGHT_LINE 0x18 /* right LINE alternate volume */
|
|
||||||
#define CS4236_LEFT_MIC 0x28 /* left MIC volume */
|
|
||||||
#define CS4236_RIGHT_MIC 0x38 /* right MIC volume */
|
|
||||||
#define CS4236_LEFT_MIX_CTRL 0x48 /* synthesis and left input mixer control */
|
|
||||||
#define CS4236_RIGHT_MIX_CTRL 0x58 /* right input mixer control */
|
|
||||||
#define CS4236_LEFT_FM 0x68 /* left FM volume */
|
|
||||||
#define CS4236_RIGHT_FM 0x78 /* right FM volume */
|
|
||||||
#define CS4236_LEFT_DSP 0x88 /* left DSP serial port volume */
|
|
||||||
#define CS4236_RIGHT_DSP 0x98 /* right DSP serial port volume */
|
|
||||||
#define CS4236_RIGHT_LOOPBACK 0xa8 /* right loopback monitor volume */
|
|
||||||
#define CS4236_DAC_MUTE 0xb8 /* DAC mute and IFSE enable */
|
|
||||||
#define CS4236_ADC_RATE 0xc8 /* indenpendent ADC sample frequency */
|
|
||||||
#define CS4236_DAC_RATE 0xd8 /* indenpendent DAC sample frequency */
|
|
||||||
#define CS4236_LEFT_MASTER 0xe8 /* left master digital audio volume */
|
|
||||||
#define CS4236_RIGHT_MASTER 0xf8 /* right master digital audio volume */
|
|
||||||
#define CS4236_LEFT_WAVE 0x0c /* left wavetable serial port volume */
|
|
||||||
#define CS4236_RIGHT_WAVE 0x1c /* right wavetable serial port volume */
|
|
||||||
#define CS4236_VERSION 0x9c /* chip version and ID */
|
|
||||||
|
|
||||||
/* defines for codec.mode */
|
/* defines for codec.mode */
|
||||||
|
|
||||||
|
@ -210,7 +57,7 @@
|
||||||
#define CS4231_HW_CS4239 0x0404 /* CS4239 - Crystal Clear (tm) stereo enhancement */
|
#define CS4231_HW_CS4239 0x0404 /* CS4239 - Crystal Clear (tm) stereo enhancement */
|
||||||
/* compatible, but clones */
|
/* compatible, but clones */
|
||||||
#define CS4231_HW_INTERWAVE 0x1000 /* InterWave chip */
|
#define CS4231_HW_INTERWAVE 0x1000 /* InterWave chip */
|
||||||
#define CS4231_HW_OPL3SA2 0x1001 /* OPL3-SA2 chip */
|
#define CS4231_HW_OPL3SA2 0x1101 /* OPL3-SA2 chip, similar to cs4231 */
|
||||||
|
|
||||||
/* defines for codec.hwshare */
|
/* defines for codec.hwshare */
|
||||||
#define CS4231_HWSHARE_IRQ (1<<0)
|
#define CS4231_HWSHARE_IRQ (1<<0)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define __SOUND_CS46XX_H
|
#define __SOUND_CS46XX_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
|
||||||
* Cirrus Logic, Inc.
|
* Cirrus Logic, Inc.
|
||||||
* Definitions for Cirrus Logic CS46xx chips
|
* Definitions for Cirrus Logic CS46xx chips
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
|
* The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
|
* The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
|
* The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routines for Cirrus Logic CS8403/CS8404A IEC958 (S/PDIF) Transmitter
|
* Routines for Cirrus Logic CS8403/CS8404A IEC958 (S/PDIF) Transmitter
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
|
||||||
* Takashi Iwai <tiwai@suse.de>
|
* Takashi Iwai <tiwai@suse.de>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routines for Cirrus Logic CS8427
|
* Routines for Cirrus Logic CS8427
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main header file for the ALSA driver
|
* Main header file for the ALSA driver
|
||||||
* Copyright (c) 1994-2000 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1994-2000 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define __SOUND_EMU10K1_H
|
#define __SOUND_EMU10K1_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
|
||||||
* Creative Labs, Inc.
|
* Creative Labs, Inc.
|
||||||
* Definitions for EMU10K1 (SB Live!) chips
|
* Definitions for EMU10K1 (SB Live!) chips
|
||||||
*
|
*
|
||||||
|
@ -1408,8 +1408,6 @@ struct snd_emu10k1_fx8010 {
|
||||||
struct snd_emu10k1_fx8010_irq *irq_handlers;
|
struct snd_emu10k1_fx8010_irq *irq_handlers;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define emu10k1_gpr_ctl(n) list_entry(n, struct snd_emu10k1_fx8010_ctl, list)
|
|
||||||
|
|
||||||
struct snd_emu10k1_midi {
|
struct snd_emu10k1_midi {
|
||||||
struct snd_emu10k1 *emu;
|
struct snd_emu10k1 *emu;
|
||||||
struct snd_rawmidi *rmidi;
|
struct snd_rawmidi *rmidi;
|
||||||
|
@ -1456,6 +1454,9 @@ struct snd_emu1010 {
|
||||||
unsigned int adc_pads; /* bit mask */
|
unsigned int adc_pads; /* bit mask */
|
||||||
unsigned int dac_pads; /* bit mask */
|
unsigned int dac_pads; /* bit mask */
|
||||||
unsigned int internal_clock; /* 44100 or 48000 */
|
unsigned int internal_clock; /* 44100 or 48000 */
|
||||||
|
unsigned int optical_in; /* 0:SPDIF, 1:ADAT */
|
||||||
|
unsigned int optical_out; /* 0:SPDIF, 1:ADAT */
|
||||||
|
struct task_struct *firmware_thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct snd_emu10k1 {
|
struct snd_emu10k1 {
|
||||||
|
@ -1599,9 +1600,9 @@ unsigned int snd_emu10k1_ptr20_read(struct snd_emu10k1 * emu, unsigned int reg,
|
||||||
void snd_emu10k1_ptr20_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned int chn, unsigned int data);
|
void snd_emu10k1_ptr20_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned int chn, unsigned int data);
|
||||||
int snd_emu10k1_spi_write(struct snd_emu10k1 * emu, unsigned int data);
|
int snd_emu10k1_spi_write(struct snd_emu10k1 * emu, unsigned int data);
|
||||||
int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu, u32 reg, u32 value);
|
int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu, u32 reg, u32 value);
|
||||||
int snd_emu1010_fpga_write(struct snd_emu10k1 * emu, int reg, int value);
|
int snd_emu1010_fpga_write(struct snd_emu10k1 * emu, u32 reg, u32 value);
|
||||||
int snd_emu1010_fpga_read(struct snd_emu10k1 * emu, int reg, int *value);
|
int snd_emu1010_fpga_read(struct snd_emu10k1 * emu, u32 reg, u32 *value);
|
||||||
int snd_emu1010_fpga_link_dst_src_write(struct snd_emu10k1 * emu, int dst, int src);
|
int snd_emu1010_fpga_link_dst_src_write(struct snd_emu10k1 * emu, u32 dst, u32 src);
|
||||||
unsigned int snd_emu10k1_efx_read(struct snd_emu10k1 *emu, unsigned int pc);
|
unsigned int snd_emu10k1_efx_read(struct snd_emu10k1 *emu, unsigned int pc);
|
||||||
void snd_emu10k1_intr_enable(struct snd_emu10k1 *emu, unsigned int intrenb);
|
void snd_emu10k1_intr_enable(struct snd_emu10k1 *emu, unsigned int intrenb);
|
||||||
void snd_emu10k1_intr_disable(struct snd_emu10k1 *emu, unsigned int intrenb);
|
void snd_emu10k1_intr_disable(struct snd_emu10k1 *emu, unsigned int intrenb);
|
||||||
|
@ -1746,6 +1747,8 @@ int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu,
|
||||||
#define A_FXBUS2(x) (0x80 + (x)) /* x = 0x00 - 0x1f extra outs used for EFX capture -> A_FXWC2 */
|
#define A_FXBUS2(x) (0x80 + (x)) /* x = 0x00 - 0x1f extra outs used for EFX capture -> A_FXWC2 */
|
||||||
#define A_EMU32OUTH(x) (0xa0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_10 - _1F" - ??? */
|
#define A_EMU32OUTH(x) (0xa0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_10 - _1F" - ??? */
|
||||||
#define A_EMU32OUTL(x) (0xb0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_1 - _F" - ??? */
|
#define A_EMU32OUTL(x) (0xb0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_1 - _F" - ??? */
|
||||||
|
#define A3_EMU32IN(x) (0x160 + (x)) /* x = 0x00 - 0x3f "EMU32_IN_00 - _3F" - Only when .device = 0x0008 */
|
||||||
|
#define A3_EMU32OUT(x) (0x1E0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_00 - _3F" - Only when .device = 0x0008 */
|
||||||
#define A_GPR(x) (A_FXGPREGBASE + (x))
|
#define A_GPR(x) (A_FXGPREGBASE + (x))
|
||||||
|
|
||||||
/* cc_reg constants */
|
/* cc_reg constants */
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Header file for ES488/ES1688
|
* Header file for ES488/ES1688
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global structures used for GUS part of ALSA driver
|
* Global structures used for GUS part of ALSA driver
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
44
include/sound/hda_hwdep.h
Normal file
44
include/sound/hda_hwdep.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* HWDEP Interface for HD-audio codec
|
||||||
|
*
|
||||||
|
* Copyright (c) 2007 Takashi Iwai <tiwai@suse.de>
|
||||||
|
*
|
||||||
|
* This driver is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This driver is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SOUND_HDA_HWDEP_H
|
||||||
|
#define __SOUND_HDA_HWDEP_H
|
||||||
|
|
||||||
|
#define HDA_HWDEP_VERSION ((1 << 16) | (0 << 8) | (0 << 0)) /* 1.0.0 */
|
||||||
|
|
||||||
|
/* verb */
|
||||||
|
#define HDA_REG_NID_SHIFT 24
|
||||||
|
#define HDA_REG_VERB_SHIFT 8
|
||||||
|
#define HDA_REG_VAL_SHIFT 0
|
||||||
|
#define HDA_VERB(nid,verb,param) ((nid)<<24 | (verb)<<8 | (param))
|
||||||
|
|
||||||
|
struct hda_verb_ioctl {
|
||||||
|
u32 verb; /* HDA_VERB() */
|
||||||
|
u32 res; /* response */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ioctls
|
||||||
|
*/
|
||||||
|
#define HDA_IOCTL_PVERSION _IOR('H', 0x10, int)
|
||||||
|
#define HDA_IOCTL_VERB_WRITE _IOWR('H', 0x11, struct hda_verb_ioctl)
|
||||||
|
#define HDA_IOCTL_GET_WCAP _IOWR('H', 0x12, struct hda_verb_ioctl)
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __SOUND_HDSPM_H /* -*- linux-c -*- */
|
#ifndef __SOUND_HDSPM_H
|
||||||
#define __SOUND_HDSPM_H
|
#define __SOUND_HDSPM_H
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2003 Winfried Ritsch (IEM)
|
* Copyright (C) 2003 Winfried Ritsch (IEM)
|
||||||
|
@ -61,7 +61,8 @@ struct hdspm_peak_rms_ioctl {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* use indirect access due to the limit of ioctl bit size */
|
/* use indirect access due to the limit of ioctl bit size */
|
||||||
#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdspm_peak_rms_ioctl)
|
#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \
|
||||||
|
_IOR('H', 0x40, struct hdspm_peak_rms_ioctl)
|
||||||
|
|
||||||
/* ------------ CONFIG block IOCTL ---------------------- */
|
/* ------------ CONFIG block IOCTL ---------------------- */
|
||||||
|
|
||||||
|
@ -79,7 +80,8 @@ struct hdspm_config_info {
|
||||||
unsigned int analog_out;
|
unsigned int analog_out;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdspm_config_info)
|
#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO \
|
||||||
|
_IOR('H', 0x41, struct hdspm_config_info)
|
||||||
|
|
||||||
|
|
||||||
/* get Soundcard Version */
|
/* get Soundcard Version */
|
||||||
|
@ -93,10 +95,14 @@ struct hdspm_version {
|
||||||
|
|
||||||
/* ------------- get Matrix Mixer IOCTL --------------- */
|
/* ------------- get Matrix Mixer IOCTL --------------- */
|
||||||
|
|
||||||
/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte = 32768 Bytes */
|
/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte =
|
||||||
|
* 32768 Bytes
|
||||||
|
*/
|
||||||
|
|
||||||
/* organisation is 64 channelfader in a continous memory block */
|
/* organisation is 64 channelfader in a continous memory block */
|
||||||
/* equivalent to hardware definition, maybe for future feature of mmap of them */
|
/* equivalent to hardware definition, maybe for future feature of mmap of
|
||||||
|
* them
|
||||||
|
*/
|
||||||
/* each of 64 outputs has 64 infader and 64 outfader:
|
/* each of 64 outputs has 64 infader and 64 outfader:
|
||||||
Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
|
Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hardware dependent layer
|
* Hardware dependent layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Header file for info interface
|
* Header file for info interface
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Init values for soundcard modules
|
* Init values for soundcard modules
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Takashi Iwai <tiwai@suse.de>
|
* Takashi Iwai <tiwai@suse.de>
|
||||||
*
|
*
|
||||||
* Generic memory allocators
|
* Generic memory allocators
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OSS MIXER API
|
* OSS MIXER API
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Header file for MPU-401 and compatible cards
|
* Header file for MPU-401 and compatible cards
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -50,7 +50,6 @@
|
||||||
#define MPU401_INFO_INTEGRATED (1 << 2) /* integrated h/w port */
|
#define MPU401_INFO_INTEGRATED (1 << 2) /* integrated h/w port */
|
||||||
#define MPU401_INFO_MMIO (1 << 3) /* MMIO access */
|
#define MPU401_INFO_MMIO (1 << 3) /* MMIO access */
|
||||||
#define MPU401_INFO_TX_IRQ (1 << 4) /* independent TX irq */
|
#define MPU401_INFO_TX_IRQ (1 << 4) /* independent TX irq */
|
||||||
#define MPU401_INFO_UART_ONLY (1 << 5) /* No ENTER_UART cmd needed */
|
|
||||||
|
|
||||||
#define MPU401_MODE_BIT_INPUT 0
|
#define MPU401_MODE_BIT_INPUT 0
|
||||||
#define MPU401_MODE_BIT_OUTPUT 1
|
#define MPU401_MODE_BIT_OUTPUT 1
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
/*
|
/*
|
||||||
* Definitions of the OPL-3 registers.
|
* Definitions of the OPL-3 registers.
|
||||||
*
|
*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
|
||||||
* Hannu Savolainen 1993-1996
|
* Hannu Savolainen 1993-1996
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* Helper functions for indirect PCM data transfer
|
* Helper functions for indirect PCM data transfer
|
||||||
*
|
*
|
||||||
* Copyright (c) by Takashi Iwai <tiwai@suse.de>
|
* Copyright (c) by Takashi Iwai <tiwai@suse.de>
|
||||||
* Jaroslav Kysela <perex@suse.cz>
|
* Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Digital Audio (PCM) abstract layer
|
* Digital Audio (PCM) abstract layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Abramo Bagnara <abramo@alsa-project.org>
|
* Abramo Bagnara <abramo@alsa-project.org>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -301,8 +301,8 @@ struct snd_pcm_runtime {
|
||||||
union snd_pcm_sync_id sync; /* hardware synchronization ID */
|
union snd_pcm_sync_id sync; /* hardware synchronization ID */
|
||||||
|
|
||||||
/* -- mmap -- */
|
/* -- mmap -- */
|
||||||
volatile struct snd_pcm_mmap_status *status;
|
struct snd_pcm_mmap_status *status;
|
||||||
volatile struct snd_pcm_mmap_control *control;
|
struct snd_pcm_mmap_control *control;
|
||||||
|
|
||||||
/* -- locking / scheduling -- */
|
/* -- locking / scheduling -- */
|
||||||
wait_queue_head_t sleep;
|
wait_queue_head_t sleep;
|
||||||
|
@ -791,13 +791,13 @@ static inline struct snd_interval *hw_param_interval(struct snd_pcm_hw_params *p
|
||||||
static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
|
static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
|
||||||
snd_pcm_hw_param_t var)
|
snd_pcm_hw_param_t var)
|
||||||
{
|
{
|
||||||
return (const struct snd_mask *)hw_param_mask((struct snd_pcm_hw_params*) params, var);
|
return ¶ms->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
|
static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
|
||||||
snd_pcm_hw_param_t var)
|
snd_pcm_hw_param_t var)
|
||||||
{
|
{
|
||||||
return (const struct snd_interval *)hw_param_interval((struct snd_pcm_hw_params*) params, var);
|
return ¶ms->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
|
||||||
}
|
}
|
||||||
|
|
||||||
#define params_access(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_ACCESS))
|
#define params_access(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_ACCESS))
|
||||||
|
@ -922,7 +922,10 @@ snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream,
|
||||||
snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream,
|
snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream,
|
||||||
void __user **bufs, snd_pcm_uframes_t frames);
|
void __user **bufs, snd_pcm_uframes_t frames);
|
||||||
|
|
||||||
|
extern const struct snd_pcm_hw_constraint_list snd_pcm_known_rates;
|
||||||
|
|
||||||
int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime);
|
int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime);
|
||||||
|
unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate);
|
||||||
|
|
||||||
static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
|
static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
|
||||||
struct snd_dma_buffer *bufp)
|
struct snd_dma_buffer *bufp)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Digital Audio (PCM) - OSS compatibility abstract layer
|
* Digital Audio (PCM) - OSS compatibility abstract layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Abstract layer for MIDI v1.0 stream
|
* Abstract layer for MIDI v1.0 stream
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Header file for SoundBlaster cards
|
* Header file for SoundBlaster cards
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main kernel header file for the ALSA sequencer
|
* Main kernel header file for the ALSA sequencer
|
||||||
* Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* MIDI byte <-> sequencer event coder
|
* MIDI byte <-> sequencer event coder
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de>,
|
* Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de>,
|
||||||
* Jaroslav Kysela <perex@suse.cz>
|
* Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
/*
|
/*
|
||||||
* Virtual Raw MIDI client on Sequencer
|
* Virtual Raw MIDI client on Sequencer
|
||||||
* Copyright (c) 2000 by Takashi Iwai <tiwai@suse.de>,
|
* Copyright (c) 2000 by Takashi Iwai <tiwai@suse.de>,
|
||||||
* Jaroslav Kysela <perex@suse.cz>
|
* Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -201,8 +201,7 @@ int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_info *uinfo);
|
struct snd_ctl_elem_info *uinfo);
|
||||||
int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
|
int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_info *uinfo);
|
struct snd_ctl_elem_info *uinfo);
|
||||||
int snd_soc_info_bool_ext(struct snd_kcontrol *kcontrol,
|
#define snd_soc_info_bool_ext snd_ctl_boolean_mono
|
||||||
struct snd_ctl_elem_info *uinfo);
|
|
||||||
int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
|
int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_value *ucontrol);
|
struct snd_ctl_elem_value *ucontrol);
|
||||||
int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
|
int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
/*
|
/*
|
||||||
* ALSA driver for TEA5757/5759 Philips AM/FM tuner chips
|
* ALSA driver for TEA5757/5759 Philips AM/FM tuner chips
|
||||||
*
|
*
|
||||||
* Copyright (c) 2004 Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 2004 Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Timer abstract layer
|
* Timer abstract layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
|
||||||
* Abramo Bagnara <abramo@alsa-project.org>
|
* Abramo Bagnara <abramo@alsa-project.org>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Advanced Linux Sound Architecture - ALSA - Driver
|
* Advanced Linux Sound Architecture - ALSA - Driver
|
||||||
* Copyright (c) 2006 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 2006 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
/* include/version.h. Generated by alsa/ksync script. */
|
/* include/version.h. Generated by alsa/ksync script. */
|
||||||
#define CONFIG_SND_VERSION "1.0.14"
|
#define CONFIG_SND_VERSION "1.0.15"
|
||||||
#define CONFIG_SND_DATE " (Fri Jul 20 09:12:58 2007 UTC)"
|
#define CONFIG_SND_DATE " (Tue Oct 16 14:57:44 2007 UTC)"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define __SOUND_YMFPCI_H
|
#define __SOUND_YMFPCI_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Definitions for Yahama YMF724/740/744/754 chips
|
* Definitions for Yahama YMF724/740/744/754 chips
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
|
|
@ -63,6 +63,10 @@ source "sound/aoa/Kconfig"
|
||||||
|
|
||||||
source "sound/arm/Kconfig"
|
source "sound/arm/Kconfig"
|
||||||
|
|
||||||
|
if SPI
|
||||||
|
source "sound/spi/Kconfig"
|
||||||
|
endif
|
||||||
|
|
||||||
source "sound/mips/Kconfig"
|
source "sound/mips/Kconfig"
|
||||||
|
|
||||||
source "sound/sh/Kconfig"
|
source "sound/sh/Kconfig"
|
||||||
|
|
|
@ -5,7 +5,8 @@ obj-$(CONFIG_SOUND) += soundcore.o
|
||||||
obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o
|
obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o
|
||||||
obj-$(CONFIG_SOUND_PRIME) += oss/
|
obj-$(CONFIG_SOUND_PRIME) += oss/
|
||||||
obj-$(CONFIG_DMASOUND) += oss/
|
obj-$(CONFIG_DMASOUND) += oss/
|
||||||
obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ sparc/ parisc/ pcmcia/ mips/ soc/
|
obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \
|
||||||
|
sparc/ spi/ parisc/ pcmcia/ mips/ soc/
|
||||||
obj-$(CONFIG_SND_AOA) += aoa/
|
obj-$(CONFIG_SND_AOA) += aoa/
|
||||||
|
|
||||||
# This one must be compilable even if sound is configured out
|
# This one must be compilable even if sound is configured out
|
||||||
|
|
|
@ -297,15 +297,7 @@ static struct snd_kcontrol_new capture_source_control = {
|
||||||
.put = onyx_snd_capture_source_put,
|
.put = onyx_snd_capture_source_put,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int onyx_snd_mute_info(struct snd_kcontrol *kcontrol,
|
#define onyx_snd_mute_info snd_ctl_boolean_stereo_info
|
||||||
struct snd_ctl_elem_info *uinfo)
|
|
||||||
{
|
|
||||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
|
||||||
uinfo->count = 2;
|
|
||||||
uinfo->value.integer.min = 0;
|
|
||||||
uinfo->value.integer.max = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int onyx_snd_mute_get(struct snd_kcontrol *kcontrol,
|
static int onyx_snd_mute_get(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_value *ucontrol)
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
|
@ -359,15 +351,7 @@ static struct snd_kcontrol_new mute_control = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int onyx_snd_single_bit_info(struct snd_kcontrol *kcontrol,
|
#define onyx_snd_single_bit_info snd_ctl_boolean_mono_info
|
||||||
struct snd_ctl_elem_info *uinfo)
|
|
||||||
{
|
|
||||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
|
||||||
uinfo->count = 1;
|
|
||||||
uinfo->value.integer.min = 0;
|
|
||||||
uinfo->value.integer.max = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FLAG_POLARITY_INVERT 1
|
#define FLAG_POLARITY_INVERT 1
|
||||||
#define FLAG_SPDIFLOCK 2
|
#define FLAG_SPDIFLOCK 2
|
||||||
|
|
|
@ -272,15 +272,7 @@ static struct snd_kcontrol_new volume_control = {
|
||||||
.put = tas_snd_vol_put,
|
.put = tas_snd_vol_put,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tas_snd_mute_info(struct snd_kcontrol *kcontrol,
|
#define tas_snd_mute_info snd_ctl_boolean_stereo_info
|
||||||
struct snd_ctl_elem_info *uinfo)
|
|
||||||
{
|
|
||||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
|
||||||
uinfo->count = 2;
|
|
||||||
uinfo->value.integer.min = 0;
|
|
||||||
uinfo->value.integer.max = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tas_snd_mute_get(struct snd_kcontrol *kcontrol,
|
static int tas_snd_mute_get(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_value *ucontrol)
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
|
@ -431,15 +423,7 @@ static struct snd_kcontrol_new drc_range_control = {
|
||||||
.put = tas_snd_drc_range_put,
|
.put = tas_snd_drc_range_put,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tas_snd_drc_switch_info(struct snd_kcontrol *kcontrol,
|
#define tas_snd_drc_switch_info snd_ctl_boolean_mono_info
|
||||||
struct snd_ctl_elem_info *uinfo)
|
|
||||||
{
|
|
||||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
|
||||||
uinfo->count = 1;
|
|
||||||
uinfo->value.integer.min = 0;
|
|
||||||
uinfo->value.integer.max = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tas_snd_drc_switch_get(struct snd_kcontrol *kcontrol,
|
static int tas_snd_drc_switch_get(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_value *ucontrol)
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
|
@ -743,6 +727,7 @@ static int tas_switch_clock(struct codec_info_item *cii, enum clock_switch clock
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
/* we are controlled via i2c and assume that is always up
|
/* we are controlled via i2c and assume that is always up
|
||||||
* If that wasn't the case, we'd have to suspend once
|
* If that wasn't the case, we'd have to suspend once
|
||||||
* our i2c device is suspended, and then take note of that! */
|
* our i2c device is suspended, and then take note of that! */
|
||||||
|
@ -768,7 +753,6 @@ static int tas_resume(struct tas *tas)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
|
||||||
static int _tas_suspend(struct codec_info_item *cii, pm_message_t state)
|
static int _tas_suspend(struct codec_info_item *cii, pm_message_t state)
|
||||||
{
|
{
|
||||||
return tas_suspend(cii->codec_data);
|
return tas_suspend(cii->codec_data);
|
||||||
|
@ -778,7 +762,10 @@ static int _tas_resume(struct codec_info_item *cii)
|
||||||
{
|
{
|
||||||
return tas_resume(cii->codec_data);
|
return tas_resume(cii->codec_data);
|
||||||
}
|
}
|
||||||
#endif
|
#else /* CONFIG_PM */
|
||||||
|
#define _tas_suspend NULL
|
||||||
|
#define _tas_resume NULL
|
||||||
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
static struct codec_info tas_codec_info = {
|
static struct codec_info tas_codec_info = {
|
||||||
.transfers = tas_transfers,
|
.transfers = tas_transfers,
|
||||||
|
@ -791,10 +778,8 @@ static struct codec_info tas_codec_info = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.usable = tas_usable,
|
.usable = tas_usable,
|
||||||
.switch_clock = tas_switch_clock,
|
.switch_clock = tas_switch_clock,
|
||||||
#ifdef CONFIG_PM
|
|
||||||
.suspend = _tas_suspend,
|
.suspend = _tas_suspend,
|
||||||
.resume = _tas_resume,
|
.resume = _tas_resume,
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tas_init_codec(struct aoa_codec *codec)
|
static int tas_init_codec(struct aoa_codec *codec)
|
||||||
|
|
|
@ -582,15 +582,7 @@ static int layouts_list_items;
|
||||||
* make the fabric handle all the card stuff, etc... */
|
* make the fabric handle all the card stuff, etc... */
|
||||||
static struct layout_dev *layout_device;
|
static struct layout_dev *layout_device;
|
||||||
|
|
||||||
static int control_info(struct snd_kcontrol *kcontrol,
|
#define control_info snd_ctl_boolean_mono_info
|
||||||
struct snd_ctl_elem_info *uinfo)
|
|
||||||
{
|
|
||||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
|
||||||
uinfo->count = 1;
|
|
||||||
uinfo->value.integer.min = 0;
|
|
||||||
uinfo->value.integer.max = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AMP_CONTROL(n, description) \
|
#define AMP_CONTROL(n, description) \
|
||||||
static int n##_control_get(struct snd_kcontrol *kcontrol, \
|
static int n##_control_get(struct snd_kcontrol *kcontrol, \
|
||||||
|
|
|
@ -79,12 +79,6 @@
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
|
|
||||||
#ifdef CONFIG_H3600_HAL
|
|
||||||
#include <asm/semaphore.h>
|
|
||||||
#include <asm/uaccess.h>
|
|
||||||
#include <asm/arch/h3600_hal.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
#include <sound/initval.h>
|
#include <sound/initval.h>
|
||||||
|
@ -100,9 +94,6 @@
|
||||||
* We use DMA stuff from 2.4.18-rmk3-hh24 here to be able to compile this
|
* We use DMA stuff from 2.4.18-rmk3-hh24 here to be able to compile this
|
||||||
* module for Familiar 0.6.1
|
* module for Familiar 0.6.1
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_H3600_HAL
|
|
||||||
#define HH_VERSION 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* {{{ Type definitions */
|
/* {{{ Type definitions */
|
||||||
|
|
||||||
|
@ -238,11 +229,8 @@ static void sa11xx_uda1341_set_samplerate(struct sa11xx_uda1341 *sa11xx_uda1341,
|
||||||
rate = 8000;
|
rate = 8000;
|
||||||
|
|
||||||
/* Set the external clock generator */
|
/* Set the external clock generator */
|
||||||
#ifdef CONFIG_H3600_HAL
|
|
||||||
h3600_audio_clock(rate);
|
|
||||||
#else
|
|
||||||
sa11xx_uda1341_set_audio_clock(rate);
|
sa11xx_uda1341_set_audio_clock(rate);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Select the clock divisor */
|
/* Select the clock divisor */
|
||||||
switch (rate) {
|
switch (rate) {
|
||||||
|
@ -307,13 +295,10 @@ static void sa11xx_uda1341_audio_init(struct sa11xx_uda1341 *sa11xx_uda1341)
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
||||||
/* Enable the audio power */
|
/* Enable the audio power */
|
||||||
#ifdef CONFIG_H3600_HAL
|
|
||||||
h3600_audio_power(AUDIO_RATE_DEFAULT);
|
|
||||||
#else
|
|
||||||
clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_CODEC_NRESET);
|
clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_CODEC_NRESET);
|
||||||
set_sa11xx_uda1341_egpio(IPAQ_EGPIO_AUDIO_ON);
|
set_sa11xx_uda1341_egpio(IPAQ_EGPIO_AUDIO_ON);
|
||||||
set_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
|
set_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Wait for the UDA1341 to wake up */
|
/* Wait for the UDA1341 to wake up */
|
||||||
mdelay(1); //FIXME - was removed by Perex - Why?
|
mdelay(1); //FIXME - was removed by Perex - Why?
|
||||||
|
@ -331,21 +316,13 @@ static void sa11xx_uda1341_audio_init(struct sa11xx_uda1341 *sa11xx_uda1341)
|
||||||
/* make the left and right channels unswapped (flip the WS latch) */
|
/* make the left and right channels unswapped (flip the WS latch) */
|
||||||
Ser4SSDR = 0;
|
Ser4SSDR = 0;
|
||||||
|
|
||||||
#ifdef CONFIG_H3600_HAL
|
clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
|
||||||
h3600_audio_mute(0);
|
|
||||||
#else
|
|
||||||
clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sa11xx_uda1341_audio_shutdown(struct sa11xx_uda1341 *sa11xx_uda1341)
|
static void sa11xx_uda1341_audio_shutdown(struct sa11xx_uda1341 *sa11xx_uda1341)
|
||||||
{
|
{
|
||||||
/* mute on */
|
/* mute on */
|
||||||
#ifdef CONFIG_H3600_HAL
|
|
||||||
h3600_audio_mute(1);
|
|
||||||
#else
|
|
||||||
set_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
|
set_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* disable the audio power and all signals leading to the audio chip */
|
/* disable the audio power and all signals leading to the audio chip */
|
||||||
l3_close(sa11xx_uda1341->uda1341);
|
l3_close(sa11xx_uda1341->uda1341);
|
||||||
|
@ -354,13 +331,9 @@ static void sa11xx_uda1341_audio_shutdown(struct sa11xx_uda1341 *sa11xx_uda1341)
|
||||||
|
|
||||||
/* power off and mute off */
|
/* power off and mute off */
|
||||||
/* FIXME - is muting off necesary??? */
|
/* FIXME - is muting off necesary??? */
|
||||||
#ifdef CONFIG_H3600_HAL
|
|
||||||
h3600_audio_power(0);
|
|
||||||
h3600_audio_mute(0);
|
|
||||||
#else
|
|
||||||
clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_AUDIO_ON);
|
clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_AUDIO_ON);
|
||||||
clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
|
clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -1,20 +1,17 @@
|
||||||
#
|
#
|
||||||
# Makefile for ALSA
|
# Makefile for ALSA
|
||||||
# Copyright (c) 1999,2001 by Jaroslav Kysela <perex@suse.cz>
|
# Copyright (c) 1999,2001 by Jaroslav Kysela <perex@perex.cz>
|
||||||
#
|
#
|
||||||
|
|
||||||
snd-objs := sound.o init.o memory.o info.o control.o misc.o device.o
|
snd-y := sound.o init.o memory.o info.o control.o misc.o device.o
|
||||||
ifeq ($(CONFIG_ISA_DMA_API),y)
|
snd-$(CONFIG_ISA_DMA_API) += isadma.o
|
||||||
snd-objs += isadma.o
|
snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o info_oss.o
|
||||||
endif
|
|
||||||
ifeq ($(CONFIG_SND_OSSEMUL),y)
|
|
||||||
snd-objs += sound_oss.o info_oss.o
|
|
||||||
endif
|
|
||||||
|
|
||||||
snd-pcm-objs := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \
|
snd-pcm-objs := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \
|
||||||
pcm_memory.o
|
pcm_memory.o
|
||||||
|
|
||||||
snd-page-alloc-objs := memalloc.o sgbuf.o
|
snd-page-alloc-y := memalloc.o
|
||||||
|
snd-page-alloc-$(CONFIG_HAS_DMA) += sgbuf.o
|
||||||
|
|
||||||
snd-rawmidi-objs := rawmidi.o
|
snd-rawmidi-objs := rawmidi.o
|
||||||
snd-timer-objs := timer.o
|
snd-timer-objs := timer.o
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Routines for driver control interface
|
* Routines for driver control interface
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -716,8 +716,6 @@ int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(snd_ctl_elem_read);
|
|
||||||
|
|
||||||
static int snd_ctl_elem_read_user(struct snd_card *card,
|
static int snd_ctl_elem_read_user(struct snd_card *card,
|
||||||
struct snd_ctl_elem_value __user *_control)
|
struct snd_ctl_elem_value __user *_control)
|
||||||
{
|
{
|
||||||
|
@ -781,8 +779,6 @@ int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(snd_ctl_elem_write);
|
|
||||||
|
|
||||||
static int snd_ctl_elem_write_user(struct snd_ctl_file *file,
|
static int snd_ctl_elem_write_user(struct snd_ctl_file *file,
|
||||||
struct snd_ctl_elem_value __user *_control)
|
struct snd_ctl_elem_value __user *_control)
|
||||||
{
|
{
|
||||||
|
@ -1486,3 +1482,30 @@ int snd_ctl_create(struct snd_card *card)
|
||||||
snd_assert(card != NULL, return -ENXIO);
|
snd_assert(card != NULL, return -ENXIO);
|
||||||
return snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);
|
return snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Frequently used control callbacks
|
||||||
|
*/
|
||||||
|
int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
|
||||||
|
struct snd_ctl_elem_info *uinfo)
|
||||||
|
{
|
||||||
|
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
||||||
|
uinfo->count = 1;
|
||||||
|
uinfo->value.integer.min = 0;
|
||||||
|
uinfo->value.integer.max = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(snd_ctl_boolean_mono_info);
|
||||||
|
|
||||||
|
int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
|
||||||
|
struct snd_ctl_elem_info *uinfo)
|
||||||
|
{
|
||||||
|
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
|
||||||
|
uinfo->count = 2;
|
||||||
|
uinfo->value.integer.min = 0;
|
||||||
|
uinfo->value.integer.max = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(snd_ctl_boolean_stereo_info);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Device management routines
|
* Device management routines
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Hardware dependent layer
|
* Hardware dependent layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
#include <sound/hwdep.h>
|
#include <sound/hwdep.h>
|
||||||
#include <sound/info.h>
|
#include <sound/info.h>
|
||||||
|
|
||||||
MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
|
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
|
||||||
MODULE_DESCRIPTION("Hardware dependent layer");
|
MODULE_DESCRIPTION("Hardware dependent layer");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Information interface for ALSA driver
|
* Information interface for ALSA driver
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Information interface for ALSA driver
|
* Information interface for ALSA driver
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Initialization routines
|
* Initialization routines
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* ISA DMA support functions
|
* ISA DMA support functions
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Takashi Iwai <tiwai@suse.de>
|
* Takashi Iwai <tiwai@suse.de>
|
||||||
*
|
*
|
||||||
* Generic memory allocators
|
* Generic memory allocators
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>, Jaroslav Kysela <perex@suse.cz>");
|
MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>, Jaroslav Kysela <perex@perex.cz>");
|
||||||
MODULE_DESCRIPTION("Memory allocator for ALSA system.");
|
MODULE_DESCRIPTION("Memory allocator for ALSA system.");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
|
@ -206,6 +206,7 @@ void snd_free_pages(void *ptr, size_t size)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_HAS_DMA
|
||||||
/* allocate the coherent DMA pages */
|
/* allocate the coherent DMA pages */
|
||||||
static void *snd_malloc_dev_pages(struct device *dev, size_t size, dma_addr_t *dma)
|
static void *snd_malloc_dev_pages(struct device *dev, size_t size, dma_addr_t *dma)
|
||||||
{
|
{
|
||||||
|
@ -239,6 +240,7 @@ static void snd_free_dev_pages(struct device *dev, size_t size, void *ptr,
|
||||||
dec_snd_pages(pg);
|
dec_snd_pages(pg);
|
||||||
dma_free_coherent(dev, PAGE_SIZE << pg, ptr, dma);
|
dma_free_coherent(dev, PAGE_SIZE << pg, ptr, dma);
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_HAS_DMA */
|
||||||
|
|
||||||
#ifdef CONFIG_SBUS
|
#ifdef CONFIG_SBUS
|
||||||
|
|
||||||
|
@ -312,12 +314,14 @@ int snd_dma_alloc_pages(int type, struct device *device, size_t size,
|
||||||
dmab->area = snd_malloc_sbus_pages(device, size, &dmab->addr);
|
dmab->area = snd_malloc_sbus_pages(device, size, &dmab->addr);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_HAS_DMA
|
||||||
case SNDRV_DMA_TYPE_DEV:
|
case SNDRV_DMA_TYPE_DEV:
|
||||||
dmab->area = snd_malloc_dev_pages(device, size, &dmab->addr);
|
dmab->area = snd_malloc_dev_pages(device, size, &dmab->addr);
|
||||||
break;
|
break;
|
||||||
case SNDRV_DMA_TYPE_DEV_SG:
|
case SNDRV_DMA_TYPE_DEV_SG:
|
||||||
snd_malloc_sgbuf_pages(device, size, dmab, NULL);
|
snd_malloc_sgbuf_pages(device, size, dmab, NULL);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "snd-malloc: invalid device type %d\n", type);
|
printk(KERN_ERR "snd-malloc: invalid device type %d\n", type);
|
||||||
dmab->area = NULL;
|
dmab->area = NULL;
|
||||||
|
@ -383,12 +387,14 @@ void snd_dma_free_pages(struct snd_dma_buffer *dmab)
|
||||||
snd_free_sbus_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
|
snd_free_sbus_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_HAS_DMA
|
||||||
case SNDRV_DMA_TYPE_DEV:
|
case SNDRV_DMA_TYPE_DEV:
|
||||||
snd_free_dev_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
|
snd_free_dev_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
|
||||||
break;
|
break;
|
||||||
case SNDRV_DMA_TYPE_DEV_SG:
|
case SNDRV_DMA_TYPE_DEV_SG:
|
||||||
snd_free_sgbuf_pages(dmab);
|
snd_free_sgbuf_pages(dmab);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "snd-malloc: invalid device type %d\n", dmab->dev.type);
|
printk(KERN_ERR "snd-malloc: invalid device type %d\n", dmab->dev.type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
* Misc memory accessors
|
* Misc memory accessors
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Misc and compatibility things
|
* Misc and compatibility things
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
#
|
#
|
||||||
# Makefile for ALSA
|
# Makefile for ALSA
|
||||||
# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
|
# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
|
||||||
#
|
#
|
||||||
|
|
||||||
snd-mixer-oss-objs := mixer_oss.o
|
snd-mixer-oss-objs := mixer_oss.o
|
||||||
|
|
||||||
snd-pcm-oss-objs := pcm_oss.o pcm_plugin.o \
|
snd-pcm-oss-y := pcm_oss.o
|
||||||
io.o copy.o linear.o mulaw.o route.o rate.o
|
snd-pcm-oss-$(CONFIG_SND_PCM_OSS_PLUGINS) += pcm_plugin.o \
|
||||||
|
io.o copy.o linear.o mulaw.o route.o rate.o
|
||||||
|
|
||||||
obj-$(CONFIG_SND_MIXER_OSS) += snd-mixer-oss.o
|
obj-$(CONFIG_SND_MIXER_OSS) += snd-mixer-oss.o
|
||||||
obj-$(CONFIG_SND_PCM_OSS) += snd-pcm-oss.o
|
obj-$(CONFIG_SND_PCM_OSS) += snd-pcm-oss.o
|
||||||
|
|
|
@ -20,9 +20,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sound/driver.h>
|
#include <sound/driver.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_OSS_PLUGINS
|
|
||||||
|
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
|
@ -88,5 +85,3 @@ int snd_pcm_plugin_build_copy(struct snd_pcm_substream *plug,
|
||||||
*r_plugin = plugin;
|
*r_plugin = plugin;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* PCM I/O Plug-In Interface
|
* PCM I/O Plug-In Interface
|
||||||
* Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
|
@ -20,9 +20,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sound/driver.h>
|
#include <sound/driver.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_OSS_PLUGINS
|
|
||||||
|
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
|
@ -135,5 +132,3 @@ int snd_pcm_plugin_build_io(struct snd_pcm_substream *plug,
|
||||||
*r_plugin = plugin;
|
*r_plugin = plugin;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Linear conversion Plug-In
|
* Linear conversion Plug-In
|
||||||
* Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>,
|
* Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>,
|
||||||
* Abramo Bagnara <abramo@alsa-project.org>
|
* Abramo Bagnara <abramo@alsa-project.org>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -21,9 +21,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sound/driver.h>
|
#include <sound/driver.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_OSS_PLUGINS
|
|
||||||
|
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
|
@ -34,19 +31,34 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct linear_priv {
|
struct linear_priv {
|
||||||
int conv;
|
int cvt_endian; /* need endian conversion? */
|
||||||
|
unsigned int src_ofs; /* byte offset in source format */
|
||||||
|
unsigned int dst_ofs; /* byte soffset in destination format */
|
||||||
|
unsigned int copy_ofs; /* byte offset in temporary u32 data */
|
||||||
|
unsigned int dst_bytes; /* byte size of destination format */
|
||||||
|
unsigned int copy_bytes; /* bytes to copy per conversion */
|
||||||
|
unsigned int flip; /* MSB flip for signeness, done after endian conv */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline void do_convert(struct linear_priv *data,
|
||||||
|
unsigned char *dst, unsigned char *src)
|
||||||
|
{
|
||||||
|
unsigned int tmp = 0;
|
||||||
|
unsigned char *p = (unsigned char *)&tmp;
|
||||||
|
|
||||||
|
memcpy(p + data->copy_ofs, src + data->src_ofs, data->copy_bytes);
|
||||||
|
if (data->cvt_endian)
|
||||||
|
tmp = swab32(tmp);
|
||||||
|
tmp ^= data->flip;
|
||||||
|
memcpy(dst, p + data->dst_ofs, data->dst_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
static void convert(struct snd_pcm_plugin *plugin,
|
static void convert(struct snd_pcm_plugin *plugin,
|
||||||
const struct snd_pcm_plugin_channel *src_channels,
|
const struct snd_pcm_plugin_channel *src_channels,
|
||||||
struct snd_pcm_plugin_channel *dst_channels,
|
struct snd_pcm_plugin_channel *dst_channels,
|
||||||
snd_pcm_uframes_t frames)
|
snd_pcm_uframes_t frames)
|
||||||
{
|
{
|
||||||
#define CONV_LABELS
|
|
||||||
#include "plugin_ops.h"
|
|
||||||
#undef CONV_LABELS
|
|
||||||
struct linear_priv *data = (struct linear_priv *)plugin->extra_data;
|
struct linear_priv *data = (struct linear_priv *)plugin->extra_data;
|
||||||
void *conv = conv_labels[data->conv];
|
|
||||||
int channel;
|
int channel;
|
||||||
int nchannels = plugin->src_format.channels;
|
int nchannels = plugin->src_format.channels;
|
||||||
for (channel = 0; channel < nchannels; ++channel) {
|
for (channel = 0; channel < nchannels; ++channel) {
|
||||||
|
@ -67,11 +79,7 @@ static void convert(struct snd_pcm_plugin *plugin,
|
||||||
dst_step = dst_channels[channel].area.step / 8;
|
dst_step = dst_channels[channel].area.step / 8;
|
||||||
frames1 = frames;
|
frames1 = frames;
|
||||||
while (frames1-- > 0) {
|
while (frames1-- > 0) {
|
||||||
goto *conv;
|
do_convert(data, dst, src);
|
||||||
#define CONV_END after
|
|
||||||
#include "plugin_ops.h"
|
|
||||||
#undef CONV_END
|
|
||||||
after:
|
|
||||||
src += src_step;
|
src += src_step;
|
||||||
dst += dst_step;
|
dst += dst_step;
|
||||||
}
|
}
|
||||||
|
@ -106,29 +114,36 @@ static snd_pcm_sframes_t linear_transfer(struct snd_pcm_plugin *plugin,
|
||||||
return frames;
|
return frames;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int conv_index(int src_format, int dst_format)
|
static void init_data(struct linear_priv *data, int src_format, int dst_format)
|
||||||
{
|
{
|
||||||
int src_endian, dst_endian, sign, src_width, dst_width;
|
int src_le, dst_le, src_bytes, dst_bytes;
|
||||||
|
|
||||||
sign = (snd_pcm_format_signed(src_format) !=
|
src_bytes = snd_pcm_format_width(src_format) / 8;
|
||||||
snd_pcm_format_signed(dst_format));
|
dst_bytes = snd_pcm_format_width(dst_format) / 8;
|
||||||
#ifdef SNDRV_LITTLE_ENDIAN
|
src_le = snd_pcm_format_little_endian(src_format) > 0;
|
||||||
src_endian = snd_pcm_format_big_endian(src_format);
|
dst_le = snd_pcm_format_little_endian(dst_format) > 0;
|
||||||
dst_endian = snd_pcm_format_big_endian(dst_format);
|
|
||||||
#else
|
|
||||||
src_endian = snd_pcm_format_little_endian(src_format);
|
|
||||||
dst_endian = snd_pcm_format_little_endian(dst_format);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (src_endian < 0)
|
data->dst_bytes = dst_bytes;
|
||||||
src_endian = 0;
|
data->cvt_endian = src_le != dst_le;
|
||||||
if (dst_endian < 0)
|
data->copy_bytes = src_bytes < dst_bytes ? src_bytes : dst_bytes;
|
||||||
dst_endian = 0;
|
if (src_le) {
|
||||||
|
data->copy_ofs = 4 - data->copy_bytes;
|
||||||
src_width = snd_pcm_format_width(src_format) / 8 - 1;
|
data->src_ofs = src_bytes - data->copy_bytes;
|
||||||
dst_width = snd_pcm_format_width(dst_format) / 8 - 1;
|
} else
|
||||||
|
data->src_ofs = snd_pcm_format_physical_width(src_format) / 8 -
|
||||||
return src_width * 32 + src_endian * 16 + sign * 8 + dst_width * 2 + dst_endian;
|
src_bytes;
|
||||||
|
if (dst_le)
|
||||||
|
data->dst_ofs = 4 - data->dst_bytes;
|
||||||
|
else
|
||||||
|
data->dst_ofs = snd_pcm_format_physical_width(dst_format) / 8 -
|
||||||
|
dst_bytes;
|
||||||
|
if (snd_pcm_format_signed(src_format) !=
|
||||||
|
snd_pcm_format_signed(dst_format)) {
|
||||||
|
if (dst_le)
|
||||||
|
data->flip = cpu_to_le32(0x80000000);
|
||||||
|
else
|
||||||
|
data->flip = cpu_to_be32(0x80000000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int snd_pcm_plugin_build_linear(struct snd_pcm_substream *plug,
|
int snd_pcm_plugin_build_linear(struct snd_pcm_substream *plug,
|
||||||
|
@ -154,10 +169,8 @@ int snd_pcm_plugin_build_linear(struct snd_pcm_substream *plug,
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
data = (struct linear_priv *)plugin->extra_data;
|
data = (struct linear_priv *)plugin->extra_data;
|
||||||
data->conv = conv_index(src_format->format, dst_format->format);
|
init_data(data, src_format->format, dst_format->format);
|
||||||
plugin->transfer = linear_transfer;
|
plugin->transfer = linear_transfer;
|
||||||
*r_plugin = plugin;
|
*r_plugin = plugin;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* OSS emulation layer for the mixer interface
|
* OSS emulation layer for the mixer interface
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
#define OSS_ALSAEMULVER _SIOR ('M', 249, int)
|
#define OSS_ALSAEMULVER _SIOR ('M', 249, int)
|
||||||
|
|
||||||
MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
|
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
|
||||||
MODULE_DESCRIPTION("Mixer OSS emulation for ALSA.");
|
MODULE_DESCRIPTION("Mixer OSS emulation for ALSA.");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_MIXER);
|
MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_MIXER);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Mu-Law conversion Plug-In Interface
|
* Mu-Law conversion Plug-In Interface
|
||||||
* Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Uros Bizjak <uros@kss-loka.si>
|
* Uros Bizjak <uros@kss-loka.si>
|
||||||
*
|
*
|
||||||
* Based on reference implementation by Sun Microsystems, Inc.
|
* Based on reference implementation by Sun Microsystems, Inc.
|
||||||
|
@ -22,9 +22,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sound/driver.h>
|
#include <sound/driver.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_OSS_PLUGINS
|
|
||||||
|
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
|
@ -149,19 +146,32 @@ typedef void (*mulaw_f)(struct snd_pcm_plugin *plugin,
|
||||||
|
|
||||||
struct mulaw_priv {
|
struct mulaw_priv {
|
||||||
mulaw_f func;
|
mulaw_f func;
|
||||||
int conv;
|
int cvt_endian; /* need endian conversion? */
|
||||||
|
unsigned int native_ofs; /* byte offset in native format */
|
||||||
|
unsigned int copy_ofs; /* byte offset in s16 format */
|
||||||
|
unsigned int native_bytes; /* byte size of the native format */
|
||||||
|
unsigned int copy_bytes; /* bytes to copy per conversion */
|
||||||
|
u16 flip; /* MSB flip for signedness, done after endian conversion */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline void cvt_s16_to_native(struct mulaw_priv *data,
|
||||||
|
unsigned char *dst, u16 sample)
|
||||||
|
{
|
||||||
|
sample ^= data->flip;
|
||||||
|
if (data->cvt_endian)
|
||||||
|
sample = swab16(sample);
|
||||||
|
if (data->native_bytes > data->copy_bytes)
|
||||||
|
memset(dst, 0, data->native_bytes);
|
||||||
|
memcpy(dst + data->native_ofs, (char *)&sample + data->copy_ofs,
|
||||||
|
data->copy_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
static void mulaw_decode(struct snd_pcm_plugin *plugin,
|
static void mulaw_decode(struct snd_pcm_plugin *plugin,
|
||||||
const struct snd_pcm_plugin_channel *src_channels,
|
const struct snd_pcm_plugin_channel *src_channels,
|
||||||
struct snd_pcm_plugin_channel *dst_channels,
|
struct snd_pcm_plugin_channel *dst_channels,
|
||||||
snd_pcm_uframes_t frames)
|
snd_pcm_uframes_t frames)
|
||||||
{
|
{
|
||||||
#define PUT_S16_LABELS
|
|
||||||
#include "plugin_ops.h"
|
|
||||||
#undef PUT_S16_LABELS
|
|
||||||
struct mulaw_priv *data = (struct mulaw_priv *)plugin->extra_data;
|
struct mulaw_priv *data = (struct mulaw_priv *)plugin->extra_data;
|
||||||
void *put = put_s16_labels[data->conv];
|
|
||||||
int channel;
|
int channel;
|
||||||
int nchannels = plugin->src_format.channels;
|
int nchannels = plugin->src_format.channels;
|
||||||
for (channel = 0; channel < nchannels; ++channel) {
|
for (channel = 0; channel < nchannels; ++channel) {
|
||||||
|
@ -183,30 +193,33 @@ static void mulaw_decode(struct snd_pcm_plugin *plugin,
|
||||||
frames1 = frames;
|
frames1 = frames;
|
||||||
while (frames1-- > 0) {
|
while (frames1-- > 0) {
|
||||||
signed short sample = ulaw2linear(*src);
|
signed short sample = ulaw2linear(*src);
|
||||||
goto *put;
|
cvt_s16_to_native(data, dst, sample);
|
||||||
#define PUT_S16_END after
|
|
||||||
#include "plugin_ops.h"
|
|
||||||
#undef PUT_S16_END
|
|
||||||
after:
|
|
||||||
src += src_step;
|
src += src_step;
|
||||||
dst += dst_step;
|
dst += dst_step;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline signed short cvt_native_to_s16(struct mulaw_priv *data,
|
||||||
|
unsigned char *src)
|
||||||
|
{
|
||||||
|
u16 sample = 0;
|
||||||
|
memcpy((char *)&sample + data->copy_ofs, src + data->native_ofs,
|
||||||
|
data->copy_bytes);
|
||||||
|
if (data->cvt_endian)
|
||||||
|
sample = swab16(sample);
|
||||||
|
sample ^= data->flip;
|
||||||
|
return (signed short)sample;
|
||||||
|
}
|
||||||
|
|
||||||
static void mulaw_encode(struct snd_pcm_plugin *plugin,
|
static void mulaw_encode(struct snd_pcm_plugin *plugin,
|
||||||
const struct snd_pcm_plugin_channel *src_channels,
|
const struct snd_pcm_plugin_channel *src_channels,
|
||||||
struct snd_pcm_plugin_channel *dst_channels,
|
struct snd_pcm_plugin_channel *dst_channels,
|
||||||
snd_pcm_uframes_t frames)
|
snd_pcm_uframes_t frames)
|
||||||
{
|
{
|
||||||
#define GET_S16_LABELS
|
|
||||||
#include "plugin_ops.h"
|
|
||||||
#undef GET_S16_LABELS
|
|
||||||
struct mulaw_priv *data = (struct mulaw_priv *)plugin->extra_data;
|
struct mulaw_priv *data = (struct mulaw_priv *)plugin->extra_data;
|
||||||
void *get = get_s16_labels[data->conv];
|
|
||||||
int channel;
|
int channel;
|
||||||
int nchannels = plugin->src_format.channels;
|
int nchannels = plugin->src_format.channels;
|
||||||
signed short sample = 0;
|
|
||||||
for (channel = 0; channel < nchannels; ++channel) {
|
for (channel = 0; channel < nchannels; ++channel) {
|
||||||
char *src;
|
char *src;
|
||||||
char *dst;
|
char *dst;
|
||||||
|
@ -225,11 +238,7 @@ static void mulaw_encode(struct snd_pcm_plugin *plugin,
|
||||||
dst_step = dst_channels[channel].area.step / 8;
|
dst_step = dst_channels[channel].area.step / 8;
|
||||||
frames1 = frames;
|
frames1 = frames;
|
||||||
while (frames1-- > 0) {
|
while (frames1-- > 0) {
|
||||||
goto *get;
|
signed short sample = cvt_native_to_s16(data, src);
|
||||||
#define GET_S16_END after
|
|
||||||
#include "plugin_ops.h"
|
|
||||||
#undef GET_S16_END
|
|
||||||
after:
|
|
||||||
*dst = linear2ulaw(sample);
|
*dst = linear2ulaw(sample);
|
||||||
src += src_step;
|
src += src_step;
|
||||||
dst += dst_step;
|
dst += dst_step;
|
||||||
|
@ -265,23 +274,25 @@ static snd_pcm_sframes_t mulaw_transfer(struct snd_pcm_plugin *plugin,
|
||||||
return frames;
|
return frames;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int getput_index(int format)
|
static void init_data(struct mulaw_priv *data, int format)
|
||||||
{
|
{
|
||||||
int sign, width, endian;
|
|
||||||
sign = !snd_pcm_format_signed(format);
|
|
||||||
width = snd_pcm_format_width(format) / 8 - 1;
|
|
||||||
if (width < 0 || width > 3) {
|
|
||||||
snd_printk(KERN_ERR "snd-pcm-oss: invalid format %d\n", format);
|
|
||||||
width = 0;
|
|
||||||
}
|
|
||||||
#ifdef SNDRV_LITTLE_ENDIAN
|
#ifdef SNDRV_LITTLE_ENDIAN
|
||||||
endian = snd_pcm_format_big_endian(format);
|
data->cvt_endian = snd_pcm_format_big_endian(format) > 0;
|
||||||
#else
|
#else
|
||||||
endian = snd_pcm_format_little_endian(format);
|
data->cvt_endian = snd_pcm_format_little_endian(format) > 0;
|
||||||
#endif
|
#endif
|
||||||
if (endian < 0)
|
if (!snd_pcm_format_signed(format))
|
||||||
endian = 0;
|
data->flip = 0x8000;
|
||||||
return width * 4 + endian * 2 + sign;
|
data->native_bytes = snd_pcm_format_physical_width(format) / 8;
|
||||||
|
data->copy_bytes = data->native_bytes < 2 ? 1 : 2;
|
||||||
|
if (snd_pcm_format_little_endian(format)) {
|
||||||
|
data->native_ofs = data->native_bytes - data->copy_bytes;
|
||||||
|
data->copy_ofs = 2 - data->copy_bytes;
|
||||||
|
} else {
|
||||||
|
/* S24 in 4bytes need an 1 byte offset */
|
||||||
|
data->native_ofs = data->native_bytes -
|
||||||
|
snd_pcm_format_width(format) / 8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream *plug,
|
int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream *plug,
|
||||||
|
@ -322,11 +333,8 @@ int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream *plug,
|
||||||
return err;
|
return err;
|
||||||
data = (struct mulaw_priv *)plugin->extra_data;
|
data = (struct mulaw_priv *)plugin->extra_data;
|
||||||
data->func = func;
|
data->func = func;
|
||||||
data->conv = getput_index(format->format);
|
init_data(data, format->format);
|
||||||
snd_assert(data->conv >= 0 && data->conv < 4*2*2, return -EINVAL);
|
|
||||||
plugin->transfer = mulaw_transfer;
|
plugin->transfer = mulaw_transfer;
|
||||||
*r_plugin = plugin;
|
*r_plugin = plugin;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Digital Audio (PCM) abstract layer / OSS compatible
|
* Digital Audio (PCM) abstract layer / OSS compatible
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -48,7 +48,7 @@ static int dsp_map[SNDRV_CARDS];
|
||||||
static int adsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
|
static int adsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
|
||||||
static int nonblock_open = 1;
|
static int nonblock_open = 1;
|
||||||
|
|
||||||
MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Abramo Bagnara <abramo@alsa-project.org>");
|
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>");
|
||||||
MODULE_DESCRIPTION("PCM OSS emulation for ALSA.");
|
MODULE_DESCRIPTION("PCM OSS emulation for ALSA.");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
module_param_array(dsp_map, int, NULL, 0444);
|
module_param_array(dsp_map, int, NULL, 0444);
|
||||||
|
@ -633,6 +633,22 @@ static long snd_pcm_alsa_frames(struct snd_pcm_substream *substream, long bytes)
|
||||||
return bytes_to_frames(runtime, (buffer_size * bytes) / runtime->oss.buffer_bytes);
|
return bytes_to_frames(runtime, (buffer_size * bytes) / runtime->oss.buffer_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* define extended formats in the recent OSS versions (if any) */
|
||||||
|
/* linear formats */
|
||||||
|
#define AFMT_S32_LE 0x00001000
|
||||||
|
#define AFMT_S32_BE 0x00002000
|
||||||
|
#define AFMT_S24_LE 0x00008000
|
||||||
|
#define AFMT_S24_BE 0x00010000
|
||||||
|
#define AFMT_S24_PACKED 0x00040000
|
||||||
|
|
||||||
|
/* other supported formats */
|
||||||
|
#define AFMT_FLOAT 0x00004000
|
||||||
|
#define AFMT_SPDIF_RAW 0x00020000
|
||||||
|
|
||||||
|
/* unsupported formats */
|
||||||
|
#define AFMT_AC3 0x00000400
|
||||||
|
#define AFMT_VORBIS 0x00000800
|
||||||
|
|
||||||
static int snd_pcm_oss_format_from(int format)
|
static int snd_pcm_oss_format_from(int format)
|
||||||
{
|
{
|
||||||
switch (format) {
|
switch (format) {
|
||||||
|
@ -646,6 +662,13 @@ static int snd_pcm_oss_format_from(int format)
|
||||||
case AFMT_U16_LE: return SNDRV_PCM_FORMAT_U16_LE;
|
case AFMT_U16_LE: return SNDRV_PCM_FORMAT_U16_LE;
|
||||||
case AFMT_U16_BE: return SNDRV_PCM_FORMAT_U16_BE;
|
case AFMT_U16_BE: return SNDRV_PCM_FORMAT_U16_BE;
|
||||||
case AFMT_MPEG: return SNDRV_PCM_FORMAT_MPEG;
|
case AFMT_MPEG: return SNDRV_PCM_FORMAT_MPEG;
|
||||||
|
case AFMT_S32_LE: return SNDRV_PCM_FORMAT_S32_LE;
|
||||||
|
case AFMT_S32_BE: return SNDRV_PCM_FORMAT_S32_BE;
|
||||||
|
case AFMT_S24_LE: return SNDRV_PCM_FORMAT_S24_LE;
|
||||||
|
case AFMT_S24_BE: return SNDRV_PCM_FORMAT_S24_BE;
|
||||||
|
case AFMT_S24_PACKED: return SNDRV_PCM_FORMAT_S24_3LE;
|
||||||
|
case AFMT_FLOAT: return SNDRV_PCM_FORMAT_FLOAT;
|
||||||
|
case AFMT_SPDIF_RAW: return SNDRV_PCM_FORMAT_IEC958_SUBFRAME;
|
||||||
default: return SNDRV_PCM_FORMAT_U8;
|
default: return SNDRV_PCM_FORMAT_U8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -663,6 +686,13 @@ static int snd_pcm_oss_format_to(int format)
|
||||||
case SNDRV_PCM_FORMAT_U16_LE: return AFMT_U16_LE;
|
case SNDRV_PCM_FORMAT_U16_LE: return AFMT_U16_LE;
|
||||||
case SNDRV_PCM_FORMAT_U16_BE: return AFMT_U16_BE;
|
case SNDRV_PCM_FORMAT_U16_BE: return AFMT_U16_BE;
|
||||||
case SNDRV_PCM_FORMAT_MPEG: return AFMT_MPEG;
|
case SNDRV_PCM_FORMAT_MPEG: return AFMT_MPEG;
|
||||||
|
case SNDRV_PCM_FORMAT_S32_LE: return AFMT_S32_LE;
|
||||||
|
case SNDRV_PCM_FORMAT_S32_BE: return AFMT_S32_BE;
|
||||||
|
case SNDRV_PCM_FORMAT_S24_LE: return AFMT_S24_LE;
|
||||||
|
case SNDRV_PCM_FORMAT_S24_BE: return AFMT_S24_BE;
|
||||||
|
case SNDRV_PCM_FORMAT_S24_3LE: return AFMT_S24_PACKED;
|
||||||
|
case SNDRV_PCM_FORMAT_FLOAT: return AFMT_FLOAT;
|
||||||
|
case SNDRV_PCM_FORMAT_IEC958_SUBFRAME: return AFMT_SPDIF_RAW;
|
||||||
default: return -EINVAL;
|
default: return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1725,7 +1755,10 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file)
|
||||||
return AFMT_MU_LAW | AFMT_U8 |
|
return AFMT_MU_LAW | AFMT_U8 |
|
||||||
AFMT_S16_LE | AFMT_S16_BE |
|
AFMT_S16_LE | AFMT_S16_BE |
|
||||||
AFMT_S8 | AFMT_U16_LE |
|
AFMT_S8 | AFMT_U16_LE |
|
||||||
AFMT_U16_BE;
|
AFMT_U16_BE |
|
||||||
|
AFMT_S32_LE | AFMT_S32_BE |
|
||||||
|
AFMT_S24_LE | AFMT_S24_LE |
|
||||||
|
AFMT_S24_PACKED;
|
||||||
params = kmalloc(sizeof(*params), GFP_KERNEL);
|
params = kmalloc(sizeof(*params), GFP_KERNEL);
|
||||||
if (!params)
|
if (!params)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* PCM Plug-In shared (kernel/library) code
|
* PCM Plug-In shared (kernel/library) code
|
||||||
* Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org>
|
* Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -25,9 +25,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sound/driver.h>
|
#include <sound/driver.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_OSS_PLUGINS
|
|
||||||
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
@ -267,6 +264,8 @@ static int snd_pcm_plug_formats(struct snd_mask *mask, int format)
|
||||||
SNDRV_PCM_FMTBIT_U16_BE | SNDRV_PCM_FMTBIT_S16_BE |
|
SNDRV_PCM_FMTBIT_U16_BE | SNDRV_PCM_FMTBIT_S16_BE |
|
||||||
SNDRV_PCM_FMTBIT_U24_LE | SNDRV_PCM_FMTBIT_S24_LE |
|
SNDRV_PCM_FMTBIT_U24_LE | SNDRV_PCM_FMTBIT_S24_LE |
|
||||||
SNDRV_PCM_FMTBIT_U24_BE | SNDRV_PCM_FMTBIT_S24_BE |
|
SNDRV_PCM_FMTBIT_U24_BE | SNDRV_PCM_FMTBIT_S24_BE |
|
||||||
|
SNDRV_PCM_FMTBIT_U24_3LE | SNDRV_PCM_FMTBIT_S24_3LE |
|
||||||
|
SNDRV_PCM_FMTBIT_U24_3BE | SNDRV_PCM_FMTBIT_S24_3BE |
|
||||||
SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_S32_LE |
|
SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_S32_LE |
|
||||||
SNDRV_PCM_FMTBIT_U32_BE | SNDRV_PCM_FMTBIT_S32_BE);
|
SNDRV_PCM_FMTBIT_U32_BE | SNDRV_PCM_FMTBIT_S32_BE);
|
||||||
snd_mask_set(&formats, SNDRV_PCM_FORMAT_MU_LAW);
|
snd_mask_set(&formats, SNDRV_PCM_FORMAT_MU_LAW);
|
||||||
|
@ -283,6 +282,10 @@ static int preferred_formats[] = {
|
||||||
SNDRV_PCM_FORMAT_S16_BE,
|
SNDRV_PCM_FORMAT_S16_BE,
|
||||||
SNDRV_PCM_FORMAT_U16_LE,
|
SNDRV_PCM_FORMAT_U16_LE,
|
||||||
SNDRV_PCM_FORMAT_U16_BE,
|
SNDRV_PCM_FORMAT_U16_BE,
|
||||||
|
SNDRV_PCM_FORMAT_S24_3LE,
|
||||||
|
SNDRV_PCM_FORMAT_S24_3BE,
|
||||||
|
SNDRV_PCM_FORMAT_U24_3LE,
|
||||||
|
SNDRV_PCM_FORMAT_U24_3BE,
|
||||||
SNDRV_PCM_FORMAT_S24_LE,
|
SNDRV_PCM_FORMAT_S24_LE,
|
||||||
SNDRV_PCM_FORMAT_S24_BE,
|
SNDRV_PCM_FORMAT_S24_BE,
|
||||||
SNDRV_PCM_FORMAT_U24_LE,
|
SNDRV_PCM_FORMAT_U24_LE,
|
||||||
|
@ -297,41 +300,37 @@ static int preferred_formats[] = {
|
||||||
|
|
||||||
int snd_pcm_plug_slave_format(int format, struct snd_mask *format_mask)
|
int snd_pcm_plug_slave_format(int format, struct snd_mask *format_mask)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
if (snd_mask_test(format_mask, format))
|
if (snd_mask_test(format_mask, format))
|
||||||
return format;
|
return format;
|
||||||
if (! snd_pcm_plug_formats(format_mask, format))
|
if (! snd_pcm_plug_formats(format_mask, format))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (snd_pcm_format_linear(format)) {
|
if (snd_pcm_format_linear(format)) {
|
||||||
int width = snd_pcm_format_width(format);
|
unsigned int width = snd_pcm_format_width(format);
|
||||||
int unsignd = snd_pcm_format_unsigned(format);
|
int unsignd = snd_pcm_format_unsigned(format) > 0;
|
||||||
int big = snd_pcm_format_big_endian(format);
|
int big = snd_pcm_format_big_endian(format) > 0;
|
||||||
int format1;
|
unsigned int badness, best = -1;
|
||||||
int wid, width1=width;
|
int best_format = -1;
|
||||||
int dwidth1 = 8;
|
for (i = 0; i < ARRAY_SIZE(preferred_formats); i++) {
|
||||||
for (wid = 0; wid < 4; ++wid) {
|
int f = preferred_formats[i];
|
||||||
int end, big1 = big;
|
unsigned int w;
|
||||||
for (end = 0; end < 2; ++end) {
|
if (!snd_mask_test(format_mask, f))
|
||||||
int sgn, unsignd1 = unsignd;
|
continue;
|
||||||
for (sgn = 0; sgn < 2; ++sgn) {
|
w = snd_pcm_format_width(f);
|
||||||
format1 = snd_pcm_build_linear_format(width1, unsignd1, big1);
|
if (w >= width)
|
||||||
if (format1 >= 0 &&
|
badness = w - width;
|
||||||
snd_mask_test(format_mask, format1))
|
else
|
||||||
goto _found;
|
badness = width - w + 32;
|
||||||
unsignd1 = !unsignd1;
|
badness += snd_pcm_format_unsigned(f) != unsignd;
|
||||||
}
|
badness += snd_pcm_format_big_endian(f) != big;
|
||||||
big1 = !big1;
|
if (badness < best) {
|
||||||
|
best_format = f;
|
||||||
|
best = badness;
|
||||||
}
|
}
|
||||||
if (width1 == 32) {
|
|
||||||
dwidth1 = -dwidth1;
|
|
||||||
width1 = width;
|
|
||||||
}
|
|
||||||
width1 += dwidth1;
|
|
||||||
}
|
}
|
||||||
return -EINVAL;
|
return best_format >= 0 ? best_format : -EINVAL;
|
||||||
_found:
|
|
||||||
return format1;
|
|
||||||
} else {
|
} else {
|
||||||
unsigned int i;
|
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case SNDRV_PCM_FORMAT_MU_LAW:
|
case SNDRV_PCM_FORMAT_MU_LAW:
|
||||||
for (i = 0; i < ARRAY_SIZE(preferred_formats); ++i) {
|
for (i = 0; i < ARRAY_SIZE(preferred_formats); ++i) {
|
||||||
|
@ -740,5 +739,3 @@ int snd_pcm_area_copy(const struct snd_pcm_channel_area *src_area, size_t src_of
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Digital Audio (Plugin interface) abstract layer
|
* Digital Audio (Plugin interface) abstract layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,370 +0,0 @@
|
||||||
/*
|
|
||||||
* Plugin sample operators with fast switch
|
|
||||||
* Copyright (c) 2000 by Jaroslav Kysela <perex@suse.cz>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Library General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of
|
|
||||||
* the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define as_u8(ptr) (*(u_int8_t*)(ptr))
|
|
||||||
#define as_u16(ptr) (*(u_int16_t*)(ptr))
|
|
||||||
#define as_u32(ptr) (*(u_int32_t*)(ptr))
|
|
||||||
#define as_u64(ptr) (*(u_int64_t*)(ptr))
|
|
||||||
#define as_s8(ptr) (*(int8_t*)(ptr))
|
|
||||||
#define as_s16(ptr) (*(int16_t*)(ptr))
|
|
||||||
#define as_s32(ptr) (*(int32_t*)(ptr))
|
|
||||||
#define as_s64(ptr) (*(int64_t*)(ptr))
|
|
||||||
|
|
||||||
#ifdef COPY_LABELS
|
|
||||||
static void *copy_labels[4] = {
|
|
||||||
&©_8,
|
|
||||||
&©_16,
|
|
||||||
&©_32,
|
|
||||||
&©_64
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef COPY_END
|
|
||||||
while(0) {
|
|
||||||
copy_8: as_s8(dst) = as_s8(src); goto COPY_END;
|
|
||||||
copy_16: as_s16(dst) = as_s16(src); goto COPY_END;
|
|
||||||
copy_32: as_s32(dst) = as_s32(src); goto COPY_END;
|
|
||||||
copy_64: as_s64(dst) = as_s64(src); goto COPY_END;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONV_LABELS
|
|
||||||
/* src_wid src_endswap sign_toggle dst_wid dst_endswap */
|
|
||||||
static void *conv_labels[4 * 2 * 2 * 4 * 2] = {
|
|
||||||
&&conv_xxx1_xxx1, /* 8h -> 8h */
|
|
||||||
&&conv_xxx1_xxx1, /* 8h -> 8s */
|
|
||||||
&&conv_xxx1_xx10, /* 8h -> 16h */
|
|
||||||
&&conv_xxx1_xx01, /* 8h -> 16s */
|
|
||||||
&&conv_xxx1_x100, /* 8h -> 24h */
|
|
||||||
&&conv_xxx1_001x, /* 8h -> 24s */
|
|
||||||
&&conv_xxx1_1000, /* 8h -> 32h */
|
|
||||||
&&conv_xxx1_0001, /* 8h -> 32s */
|
|
||||||
&&conv_xxx1_xxx9, /* 8h ^> 8h */
|
|
||||||
&&conv_xxx1_xxx9, /* 8h ^> 8s */
|
|
||||||
&&conv_xxx1_xx90, /* 8h ^> 16h */
|
|
||||||
&&conv_xxx1_xx09, /* 8h ^> 16s */
|
|
||||||
&&conv_xxx1_x900, /* 8h ^> 24h */
|
|
||||||
&&conv_xxx1_009x, /* 8h ^> 24s */
|
|
||||||
&&conv_xxx1_9000, /* 8h ^> 32h */
|
|
||||||
&&conv_xxx1_0009, /* 8h ^> 32s */
|
|
||||||
&&conv_xxx1_xxx1, /* 8s -> 8h */
|
|
||||||
&&conv_xxx1_xxx1, /* 8s -> 8s */
|
|
||||||
&&conv_xxx1_xx10, /* 8s -> 16h */
|
|
||||||
&&conv_xxx1_xx01, /* 8s -> 16s */
|
|
||||||
&&conv_xxx1_x100, /* 8s -> 24h */
|
|
||||||
&&conv_xxx1_001x, /* 8s -> 24s */
|
|
||||||
&&conv_xxx1_1000, /* 8s -> 32h */
|
|
||||||
&&conv_xxx1_0001, /* 8s -> 32s */
|
|
||||||
&&conv_xxx1_xxx9, /* 8s ^> 8h */
|
|
||||||
&&conv_xxx1_xxx9, /* 8s ^> 8s */
|
|
||||||
&&conv_xxx1_xx90, /* 8s ^> 16h */
|
|
||||||
&&conv_xxx1_xx09, /* 8s ^> 16s */
|
|
||||||
&&conv_xxx1_x900, /* 8s ^> 24h */
|
|
||||||
&&conv_xxx1_009x, /* 8s ^> 24s */
|
|
||||||
&&conv_xxx1_9000, /* 8s ^> 32h */
|
|
||||||
&&conv_xxx1_0009, /* 8s ^> 32s */
|
|
||||||
&&conv_xx12_xxx1, /* 16h -> 8h */
|
|
||||||
&&conv_xx12_xxx1, /* 16h -> 8s */
|
|
||||||
&&conv_xx12_xx12, /* 16h -> 16h */
|
|
||||||
&&conv_xx12_xx21, /* 16h -> 16s */
|
|
||||||
&&conv_xx12_x120, /* 16h -> 24h */
|
|
||||||
&&conv_xx12_021x, /* 16h -> 24s */
|
|
||||||
&&conv_xx12_1200, /* 16h -> 32h */
|
|
||||||
&&conv_xx12_0021, /* 16h -> 32s */
|
|
||||||
&&conv_xx12_xxx9, /* 16h ^> 8h */
|
|
||||||
&&conv_xx12_xxx9, /* 16h ^> 8s */
|
|
||||||
&&conv_xx12_xx92, /* 16h ^> 16h */
|
|
||||||
&&conv_xx12_xx29, /* 16h ^> 16s */
|
|
||||||
&&conv_xx12_x920, /* 16h ^> 24h */
|
|
||||||
&&conv_xx12_029x, /* 16h ^> 24s */
|
|
||||||
&&conv_xx12_9200, /* 16h ^> 32h */
|
|
||||||
&&conv_xx12_0029, /* 16h ^> 32s */
|
|
||||||
&&conv_xx12_xxx2, /* 16s -> 8h */
|
|
||||||
&&conv_xx12_xxx2, /* 16s -> 8s */
|
|
||||||
&&conv_xx12_xx21, /* 16s -> 16h */
|
|
||||||
&&conv_xx12_xx12, /* 16s -> 16s */
|
|
||||||
&&conv_xx12_x210, /* 16s -> 24h */
|
|
||||||
&&conv_xx12_012x, /* 16s -> 24s */
|
|
||||||
&&conv_xx12_2100, /* 16s -> 32h */
|
|
||||||
&&conv_xx12_0012, /* 16s -> 32s */
|
|
||||||
&&conv_xx12_xxxA, /* 16s ^> 8h */
|
|
||||||
&&conv_xx12_xxxA, /* 16s ^> 8s */
|
|
||||||
&&conv_xx12_xxA1, /* 16s ^> 16h */
|
|
||||||
&&conv_xx12_xx1A, /* 16s ^> 16s */
|
|
||||||
&&conv_xx12_xA10, /* 16s ^> 24h */
|
|
||||||
&&conv_xx12_01Ax, /* 16s ^> 24s */
|
|
||||||
&&conv_xx12_A100, /* 16s ^> 32h */
|
|
||||||
&&conv_xx12_001A, /* 16s ^> 32s */
|
|
||||||
&&conv_x123_xxx1, /* 24h -> 8h */
|
|
||||||
&&conv_x123_xxx1, /* 24h -> 8s */
|
|
||||||
&&conv_x123_xx12, /* 24h -> 16h */
|
|
||||||
&&conv_x123_xx21, /* 24h -> 16s */
|
|
||||||
&&conv_x123_x123, /* 24h -> 24h */
|
|
||||||
&&conv_x123_321x, /* 24h -> 24s */
|
|
||||||
&&conv_x123_1230, /* 24h -> 32h */
|
|
||||||
&&conv_x123_0321, /* 24h -> 32s */
|
|
||||||
&&conv_x123_xxx9, /* 24h ^> 8h */
|
|
||||||
&&conv_x123_xxx9, /* 24h ^> 8s */
|
|
||||||
&&conv_x123_xx92, /* 24h ^> 16h */
|
|
||||||
&&conv_x123_xx29, /* 24h ^> 16s */
|
|
||||||
&&conv_x123_x923, /* 24h ^> 24h */
|
|
||||||
&&conv_x123_329x, /* 24h ^> 24s */
|
|
||||||
&&conv_x123_9230, /* 24h ^> 32h */
|
|
||||||
&&conv_x123_0329, /* 24h ^> 32s */
|
|
||||||
&&conv_123x_xxx3, /* 24s -> 8h */
|
|
||||||
&&conv_123x_xxx3, /* 24s -> 8s */
|
|
||||||
&&conv_123x_xx32, /* 24s -> 16h */
|
|
||||||
&&conv_123x_xx23, /* 24s -> 16s */
|
|
||||||
&&conv_123x_x321, /* 24s -> 24h */
|
|
||||||
&&conv_123x_123x, /* 24s -> 24s */
|
|
||||||
&&conv_123x_3210, /* 24s -> 32h */
|
|
||||||
&&conv_123x_0123, /* 24s -> 32s */
|
|
||||||
&&conv_123x_xxxB, /* 24s ^> 8h */
|
|
||||||
&&conv_123x_xxxB, /* 24s ^> 8s */
|
|
||||||
&&conv_123x_xxB2, /* 24s ^> 16h */
|
|
||||||
&&conv_123x_xx2B, /* 24s ^> 16s */
|
|
||||||
&&conv_123x_xB21, /* 24s ^> 24h */
|
|
||||||
&&conv_123x_12Bx, /* 24s ^> 24s */
|
|
||||||
&&conv_123x_B210, /* 24s ^> 32h */
|
|
||||||
&&conv_123x_012B, /* 24s ^> 32s */
|
|
||||||
&&conv_1234_xxx1, /* 32h -> 8h */
|
|
||||||
&&conv_1234_xxx1, /* 32h -> 8s */
|
|
||||||
&&conv_1234_xx12, /* 32h -> 16h */
|
|
||||||
&&conv_1234_xx21, /* 32h -> 16s */
|
|
||||||
&&conv_1234_x123, /* 32h -> 24h */
|
|
||||||
&&conv_1234_321x, /* 32h -> 24s */
|
|
||||||
&&conv_1234_1234, /* 32h -> 32h */
|
|
||||||
&&conv_1234_4321, /* 32h -> 32s */
|
|
||||||
&&conv_1234_xxx9, /* 32h ^> 8h */
|
|
||||||
&&conv_1234_xxx9, /* 32h ^> 8s */
|
|
||||||
&&conv_1234_xx92, /* 32h ^> 16h */
|
|
||||||
&&conv_1234_xx29, /* 32h ^> 16s */
|
|
||||||
&&conv_1234_x923, /* 32h ^> 24h */
|
|
||||||
&&conv_1234_329x, /* 32h ^> 24s */
|
|
||||||
&&conv_1234_9234, /* 32h ^> 32h */
|
|
||||||
&&conv_1234_4329, /* 32h ^> 32s */
|
|
||||||
&&conv_1234_xxx4, /* 32s -> 8h */
|
|
||||||
&&conv_1234_xxx4, /* 32s -> 8s */
|
|
||||||
&&conv_1234_xx43, /* 32s -> 16h */
|
|
||||||
&&conv_1234_xx34, /* 32s -> 16s */
|
|
||||||
&&conv_1234_x432, /* 32s -> 24h */
|
|
||||||
&&conv_1234_234x, /* 32s -> 24s */
|
|
||||||
&&conv_1234_4321, /* 32s -> 32h */
|
|
||||||
&&conv_1234_1234, /* 32s -> 32s */
|
|
||||||
&&conv_1234_xxxC, /* 32s ^> 8h */
|
|
||||||
&&conv_1234_xxxC, /* 32s ^> 8s */
|
|
||||||
&&conv_1234_xxC3, /* 32s ^> 16h */
|
|
||||||
&&conv_1234_xx3C, /* 32s ^> 16s */
|
|
||||||
&&conv_1234_xC32, /* 32s ^> 24h */
|
|
||||||
&&conv_1234_23Cx, /* 32s ^> 24s */
|
|
||||||
&&conv_1234_C321, /* 32s ^> 32h */
|
|
||||||
&&conv_1234_123C, /* 32s ^> 32s */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONV_END
|
|
||||||
while(0) {
|
|
||||||
conv_xxx1_xxx1: as_u8(dst) = as_u8(src); goto CONV_END;
|
|
||||||
conv_xxx1_xx10: as_u16(dst) = (u_int16_t)as_u8(src) << 8; goto CONV_END;
|
|
||||||
conv_xxx1_xx01: as_u16(dst) = (u_int16_t)as_u8(src); goto CONV_END;
|
|
||||||
conv_xxx1_x100: as_u32(dst) = (u_int32_t)as_u8(src) << 16; goto CONV_END;
|
|
||||||
conv_xxx1_001x: as_u32(dst) = (u_int32_t)as_u8(src) << 8; goto CONV_END;
|
|
||||||
conv_xxx1_1000: as_u32(dst) = (u_int32_t)as_u8(src) << 24; goto CONV_END;
|
|
||||||
conv_xxx1_0001: as_u32(dst) = (u_int32_t)as_u8(src); goto CONV_END;
|
|
||||||
conv_xxx1_xxx9: as_u8(dst) = as_u8(src) ^ 0x80; goto CONV_END;
|
|
||||||
conv_xxx1_xx90: as_u16(dst) = (u_int16_t)(as_u8(src) ^ 0x80) << 8; goto CONV_END;
|
|
||||||
conv_xxx1_xx09: as_u16(dst) = (u_int16_t)(as_u8(src) ^ 0x80); goto CONV_END;
|
|
||||||
conv_xxx1_x900: as_u32(dst) = (u_int32_t)(as_u8(src) ^ 0x80) << 16; goto CONV_END;
|
|
||||||
conv_xxx1_009x: as_u32(dst) = (u_int32_t)(as_u8(src) ^ 0x80) << 8; goto CONV_END;
|
|
||||||
conv_xxx1_9000: as_u32(dst) = (u_int32_t)(as_u8(src) ^ 0x80) << 24; goto CONV_END;
|
|
||||||
conv_xxx1_0009: as_u32(dst) = (u_int32_t)(as_u8(src) ^ 0x80); goto CONV_END;
|
|
||||||
conv_xx12_xxx1: as_u8(dst) = as_u16(src) >> 8; goto CONV_END;
|
|
||||||
conv_xx12_xx12: as_u16(dst) = as_u16(src); goto CONV_END;
|
|
||||||
conv_xx12_xx21: as_u16(dst) = swab16(as_u16(src)); goto CONV_END;
|
|
||||||
conv_xx12_x120: as_u32(dst) = (u_int32_t)as_u16(src) << 8; goto CONV_END;
|
|
||||||
conv_xx12_021x: as_u32(dst) = (u_int32_t)swab16(as_u16(src)) << 8; goto CONV_END;
|
|
||||||
conv_xx12_1200: as_u32(dst) = (u_int32_t)as_u16(src) << 16; goto CONV_END;
|
|
||||||
conv_xx12_0021: as_u32(dst) = (u_int32_t)swab16(as_u16(src)); goto CONV_END;
|
|
||||||
conv_xx12_xxx9: as_u8(dst) = (as_u16(src) >> 8) ^ 0x80; goto CONV_END;
|
|
||||||
conv_xx12_xx92: as_u16(dst) = as_u16(src) ^ 0x8000; goto CONV_END;
|
|
||||||
conv_xx12_xx29: as_u16(dst) = swab16(as_u16(src)) ^ 0x80; goto CONV_END;
|
|
||||||
conv_xx12_x920: as_u32(dst) = (u_int32_t)(as_u16(src) ^ 0x8000) << 8; goto CONV_END;
|
|
||||||
conv_xx12_029x: as_u32(dst) = (u_int32_t)(swab16(as_u16(src)) ^ 0x80) << 8; goto CONV_END;
|
|
||||||
conv_xx12_9200: as_u32(dst) = (u_int32_t)(as_u16(src) ^ 0x8000) << 16; goto CONV_END;
|
|
||||||
conv_xx12_0029: as_u32(dst) = (u_int32_t)(swab16(as_u16(src)) ^ 0x80); goto CONV_END;
|
|
||||||
conv_xx12_xxx2: as_u8(dst) = as_u16(src) & 0xff; goto CONV_END;
|
|
||||||
conv_xx12_x210: as_u32(dst) = (u_int32_t)swab16(as_u16(src)) << 8; goto CONV_END;
|
|
||||||
conv_xx12_012x: as_u32(dst) = (u_int32_t)as_u16(src) << 8; goto CONV_END;
|
|
||||||
conv_xx12_2100: as_u32(dst) = (u_int32_t)swab16(as_u16(src)) << 16; goto CONV_END;
|
|
||||||
conv_xx12_0012: as_u32(dst) = (u_int32_t)as_u16(src); goto CONV_END;
|
|
||||||
conv_xx12_xxxA: as_u8(dst) = (as_u16(src) ^ 0x80) & 0xff; goto CONV_END;
|
|
||||||
conv_xx12_xxA1: as_u16(dst) = swab16(as_u16(src) ^ 0x80); goto CONV_END;
|
|
||||||
conv_xx12_xx1A: as_u16(dst) = as_u16(src) ^ 0x80; goto CONV_END;
|
|
||||||
conv_xx12_xA10: as_u32(dst) = (u_int32_t)swab16(as_u16(src) ^ 0x80) << 8; goto CONV_END;
|
|
||||||
conv_xx12_01Ax: as_u32(dst) = (u_int32_t)(as_u16(src) ^ 0x80) << 8; goto CONV_END;
|
|
||||||
conv_xx12_A100: as_u32(dst) = (u_int32_t)swab16(as_u16(src) ^ 0x80) << 16; goto CONV_END;
|
|
||||||
conv_xx12_001A: as_u32(dst) = (u_int32_t)(as_u16(src) ^ 0x80); goto CONV_END;
|
|
||||||
conv_x123_xxx1: as_u8(dst) = as_u32(src) >> 16; goto CONV_END;
|
|
||||||
conv_x123_xx12: as_u16(dst) = as_u32(src) >> 8; goto CONV_END;
|
|
||||||
conv_x123_xx21: as_u16(dst) = swab16(as_u32(src) >> 8); goto CONV_END;
|
|
||||||
conv_x123_x123: as_u32(dst) = as_u32(src); goto CONV_END;
|
|
||||||
conv_x123_321x: as_u32(dst) = swab32(as_u32(src)); goto CONV_END;
|
|
||||||
conv_x123_1230: as_u32(dst) = as_u32(src) << 8; goto CONV_END;
|
|
||||||
conv_x123_0321: as_u32(dst) = swab32(as_u32(src)) >> 8; goto CONV_END;
|
|
||||||
conv_x123_xxx9: as_u8(dst) = (as_u32(src) >> 16) ^ 0x80; goto CONV_END;
|
|
||||||
conv_x123_xx92: as_u16(dst) = (as_u32(src) >> 8) ^ 0x8000; goto CONV_END;
|
|
||||||
conv_x123_xx29: as_u16(dst) = swab16(as_u32(src) >> 8) ^ 0x80; goto CONV_END;
|
|
||||||
conv_x123_x923: as_u32(dst) = as_u32(src) ^ 0x800000; goto CONV_END;
|
|
||||||
conv_x123_329x: as_u32(dst) = swab32(as_u32(src)) ^ 0x8000; goto CONV_END;
|
|
||||||
conv_x123_9230: as_u32(dst) = (as_u32(src) ^ 0x800000) << 8; goto CONV_END;
|
|
||||||
conv_x123_0329: as_u32(dst) = (swab32(as_u32(src)) >> 8) ^ 0x80; goto CONV_END;
|
|
||||||
conv_123x_xxx3: as_u8(dst) = (as_u32(src) >> 8) & 0xff; goto CONV_END;
|
|
||||||
conv_123x_xx32: as_u16(dst) = swab16(as_u32(src) >> 8); goto CONV_END;
|
|
||||||
conv_123x_xx23: as_u16(dst) = (as_u32(src) >> 8) & 0xffff; goto CONV_END;
|
|
||||||
conv_123x_x321: as_u32(dst) = swab32(as_u32(src)); goto CONV_END;
|
|
||||||
conv_123x_123x: as_u32(dst) = as_u32(src); goto CONV_END;
|
|
||||||
conv_123x_3210: as_u32(dst) = swab32(as_u32(src)) << 8; goto CONV_END;
|
|
||||||
conv_123x_0123: as_u32(dst) = as_u32(src) >> 8; goto CONV_END;
|
|
||||||
conv_123x_xxxB: as_u8(dst) = ((as_u32(src) >> 8) & 0xff) ^ 0x80; goto CONV_END;
|
|
||||||
conv_123x_xxB2: as_u16(dst) = swab16((as_u32(src) >> 8) ^ 0x80); goto CONV_END;
|
|
||||||
conv_123x_xx2B: as_u16(dst) = ((as_u32(src) >> 8) & 0xffff) ^ 0x80; goto CONV_END;
|
|
||||||
conv_123x_xB21: as_u32(dst) = swab32(as_u32(src)) ^ 0x800000; goto CONV_END;
|
|
||||||
conv_123x_12Bx: as_u32(dst) = as_u32(src) ^ 0x8000; goto CONV_END;
|
|
||||||
conv_123x_B210: as_u32(dst) = swab32(as_u32(src) ^ 0x8000) << 8; goto CONV_END;
|
|
||||||
conv_123x_012B: as_u32(dst) = (as_u32(src) >> 8) ^ 0x80; goto CONV_END;
|
|
||||||
conv_1234_xxx1: as_u8(dst) = as_u32(src) >> 24; goto CONV_END;
|
|
||||||
conv_1234_xx12: as_u16(dst) = as_u32(src) >> 16; goto CONV_END;
|
|
||||||
conv_1234_xx21: as_u16(dst) = swab16(as_u32(src) >> 16); goto CONV_END;
|
|
||||||
conv_1234_x123: as_u32(dst) = as_u32(src) >> 8; goto CONV_END;
|
|
||||||
conv_1234_321x: as_u32(dst) = swab32(as_u32(src)) << 8; goto CONV_END;
|
|
||||||
conv_1234_1234: as_u32(dst) = as_u32(src); goto CONV_END;
|
|
||||||
conv_1234_4321: as_u32(dst) = swab32(as_u32(src)); goto CONV_END;
|
|
||||||
conv_1234_xxx9: as_u8(dst) = (as_u32(src) >> 24) ^ 0x80; goto CONV_END;
|
|
||||||
conv_1234_xx92: as_u16(dst) = (as_u32(src) >> 16) ^ 0x8000; goto CONV_END;
|
|
||||||
conv_1234_xx29: as_u16(dst) = swab16(as_u32(src) >> 16) ^ 0x80; goto CONV_END;
|
|
||||||
conv_1234_x923: as_u32(dst) = (as_u32(src) >> 8) ^ 0x800000; goto CONV_END;
|
|
||||||
conv_1234_329x: as_u32(dst) = (swab32(as_u32(src)) ^ 0x80) << 8; goto CONV_END;
|
|
||||||
conv_1234_9234: as_u32(dst) = as_u32(src) ^ 0x80000000; goto CONV_END;
|
|
||||||
conv_1234_4329: as_u32(dst) = swab32(as_u32(src)) ^ 0x80; goto CONV_END;
|
|
||||||
conv_1234_xxx4: as_u8(dst) = as_u32(src) & 0xff; goto CONV_END;
|
|
||||||
conv_1234_xx43: as_u16(dst) = swab16(as_u32(src)); goto CONV_END;
|
|
||||||
conv_1234_xx34: as_u16(dst) = as_u32(src) & 0xffff; goto CONV_END;
|
|
||||||
conv_1234_x432: as_u32(dst) = swab32(as_u32(src)) >> 8; goto CONV_END;
|
|
||||||
conv_1234_234x: as_u32(dst) = as_u32(src) << 8; goto CONV_END;
|
|
||||||
conv_1234_xxxC: as_u8(dst) = (as_u32(src) & 0xff) ^ 0x80; goto CONV_END;
|
|
||||||
conv_1234_xxC3: as_u16(dst) = swab16(as_u32(src) ^ 0x80); goto CONV_END;
|
|
||||||
conv_1234_xx3C: as_u16(dst) = (as_u32(src) & 0xffff) ^ 0x80; goto CONV_END;
|
|
||||||
conv_1234_xC32: as_u32(dst) = (swab32(as_u32(src)) >> 8) ^ 0x800000; goto CONV_END;
|
|
||||||
conv_1234_23Cx: as_u32(dst) = (as_u32(src) ^ 0x80) << 8; goto CONV_END;
|
|
||||||
conv_1234_C321: as_u32(dst) = swab32(as_u32(src) ^ 0x80); goto CONV_END;
|
|
||||||
conv_1234_123C: as_u32(dst) = as_u32(src) ^ 0x80; goto CONV_END;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GET_S16_LABELS
|
|
||||||
/* src_wid src_endswap unsigned */
|
|
||||||
static void *get_s16_labels[4 * 2 * 2] = {
|
|
||||||
&&get_s16_xxx1_xx10, /* 8h -> 16h */
|
|
||||||
&&get_s16_xxx1_xx90, /* 8h ^> 16h */
|
|
||||||
&&get_s16_xxx1_xx10, /* 8s -> 16h */
|
|
||||||
&&get_s16_xxx1_xx90, /* 8s ^> 16h */
|
|
||||||
&&get_s16_xx12_xx12, /* 16h -> 16h */
|
|
||||||
&&get_s16_xx12_xx92, /* 16h ^> 16h */
|
|
||||||
&&get_s16_xx12_xx21, /* 16s -> 16h */
|
|
||||||
&&get_s16_xx12_xxA1, /* 16s ^> 16h */
|
|
||||||
&&get_s16_x123_xx12, /* 24h -> 16h */
|
|
||||||
&&get_s16_x123_xx92, /* 24h ^> 16h */
|
|
||||||
&&get_s16_123x_xx32, /* 24s -> 16h */
|
|
||||||
&&get_s16_123x_xxB2, /* 24s ^> 16h */
|
|
||||||
&&get_s16_1234_xx12, /* 32h -> 16h */
|
|
||||||
&&get_s16_1234_xx92, /* 32h ^> 16h */
|
|
||||||
&&get_s16_1234_xx43, /* 32s -> 16h */
|
|
||||||
&&get_s16_1234_xxC3, /* 32s ^> 16h */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GET_S16_END
|
|
||||||
while(0) {
|
|
||||||
get_s16_xxx1_xx10: sample = (u_int16_t)as_u8(src) << 8; goto GET_S16_END;
|
|
||||||
get_s16_xxx1_xx90: sample = (u_int16_t)(as_u8(src) ^ 0x80) << 8; goto GET_S16_END;
|
|
||||||
get_s16_xx12_xx12: sample = as_u16(src); goto GET_S16_END;
|
|
||||||
get_s16_xx12_xx92: sample = as_u16(src) ^ 0x8000; goto GET_S16_END;
|
|
||||||
get_s16_xx12_xx21: sample = swab16(as_u16(src)); goto GET_S16_END;
|
|
||||||
get_s16_xx12_xxA1: sample = swab16(as_u16(src) ^ 0x80); goto GET_S16_END;
|
|
||||||
get_s16_x123_xx12: sample = as_u32(src) >> 8; goto GET_S16_END;
|
|
||||||
get_s16_x123_xx92: sample = (as_u32(src) >> 8) ^ 0x8000; goto GET_S16_END;
|
|
||||||
get_s16_123x_xx32: sample = swab16(as_u32(src) >> 8); goto GET_S16_END;
|
|
||||||
get_s16_123x_xxB2: sample = swab16((as_u32(src) >> 8) ^ 0x8000); goto GET_S16_END;
|
|
||||||
get_s16_1234_xx12: sample = as_u32(src) >> 16; goto GET_S16_END;
|
|
||||||
get_s16_1234_xx92: sample = (as_u32(src) >> 16) ^ 0x8000; goto GET_S16_END;
|
|
||||||
get_s16_1234_xx43: sample = swab16(as_u32(src)); goto GET_S16_END;
|
|
||||||
get_s16_1234_xxC3: sample = swab16(as_u32(src) ^ 0x80); goto GET_S16_END;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PUT_S16_LABELS
|
|
||||||
/* dst_wid dst_endswap unsigned */
|
|
||||||
static void *put_s16_labels[4 * 2 * 2] = {
|
|
||||||
&&put_s16_xx12_xxx1, /* 16h -> 8h */
|
|
||||||
&&put_s16_xx12_xxx9, /* 16h ^> 8h */
|
|
||||||
&&put_s16_xx12_xxx1, /* 16h -> 8s */
|
|
||||||
&&put_s16_xx12_xxx9, /* 16h ^> 8s */
|
|
||||||
&&put_s16_xx12_xx12, /* 16h -> 16h */
|
|
||||||
&&put_s16_xx12_xx92, /* 16h ^> 16h */
|
|
||||||
&&put_s16_xx12_xx21, /* 16h -> 16s */
|
|
||||||
&&put_s16_xx12_xx29, /* 16h ^> 16s */
|
|
||||||
&&put_s16_xx12_x120, /* 16h -> 24h */
|
|
||||||
&&put_s16_xx12_x920, /* 16h ^> 24h */
|
|
||||||
&&put_s16_xx12_021x, /* 16h -> 24s */
|
|
||||||
&&put_s16_xx12_029x, /* 16h ^> 24s */
|
|
||||||
&&put_s16_xx12_1200, /* 16h -> 32h */
|
|
||||||
&&put_s16_xx12_9200, /* 16h ^> 32h */
|
|
||||||
&&put_s16_xx12_0021, /* 16h -> 32s */
|
|
||||||
&&put_s16_xx12_0029, /* 16h ^> 32s */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PUT_S16_END
|
|
||||||
while (0) {
|
|
||||||
put_s16_xx12_xxx1: as_u8(dst) = sample >> 8; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_xxx9: as_u8(dst) = (sample >> 8) ^ 0x80; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_xx12: as_u16(dst) = sample; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_xx92: as_u16(dst) = sample ^ 0x8000; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_xx21: as_u16(dst) = swab16(sample); goto PUT_S16_END;
|
|
||||||
put_s16_xx12_xx29: as_u16(dst) = swab16(sample) ^ 0x80; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_x120: as_u32(dst) = (u_int32_t)sample << 8; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_x920: as_u32(dst) = (u_int32_t)(sample ^ 0x8000) << 8; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_021x: as_u32(dst) = (u_int32_t)swab16(sample) << 8; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_029x: as_u32(dst) = (u_int32_t)(swab16(sample) ^ 0x80) << 8; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_1200: as_u32(dst) = (u_int32_t)sample << 16; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_9200: as_u32(dst) = (u_int32_t)(sample ^ 0x8000) << 16; goto PUT_S16_END;
|
|
||||||
put_s16_xx12_0021: as_u32(dst) = (u_int32_t)swab16(sample); goto PUT_S16_END;
|
|
||||||
put_s16_xx12_0029: as_u32(dst) = (u_int32_t)swab16(sample) ^ 0x80; goto PUT_S16_END;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef as_u8
|
|
||||||
#undef as_u16
|
|
||||||
#undef as_u32
|
|
||||||
#undef as_s8
|
|
||||||
#undef as_s16
|
|
||||||
#undef as_s32
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Rate conversion Plug-In
|
* Rate conversion Plug-In
|
||||||
* Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
|
@ -20,9 +20,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sound/driver.h>
|
#include <sound/driver.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_OSS_PLUGINS
|
|
||||||
|
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
|
@ -340,5 +337,3 @@ int snd_pcm_plugin_build_rate(struct snd_pcm_substream *plug,
|
||||||
*r_plugin = plugin;
|
*r_plugin = plugin;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -20,9 +20,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sound/driver.h>
|
#include <sound/driver.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_OSS_PLUGINS
|
|
||||||
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
|
@ -108,5 +105,3 @@ int snd_pcm_plugin_build_route(struct snd_pcm_substream *plug,
|
||||||
*r_plugin = plugin;
|
*r_plugin = plugin;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Digital Audio (PCM) abstract layer
|
* Digital Audio (PCM) abstract layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
#include <sound/control.h>
|
#include <sound/control.h>
|
||||||
#include <sound/info.h>
|
#include <sound/info.h>
|
||||||
|
|
||||||
MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Abramo Bagnara <abramo@alsa-project.org>");
|
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>");
|
||||||
MODULE_DESCRIPTION("Midlevel PCM code for ALSA.");
|
MODULE_DESCRIPTION("Midlevel PCM code for ALSA.");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Digital Audio (PCM) abstract layer
|
* Digital Audio (PCM) abstract layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
* Abramo Bagnara <abramo@alsa-project.org>
|
* Abramo Bagnara <abramo@alsa-project.org>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Digital Audio (PCM) abstract layer
|
* Digital Audio (PCM) abstract layer
|
||||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* PCM Interface - misc routines
|
* PCM Interface - misc routines
|
||||||
* Copyright (c) 1998 by Jaroslav Kysela <perex@suse.cz>
|
* Copyright (c) 1998 by Jaroslav Kysela <perex@perex.cz>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
|
@ -422,38 +422,6 @@ int snd_pcm_format_set_silence(snd_pcm_format_t format, void *data, unsigned int
|
||||||
|
|
||||||
EXPORT_SYMBOL(snd_pcm_format_set_silence);
|
EXPORT_SYMBOL(snd_pcm_format_set_silence);
|
||||||
|
|
||||||
/* [width][unsigned][bigendian] */
|
|
||||||
static int linear_formats[4][2][2] = {
|
|
||||||
{{ SNDRV_PCM_FORMAT_S8, SNDRV_PCM_FORMAT_S8},
|
|
||||||
{ SNDRV_PCM_FORMAT_U8, SNDRV_PCM_FORMAT_U8}},
|
|
||||||
{{SNDRV_PCM_FORMAT_S16_LE, SNDRV_PCM_FORMAT_S16_BE},
|
|
||||||
{SNDRV_PCM_FORMAT_U16_LE, SNDRV_PCM_FORMAT_U16_BE}},
|
|
||||||
{{SNDRV_PCM_FORMAT_S24_LE, SNDRV_PCM_FORMAT_S24_BE},
|
|
||||||
{SNDRV_PCM_FORMAT_U24_LE, SNDRV_PCM_FORMAT_U24_BE}},
|
|
||||||
{{SNDRV_PCM_FORMAT_S32_LE, SNDRV_PCM_FORMAT_S32_BE},
|
|
||||||
{SNDRV_PCM_FORMAT_U32_LE, SNDRV_PCM_FORMAT_U32_BE}}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* snd_pcm_build_linear_format - return the suitable linear format for the given condition
|
|
||||||
* @width: the bit-width
|
|
||||||
* @unsignd: 1 if unsigned, 0 if signed.
|
|
||||||
* @big_endian: 1 if big-endian, 0 if little-endian
|
|
||||||
*
|
|
||||||
* Returns the suitable linear format for the given condition.
|
|
||||||
*/
|
|
||||||
snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsignd, int big_endian)
|
|
||||||
{
|
|
||||||
if (width & 7)
|
|
||||||
return SND_PCM_FORMAT_UNKNOWN;
|
|
||||||
width = (width / 8) - 1;
|
|
||||||
if (width < 0 || width >= 4)
|
|
||||||
return SND_PCM_FORMAT_UNKNOWN;
|
|
||||||
return linear_formats[width][!!unsignd][!!big_endian];
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(snd_pcm_build_linear_format);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_pcm_limit_hw_rates - determine rate_min/rate_max fields
|
* snd_pcm_limit_hw_rates - determine rate_min/rate_max fields
|
||||||
* @runtime: the runtime instance
|
* @runtime: the runtime instance
|
||||||
|
@ -465,21 +433,16 @@ EXPORT_SYMBOL(snd_pcm_build_linear_format);
|
||||||
*/
|
*/
|
||||||
int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
|
int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
|
||||||
{
|
{
|
||||||
static unsigned rates[] = {
|
|
||||||
/* ATTENTION: these values depend on the definition in pcm.h! */
|
|
||||||
5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000,
|
|
||||||
64000, 88200, 96000, 176400, 192000
|
|
||||||
};
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < (int)ARRAY_SIZE(rates); i++) {
|
for (i = 0; i < (int)snd_pcm_known_rates.count; i++) {
|
||||||
if (runtime->hw.rates & (1 << i)) {
|
if (runtime->hw.rates & (1 << i)) {
|
||||||
runtime->hw.rate_min = rates[i];
|
runtime->hw.rate_min = snd_pcm_known_rates.list[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i = (int)ARRAY_SIZE(rates) - 1; i >= 0; i--) {
|
for (i = (int)snd_pcm_known_rates.count - 1; i >= 0; i--) {
|
||||||
if (runtime->hw.rates & (1 << i)) {
|
if (runtime->hw.rates & (1 << i)) {
|
||||||
runtime->hw.rate_max = rates[i];
|
runtime->hw.rate_max = snd_pcm_known_rates.list[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -487,3 +450,21 @@ int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(snd_pcm_limit_hw_rates);
|
EXPORT_SYMBOL(snd_pcm_limit_hw_rates);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* snd_pcm_rate_to_rate_bit - converts sample rate to SNDRV_PCM_RATE_xxx bit
|
||||||
|
* @rate: the sample rate to convert
|
||||||
|
*
|
||||||
|
* Returns the SNDRV_PCM_RATE_xxx flag that corresponds to the given rate, or
|
||||||
|
* SNDRV_PCM_RATE_KNOT for an unknown rate.
|
||||||
|
*/
|
||||||
|
unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < snd_pcm_known_rates.count; i++)
|
||||||
|
if (snd_pcm_known_rates.list[i] == rate)
|
||||||
|
return 1u << i;
|
||||||
|
return SNDRV_PCM_RATE_KNOT;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(snd_pcm_rate_to_rate_bit);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue