Merge git://git.kernel.org/pub/scm/linux/kernel/git/perex/alsa

This commit is contained in:
Linus Torvalds 2006-01-04 16:38:36 -08:00
commit 4da5cc2cec
457 changed files with 39575 additions and 27871 deletions

View File

@ -1883,6 +1883,7 @@ N: Jaya Kumar
E: jayalk@intworks.biz
W: http://www.intworks.biz
D: Arc monochrome LCD framebuffer driver, x86 reboot fixups
D: pirq addr, CS5535 alsa audio driver
S: Gurgaon, India
S: Kuala Lumpur, Malaysia

View File

@ -105,7 +105,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Each of top level sound card module takes the following options.
index - index (slot #) of sound card
- Values: 0 through 7 or negative
- Values: 0 through 31 or negative
- If nonnegative, assign that index number
- if negative, interpret as a bitmask of permissible
indices; the first free permitted index is assigned
@ -134,7 +134,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dma2 - second DMA # for AD1816A chip (PnP setup)
clockfreq - Clock frequency for AD1816A chip (default = 0, 33000Hz)
Module supports up to 8 cards, autoprobe and PnP.
This module supports multiple cards, autoprobe and PnP.
Module snd-ad1848
-----------------
@ -145,9 +145,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
irq - IRQ # for AD1848 chip
dma1 - DMA # for AD1848 chip (0,1,3)
Module supports up to 8 cards. This module does not support autoprobe
This module supports multiple cards. It does not support autoprobe
thus main port must be specified!!! Other ports are optional.
The power-management is supported.
Module snd-ad1889
-----------------
@ -156,7 +158,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
ac97_quirk - AC'97 workaround for strange hardware
See the description of intel8x0 module for details.
This module supports up to 8 cards.
This module supports multiple cards.
Module snd-ali5451
------------------
@ -184,7 +186,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
mpu_irq - IRQ # for MPU-401 (PnP setup)
fm_port - port # for OPL3 FM (PnP setup)
Module supports up to 8 cards, autoprobe and PnP.
This module supports multiple cards, autoprobe and PnP.
The power-management is supported.
Module snd-als4000
------------------
@ -194,7 +198,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
joystick_port - port # for legacy joystick support.
0 = disabled (default), 1 = auto-detect
Module supports up to 8 cards, autoprobe and PnP.
This module supports multiple cards, autoprobe and PnP.
The power-management is supported.
Module snd-atiixp
-----------------
@ -213,6 +219,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
implementation depends on the motherboard, and you'll need to
choose the correct one via spdif_aclink module option.
The power-management is supported.
Module snd-atiixp-modem
-----------------------
@ -223,6 +231,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Note: The default index value of this module is -2, i.e. the first
slot is excluded.
The power-management is supported.
Module snd-au8810, snd-au8820, snd-au8830
-----------------------------------------
@ -263,8 +273,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dma1 - 1st DMA # for AZT2320 (WSS) chip (PnP setup)
dma2 - 2nd DMA # for AZT2320 (WSS) chip (PnP setup)
Module supports up to 8 cards, PnP and autoprobe.
This module supports multiple cards, PnP and autoprobe.
The power-management is supported.
Module snd-azt3328
------------------
@ -272,7 +284,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
joystick - Enable joystick (default off)
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-bt87x
----------------
@ -282,7 +294,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
digital_rate - Override the default digital rate (Hz)
load_all - Load the driver even if the card model isn't known
Module supports up to 8 cards.
This module supports multiple cards.
Note: The default index value of this module is -2, i.e. the first
slot is excluded.
@ -292,7 +304,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Module for Creative Audigy LS and SB Live 24bit
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-cmi8330
@ -308,7 +320,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
sbdma8 - 8bit DMA # for CMI8330 chip (SB16)
sbdma16 - 16bit DMA # for CMI8330 chip (SB16)
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
The power-management is supported.
Module snd-cmipci
-----------------
@ -321,8 +335,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
(default = 1)
joystick_port - Joystick port address (0 = disable, 1 = auto-detect)
Module supports autoprobe and multiple chips (max 8).
This module supports autoprobe and multiple cards.
The power-management is supported.
Module snd-cs4231
-----------------
@ -335,7 +351,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dma1 - first DMA # for CS4231 chip
dma2 - second DMA # for CS4231 chip
Module supports up to 8 cards. This module does not support autoprobe
This module supports multiple cards. This module does not support autoprobe
thus main port must be specified!!! Other ports are optional.
The power-management is supported.
@ -355,7 +371,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dma2 - second DMA # for Yamaha CS4232 chip (0,1,3), -1 = disable
isapnp - ISA PnP detection - 0 = disable, 1 = enable (default)
Module supports up to 8 cards. This module does not support autoprobe
This module supports multiple cards. This module does not support autoprobe
thus main port must be specified!!! Other ports are optional.
The power-management is supported.
@ -376,7 +392,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dma2 - second DMA # for CS4236 chip (0,1,3), -1 = disable
isapnp - ISA PnP detection - 0 = disable, 1 = enable (default)
Module supports up to 8 cards. This module does not support autoprobe
This module supports multiple cards. This module does not support autoprobe
(if ISA PnP is not used) thus main port and control port must be
specified!!! Other ports are optional.
@ -389,7 +405,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dual_codec - Secondary codec ID (0 = disable, default)
Module supports up to 8 cards.
This module supports multiple cards.
The power-management is supported.
@ -403,13 +419,20 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
thinkpad - Force to enable Thinkpad's CLKRUN control.
mmap_valid - Support OSS mmap mode (default = 0).
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
Usually external amp and CLKRUN controls are detected automatically
from PCI sub vendor/device ids. If they don't work, give the options
above explicitly.
The power-management is supported.
Module snd-cs5535audio
----------------------
Module for multifunction CS5535 companion PCI device
This module supports multiple cards.
Module snd-dt019x
-----------------
@ -423,9 +446,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
mpu_irq - IRQ # for MPU-401 (PnP setup)
dma8 - DMA # (PnP setup)
Module supports up to 8 cards. This module is enabled only with
This module supports multiple cards. This module is enabled only with
ISA PnP support.
The power-management is supported.
Module snd-dummy
----------------
@ -433,6 +458,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
or input, but you may use this module for any application which
requires a sound card (like RealPlayer).
The power-management is supported.
Module snd-emu10k1
------------------
@ -450,7 +477,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
given in MB unit. Default value is 128.
enable_ir - enable IR
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
Input & Output configurations [extin/extout]
* Creative Card wo/Digital out [0x0003/0x1f03]
@ -466,12 +493,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
* Creative Card 5.1 (c) 2003 [0x3fc3/0x7cff]
* Creative Card all ins and outs [0x3fff/0x7fff]
The power-management is supported.
Module snd-emu10k1x
-------------------
Module for Creative Emu10k1X (SB Live Dell OEM version)
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-ens1370
------------------
@ -482,7 +511,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
joystick - Enable joystick (default off)
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
Module snd-ens1371
------------------
@ -495,7 +524,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
joystick_port - port # for joystick (0x200,0x208,0x210,0x218),
0 = disable (default), 1 = auto-detect
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
Module snd-es968
----------------
@ -506,8 +535,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
irq - IRQ # for ES968 (SB8) chip (PnP setup)
dma1 - DMA # for ES968 (SB8) chip (PnP setup)
Module supports up to 8 cards, PnP and autoprobe.
This module supports multiple cards, PnP and autoprobe.
The power-management is supported.
Module snd-es1688
-----------------
@ -519,7 +550,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
mpu_irq - IRQ # for MPU-401 port (5,7,9,10)
dma8 - DMA # for ES-1688 chip (0,1,3)
Module supports up to 8 cards and autoprobe (without MPU-401 port).
This module supports multiple cards and autoprobe (without MPU-401 port).
Module snd-es18xx
-----------------
@ -534,8 +565,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dma2 - first DMA # for ES-18xx chip (0,1,3)
isapnp - ISA PnP detection - 0 = disable, 1 = enable (default)
Module supports up to 8 cards ISA PnP and autoprobe (without MPU-401 port
if native ISA PnP routines are not used).
This module supports multiple cards, ISA PnP and autoprobe (without MPU-401
port if native ISA PnP routines are not used).
When dma2 is equal with dma1, the driver works as half-duplex.
The power-management is supported.
@ -545,7 +576,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Module for sound cards based on ESS Solo-1 (ES1938,ES1946) chips.
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
The power-management is supported.
Module snd-es1968
-----------------
@ -561,7 +594,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
enable_mpu - enable MPU401 (0 = off, 1 = on, 2 = auto (default))
joystick - enable joystick (default off)
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
The power-management is supported.
@ -577,8 +610,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
- High 16-bits are video (radio) device number + 1
- example: 0x10002 (MediaForte 256-PCPR, device 1)
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
The power-management is supported.
Module snd-gusclassic
---------------------
@ -592,7 +627,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
voices - GF1 voices limit (14-32)
pcm_voices - reserved PCM voices
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
Module snd-gusextreme
---------------------
@ -611,7 +646,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
voices - GF1 voices limit (14-32)
pcm_voices - reserved PCM voices
Module supports up to 8 cards and autoprobe (without MPU-401 port).
This module supports multiple cards and autoprobe (without MPU-401 port).
Module snd-gusmax
-----------------
@ -626,7 +661,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
voices - GF1 voices limit (14-32)
pcm_voices - reserved PCM voices
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
Module snd-hda-intel
--------------------
@ -688,12 +723,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
(Usually SD_LPLIB register is more accurate than the
position buffer.)
The power-management is supported.
Module snd-hdsp
---------------
Module for RME Hammerfall DSP audio interface(s)
Module supports up to 8 cards.
This module supports multiple cards.
Note: The firmware data can be automatically loaded via hotplug
when CONFIG_FW_LOADER is set. Otherwise, you need to load
@ -751,7 +788,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
cs8427_timeout - reset timeout for the CS8427 chip (S/PDIF transciever)
in msec resolution, default value is 500 (0.5 sec)
Module supports up to 8 cards and autoprobe. Note: The consumer part
This module supports multiple cards and autoprobe. Note: The consumer part
is not used with all Envy24 based cards (for example in the MidiMan Delta
serie).
@ -787,7 +824,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
aureon71, universe, k8x800, phase22, phase28, ms300,
av710
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
Note: The supported board is detected by reading EEPROM or PCI
SSID (if EEPROM isn't available). You can override the
@ -839,6 +876,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Note: The default index value of this module is -2, i.e. the first
slot is excluded.
The power-management is supported.
Module snd-interwave
--------------------
@ -855,7 +894,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
effect - 1 = InterWave effects enable (default 0);
requires 8 voices
Module supports up to 8 cards, autoprobe and ISA PnP.
This module supports multiple cards, autoprobe and ISA PnP.
Module snd-interwave-stb
------------------------
@ -875,14 +914,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
effect - 1 = InterWave effects enable (default 0);
requires 8 voices
Module supports up to 8 cards, autoprobe and ISA PnP.
This module supports multiple cards, autoprobe and ISA PnP.
Module snd-korg1212
-------------------
Module for Korg 1212 IO PCI card
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-maestro3
-------------------
@ -894,7 +933,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
-1 for default pin (8 for allegro, 1 for
others)
Module supports autoprobe and multiple chips (max 8).
This module supports autoprobe and multiple chips.
Note: the binding of amplifier is dependent on hardware.
If there is no sound even though all channels are unmuted, try to
@ -909,7 +948,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Module for Digigram miXart8 sound cards.
Module supports multiple cards.
This module supports multiple cards.
Note: One miXart8 board will be represented as 4 alsa cards.
See MIXART.txt for details.
@ -928,7 +967,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
irq - IRQ number or -1 (disable)
pnp - PnP detection - 0 = disable, 1 = enable (default)
Module supports multiple devices (max 8) and PnP.
This module supports multiple devices and PnP.
Module snd-mtpav
----------------
@ -1014,7 +1053,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dma2 - second DMA # for Yamaha OPL3-SA chip (0,1,3), -1 = disable
isapnp - ISA PnP detection - 0 = disable, 1 = enable (default)
Module supports up to 8 cards and ISA PnP. This module does not support
This module supports multiple cards and ISA PnP. It does not support
autoprobe (if ISA PnP is not used) thus all ports must be specified!!!
The power-management is supported.
@ -1064,6 +1103,13 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
This module supports only one card, autoprobe and PnP.
Module snd-pcxhr
----------------
Module for Digigram PCXHR boards
This module supports multiple cards.
Module snd-powermac (on ppc only)
---------------------------------
@ -1084,20 +1130,22 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
For ARM architecture only.
The power-management is supported.
Module snd-rme32
----------------
Module for RME Digi32, Digi32 Pro and Digi32/8 (Sek'd Prodif32,
Prodif96 and Prodif Gold) sound cards.
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-rme96
----------------
Module for RME Digi96, Digi96/8 and Digi96/8 PRO/PAD/PST sound cards.
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-rme9652
------------------
@ -1107,7 +1155,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
precise_ptr - Enable precise pointer (doesn't work reliably).
(default = 0)
Module supports up to 8 cards.
This module supports multiple cards.
Note: snd-page-alloc module does the job which snd-hammerfall-mem
module did formerly. It will allocate the buffers in advance
@ -1124,6 +1172,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Module supports only one card.
Module has no enable and index options.
The power-management is supported.
Module snd-sb8
--------------
@ -1135,8 +1185,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
irq - IRQ # for SB DSP chip (5,7,9,10)
dma8 - DMA # for SB DSP chip (1,3)
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
The power-management is supported.
Module snd-sb16 and snd-sbawe
-----------------------------
@ -1155,7 +1207,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
csp - ASP/CSP chip support - 0 = disable (default), 1 = enable
isapnp - ISA PnP detection - 0 = disable, 1 = enable (default)
Module supports up to 8 cards, autoprobe and ISA PnP.
This module supports multiple cards, autoprobe and ISA PnP.
Note: To use Vibra16X cards in 16-bit half duplex mode, you must
disable 16bit DMA with dma16 = -1 module parameter.
@ -1163,6 +1215,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
half duplex mode through 8-bit DMA channel by disabling their
16-bit DMA channel.
The power-management is supported.
Module snd-sgalaxy
------------------
@ -1173,7 +1227,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
irq - IRQ # (7,9,10,11)
dma1 - DMA #
Module supports up to 8 cards.
This module supports multiple cards.
The power-management is supported.
Module snd-sscape
-----------------
@ -1185,7 +1241,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
mpu_irq - MPU-401 IRQ # (PnP setup)
dma - DMA # (PnP setup)
Module supports up to 8 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
the microcode.
@ -1194,21 +1250,21 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Module for AMD7930 sound chips found on Sparcs.
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-sun-cs4231 (on sparc only)
-------------------------------------
Module for CS4231 sound chips found on Sparcs.
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-sun-dbri (on sparc only)
-----------------------------------
Module for DBRI sound chips found on Sparcs.
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-wavefront
--------------------
@ -1228,7 +1284,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
dma2 - DMA2 # for CS4232 PCM interface.
isapnp - ISA PnP detection - 0 = disable, 1 = enable (default)
Module supports up to 8 cards and ISA PnP.
This module supports multiple cards and ISA PnP.
Module snd-sonicvibes
---------------------
@ -1240,7 +1296,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
- SoundCard must have onboard SRAM for this.
mge - Mic Gain Enable - 1 = enable, 0 = disable (default)
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
Module snd-serial-u16550
------------------------
@ -1259,7 +1315,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
0 = Soundcanvas, 1 = MS-124T, 2 = MS-124W S/A,
3 = MS-124W M/B, 4 = Generic
Module supports up to 8 cards. This module does not support autoprobe
This module supports multiple cards. This module does not support autoprobe
thus the main port must be specified!!! Other options are optional.
Module snd-trident
@ -1278,7 +1334,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
pcm_channels - max channels (voices) reserved for PCM
wavetable_size - max wavetable size in kB (4-?kb)
Module supports up to 8 cards and autoprobe.
This module supports multiple cards and autoprobe.
The power-management is supported.
@ -1290,14 +1346,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
vid - Vendor ID for the device (optional)
pid - Product ID for the device (optional)
This module supports up to 8 cards, autoprobe and hotplugging.
This module supports multiple devices, autoprobe and hotplugging.
Module snd-usb-usx2y
--------------------
Module for Tascam USB US-122, US-224 and US-428 devices.
This module supports up to 8 cards, autoprobe and hotplugging.
This module supports multiple devices, autoprobe and hotplugging.
Note: you need to load the firmware via usx2yloader utility included
in alsa-tools and alsa-firmware packages.
@ -1356,6 +1412,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Note: for the MPU401 on VIA823x, use snd-mpu401 driver
additionally. The mpu_port option is for VIA686 chips only.
The power-management is supported.
Module snd-via82xx-modem
------------------------
@ -1368,6 +1426,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Note: The default index value of this module is -2, i.e. the first
slot is excluded.
The power-management is supported.
Module snd-virmidi
------------------
@ -1375,9 +1435,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
This module creates virtual rawmidi devices which communicate
to the corresponding ALSA sequencer ports.
midi_devs - MIDI devices # (1-8, default=4)
midi_devs - MIDI devices # (1-4, default=4)
Module supports up to 8 cards.
This module supports multiple cards.
Module snd-vx222
----------------
@ -1387,7 +1447,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
mic - Enable Microphone on V222 Mic (NYI)
ibl - Capture IBL size. (default = 0, minimum size)
Module supports up to 8 cards.
This module supports multiple cards.
When the driver is compiled as a module and the hotplug firmware
is supported, the firmware data is loaded via hotplug automatically.
@ -1406,6 +1466,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
size is chosen. The possible IBL values can be found in
/proc/asound/cardX/vx-status proc file.
The power-management is supported.
Module snd-vxpocket
-------------------
@ -1413,7 +1475,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
ibl - Capture IBL size. (default = 0, minimum size)
Module supports up to 8 cards. The module is compiled only when
This module supports multiple cards. The module is compiled only when
PCMCIA is supported on kernel.
With the older 2.6.x kernel, to activate the driver via the card
@ -1434,6 +1496,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Note2: snd-vxp440 driver is merged to snd-vxpocket driver since
ALSA 1.0.10.
The power-management is supported.
Module snd-ymfpci
-----------------
@ -1447,7 +1511,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
1 (auto-detect)
rear_switch - enable shared rear/line-in switch (bool)
Module supports autoprobe and multiple chips (max 8).
This module supports autoprobe and multiple chips.
The power-management is supported.
@ -1458,6 +1522,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Note: the driver is build only when CONFIG_ISA is set.
The power-management is supported.
AC97 Quirk Option
=================
@ -1474,7 +1540,7 @@ the proper value with this option.
The following strings are accepted:
- default Don't override the default setting
- disable Disable the quirk
- none Disable the quirk
- hp_only Bind Master and Headphone controls as a single control
- swap_hp Swap headphone and master controls
- swap_surround Swap master and surround controls

File diff suppressed because it is too large Load Diff

View File

@ -138,6 +138,22 @@ card*/codec97#0/ac97#?-?+regs
# echo 02 9f1f > /proc/asound/card0/codec97#0/ac97#0-0+regs
USB Audio Streams
-----------------
card*/stream*
Shows the assignment and the current status of each audio stream
of the given card. This information is very useful for debugging.
HD-Audio Codecs
---------------
card*/codec#*
Shows the general codec information and the attribute of each
widget node.
Sequencer Information
---------------------

View File

@ -63,7 +63,7 @@ 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
resultant bus instance.
int snd_hda_bus_new(snd_card_t *card, const struct hda_bus_template *temp,
int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp,
struct hda_bus **busp);
It returns zero if successful. A negative return value means any
@ -166,14 +166,14 @@ The ops field contains the following callback functions:
struct hda_pcm_ops {
int (*open)(struct hda_pcm_stream *info, struct hda_codec *codec,
snd_pcm_substream_t *substream);
struct snd_pcm_substream *substream);
int (*close)(struct hda_pcm_stream *info, struct hda_codec *codec,
snd_pcm_substream_t *substream);
struct snd_pcm_substream *substream);
int (*prepare)(struct hda_pcm_stream *info, struct hda_codec *codec,
unsigned int stream_tag, unsigned int format,
snd_pcm_substream_t *substream);
struct snd_pcm_substream *substream);
int (*cleanup)(struct hda_pcm_stream *info, struct hda_codec *codec,
snd_pcm_substream_t *substream);
struct snd_pcm_substream *substream);
};
All are non-NULL, so you can call them safely without NULL check.
@ -284,7 +284,7 @@ parameter, and PCI subsystem IDs. If the matching entry is found, it
returns the config field value.
snd_hda_add_new_ctls() can be used to create and add control entries.
Pass the zero-terminated array of snd_kcontrol_new_t. The same array
Pass the zero-terminated array of struct snd_kcontrol_new. The same array
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
@ -292,7 +292,7 @@ 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
used for the entry of snd_kcontrol_new_t.
used for the entry of struct snd_kcontrol_new.
The input MUX helper callbacks for such a control are provided, too:
snd_hda_input_mux_info() and snd_hda_input_mux_put(). See

View File

@ -650,6 +650,11 @@ L: linux-crypto@vger.kernel.org
T: git kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6.git
S: Maintained
CS5535 Audio ALSA driver
P: Jaya Kumar
M: jayakumar.alsa@gmail.com
S: Maintained
CYBERPRO FB DRIVER
P: Russell King
M: rmk@arm.linux.org.uk

View File

@ -69,6 +69,7 @@ static int card_probe(struct pnp_card * card, struct pnp_card_driver * drv)
return 0;
clink->card = card;
clink->driver = drv;
clink->pm_state = PMSG_ON;
if (drv->probe) {
if (drv->probe(clink, id)>=0)
return 1;
@ -333,6 +334,28 @@ void pnp_release_card_device(struct pnp_dev * dev)
up_write(&dev->dev.bus->subsys.rwsem);
}
/*
* suspend/resume callbacks
*/
static int card_suspend(struct pnp_dev *dev, pm_message_t state)
{
struct pnp_card_link *link = dev->card_link;
if (link->pm_state.event == state.event)
return 0;
link->pm_state = state;
return link->driver->suspend(link, state);
}
static int card_resume(struct pnp_dev *dev)
{
struct pnp_card_link *link = dev->card_link;
if (link->pm_state.event == PM_EVENT_ON)
return 0;
link->pm_state = PMSG_ON;
link->driver->resume(link);
return 0;
}
/**
* pnp_register_card_driver - registers a PnP card driver with the PnP Layer
* @drv: pointer to the driver to register
@ -348,6 +371,8 @@ int pnp_register_card_driver(struct pnp_card_driver * drv)
drv->link.flags = drv->flags;
drv->link.probe = NULL;
drv->link.remove = &card_remove_first;
drv->link.suspend = drv->suspend ? card_suspend : NULL;
drv->link.resume = drv->resume ? card_resume : NULL;
spin_lock(&pnp_lock);
list_add_tail(&drv->global_list, &pnp_card_drivers);

View File

@ -146,10 +146,57 @@ static int pnp_bus_match(struct device *dev, struct device_driver *drv)
return 1;
}
static int pnp_bus_suspend(struct device *dev, pm_message_t state)
{
struct pnp_dev * pnp_dev = to_pnp_dev(dev);
struct pnp_driver * pnp_drv = pnp_dev->driver;
int error;
if (!pnp_drv)
return 0;
if (pnp_drv->suspend) {
error = pnp_drv->suspend(pnp_dev, state);
if (error)
return error;
}
if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE) &&
pnp_can_disable(pnp_dev)) {
error = pnp_stop_dev(pnp_dev);
if (error)
return error;
}
return 0;
}
static int pnp_bus_resume(struct device *dev)
{
struct pnp_dev * pnp_dev = to_pnp_dev(dev);
struct pnp_driver * pnp_drv = pnp_dev->driver;
int error;
if (!pnp_drv)
return 0;
if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE)) {
error = pnp_start_dev(pnp_dev);
if (error)
return error;
}
if (pnp_drv->resume)
return pnp_drv->resume(pnp_dev);
return 0;
}
struct bus_type pnp_bus_type = {
.name = "pnp",
.match = pnp_bus_match,
.suspend = pnp_bus_suspend,
.resume = pnp_bus_resume,
};

View File

@ -470,23 +470,14 @@ int pnp_auto_config_dev(struct pnp_dev *dev)
}
/**
* pnp_activate_dev - activates a PnP device for use
* pnp_start_dev - low-level start of the PnP device
* @dev: pointer to the desired device
*
* does not validate or set resources so be careful.
* assumes that resources have alread been allocated
*/
int pnp_activate_dev(struct pnp_dev *dev)
int pnp_start_dev(struct pnp_dev *dev)
{
if (!dev)
return -EINVAL;
if (dev->active) {
return 0; /* the device is already active */
}
/* ensure resources are allocated */
if (pnp_auto_config_dev(dev))
return -EBUSY;
if (!pnp_can_write(dev)) {
pnp_info("Device %s does not supported activation.", dev->dev.bus_id);
return -EINVAL;
@ -497,9 +488,60 @@ int pnp_activate_dev(struct pnp_dev *dev)
return -EIO;
}
dev->active = 1;
pnp_info("Device %s activated.", dev->dev.bus_id);
return 0;
}
/**
* pnp_stop_dev - low-level disable of the PnP device
* @dev: pointer to the desired device
*
* does not free resources
*/
int pnp_stop_dev(struct pnp_dev *dev)
{
if (!pnp_can_disable(dev)) {
pnp_info("Device %s does not supported disabling.", dev->dev.bus_id);
return -EINVAL;
}
if (dev->protocol->disable(dev)<0) {
pnp_err("Failed to disable device %s.", dev->dev.bus_id);
return -EIO;
}
pnp_info("Device %s disabled.", dev->dev.bus_id);
return 0;
}
/**
* pnp_activate_dev - activates a PnP device for use
* @dev: pointer to the desired device
*
* does not validate or set resources so be careful.
*/
int pnp_activate_dev(struct pnp_dev *dev)
{
int error;
if (!dev)
return -EINVAL;
if (dev->active) {
return 0; /* the device is already active */
}
/* ensure resources are allocated */
if (pnp_auto_config_dev(dev))
return -EBUSY;
error = pnp_start_dev(dev);
if (error)
return error;
dev->active = 1;
return 1;
}
@ -511,23 +553,19 @@ int pnp_activate_dev(struct pnp_dev *dev)
*/
int pnp_disable_dev(struct pnp_dev *dev)
{
int error;
if (!dev)
return -EINVAL;
if (!dev->active) {
return 0; /* the device is already disabled */
}
if (!pnp_can_disable(dev)) {
pnp_info("Device %s does not supported disabling.", dev->dev.bus_id);
return -EINVAL;
}
if (dev->protocol->disable(dev)<0) {
pnp_err("Failed to disable device %s.", dev->dev.bus_id);
return -EIO;
}
error = pnp_stop_dev(dev);
if (error)
return error;
dev->active = 0;
pnp_info("Device %s disabled.", dev->dev.bus_id);
/* release the resources so that other devices can use them */
down(&pnp_res_mutex);
@ -558,6 +596,8 @@ EXPORT_SYMBOL(pnp_manual_config_dev);
#if 0
EXPORT_SYMBOL(pnp_auto_config_dev);
#endif
EXPORT_SYMBOL(pnp_start_dev);
EXPORT_SYMBOL(pnp_stop_dev);
EXPORT_SYMBOL(pnp_activate_dev);
EXPORT_SYMBOL(pnp_disable_dev);
EXPORT_SYMBOL(pnp_resource_change);

View File

@ -377,6 +377,10 @@
#define PCI_DEVICE_ID_NS_87560_USB 0x0012
#define PCI_DEVICE_ID_NS_83815 0x0020
#define PCI_DEVICE_ID_NS_83820 0x0022
#define PCI_DEVICE_ID_NS_CS5535_IDE 0x002d
#define PCI_DEVICE_ID_NS_CS5535_AUDIO 0x002e
#define PCI_DEVICE_ID_NS_CS5535_USB 0x002f
#define PCI_DEVICE_ID_NS_CS5535_VIDEO 0x0030
#define PCI_DEVICE_ID_NS_SATURN 0x0035
#define PCI_DEVICE_ID_NS_SCx200_BRIDGE 0x0500
#define PCI_DEVICE_ID_NS_SCx200_SMI 0x0501

View File

@ -162,6 +162,7 @@ struct pnp_card_link {
struct pnp_card * card;
struct pnp_card_driver * driver;
void * driver_data;
pm_message_t pm_state;
};
static inline void *pnp_get_card_drvdata (struct pnp_card_link *pcard)
@ -294,6 +295,8 @@ struct pnp_driver {
unsigned int flags;
int (*probe) (struct pnp_dev *dev, const struct pnp_device_id *dev_id);
void (*remove) (struct pnp_dev *dev);
int (*suspend) (struct pnp_dev *dev, pm_message_t state);
int (*resume) (struct pnp_dev *dev);
struct device_driver driver;
};
@ -306,6 +309,8 @@ struct pnp_card_driver {
unsigned int flags;
int (*probe) (struct pnp_card_link *card, const struct pnp_card_device_id *card_id);
void (*remove) (struct pnp_card_link *card);
int (*suspend) (struct pnp_card_link *card, pm_message_t state);
int (*resume) (struct pnp_card_link *card);
struct pnp_driver link;
};
@ -380,6 +385,8 @@ void pnp_init_resource_table(struct pnp_resource_table *table);
int pnp_manual_config_dev(struct pnp_dev *dev, struct pnp_resource_table *res, int mode);
int pnp_auto_config_dev(struct pnp_dev *dev);
int pnp_validate_config(struct pnp_dev *dev);
int pnp_start_dev(struct pnp_dev *dev);
int pnp_stop_dev(struct pnp_dev *dev);
int pnp_activate_dev(struct pnp_dev *dev);
int pnp_disable_dev(struct pnp_dev *dev);
void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size);
@ -423,6 +430,8 @@ static inline void pnp_init_resource_table(struct pnp_resource_table *table) { }
static inline int pnp_manual_config_dev(struct pnp_dev *dev, struct pnp_resource_table *res, int mode) { return -ENODEV; }
static inline int pnp_auto_config_dev(struct pnp_dev *dev) { return -ENODEV; }
static inline int pnp_validate_config(struct pnp_dev *dev) { return -ENODEV; }
static inline int pnp_start_dev(struct pnp_dev *dev) { return -ENODEV; }
static inline int pnp_stop_dev(struct pnp_dev *dev) { return -ENODEV; }
static inline int pnp_activate_dev(struct pnp_dev *dev) { return -ENODEV; }
static inline int pnp_disable_dev(struct pnp_dev *dev) { return -ENODEV; }
static inline void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size) { }

View File

@ -391,65 +391,35 @@
*
*/
typedef struct _snd_ac97_bus ac97_bus_t;
typedef struct _snd_ac97_bus_ops ac97_bus_ops_t;
typedef struct _snd_ac97_template ac97_template_t;
typedef struct _snd_ac97 ac97_t;
enum ac97_pcm_cfg {
AC97_PCM_CFG_FRONT = 2,
AC97_PCM_CFG_REAR = 10, /* alias surround */
AC97_PCM_CFG_LFE = 11, /* center + lfe */
AC97_PCM_CFG_40 = 4, /* front + rear */
AC97_PCM_CFG_51 = 6, /* front + rear + center/lfe */
AC97_PCM_CFG_SPDIF = 20
};
/* PCM allocation */
struct ac97_pcm {
ac97_bus_t *bus;
unsigned int stream: 1, /* stream type: 1 = capture */
exclusive: 1, /* exclusive mode, don't override with other pcms */
copy_flag: 1, /* lowlevel driver must fill all entries */
spdif: 1; /* spdif pcm */
unsigned short aslots; /* active slots */
unsigned int rates; /* available rates */
struct {
unsigned short slots; /* driver input: requested AC97 slot numbers */
unsigned short rslots[4]; /* allocated slots per codecs */
unsigned char rate_table[4];
ac97_t *codec[4]; /* allocated codecs */
} r[2]; /* 0 = standard rates, 1 = double rates */
unsigned long private_value; /* used by the hardware driver */
};
struct snd_ac97;
struct snd_ac97_build_ops {
int (*build_3d) (ac97_t *ac97);
int (*build_specific) (ac97_t *ac97);
int (*build_spdif) (ac97_t *ac97);
int (*build_post_spdif) (ac97_t *ac97);
int (*build_3d) (struct snd_ac97 *ac97);
int (*build_specific) (struct snd_ac97 *ac97);
int (*build_spdif) (struct snd_ac97 *ac97);
int (*build_post_spdif) (struct snd_ac97 *ac97);
#ifdef CONFIG_PM
void (*suspend) (ac97_t *ac97);
void (*resume) (ac97_t *ac97);
void (*suspend) (struct snd_ac97 *ac97);
void (*resume) (struct snd_ac97 *ac97);
#endif
void (*update_jacks) (ac97_t *ac97); /* for jack-sharing */
void (*update_jacks) (struct snd_ac97 *ac97); /* for jack-sharing */
};
struct _snd_ac97_bus_ops {
void (*reset) (ac97_t *ac97);
void (*write) (ac97_t *ac97, unsigned short reg, unsigned short val);
unsigned short (*read) (ac97_t *ac97, unsigned short reg);
void (*wait) (ac97_t *ac97);
void (*init) (ac97_t *ac97);
struct snd_ac97_bus_ops {
void (*reset) (struct snd_ac97 *ac97);
void (*write) (struct snd_ac97 *ac97, unsigned short reg, unsigned short val);
unsigned short (*read) (struct snd_ac97 *ac97, unsigned short reg);
void (*wait) (struct snd_ac97 *ac97);
void (*init) (struct snd_ac97 *ac97);
};
struct _snd_ac97_bus {
struct snd_ac97_bus {
/* -- lowlevel (hardware) driver specific -- */
ac97_bus_ops_t *ops;
struct snd_ac97_bus_ops *ops;
void *private_data;
void (*private_free) (ac97_bus_t *bus);
void (*private_free) (struct snd_ac97_bus *bus);
/* --- */
snd_card_t *card;
struct snd_card *card;
unsigned short num; /* bus number */
unsigned short no_vra: 1, /* bridge doesn't support VRA */
dra: 1, /* bridge supports double rate */
@ -459,13 +429,13 @@ struct _snd_ac97_bus {
unsigned short used_slots[2][4]; /* actually used PCM slots */
unsigned short pcms_count; /* count of PCMs */
struct ac97_pcm *pcms;
ac97_t *codec[4];
snd_info_entry_t *proc;
struct snd_ac97 *codec[4];
struct snd_info_entry *proc;
};
struct _snd_ac97_template {
struct snd_ac97_template {
void *private_data;
void (*private_free) (ac97_t *ac97);
void (*private_free) (struct snd_ac97 *ac97);
struct pci_dev *pci; /* assigned PCI device - used for quirks */
unsigned short num; /* number of codec: 0 = primary, 1 = secondary */
unsigned short addr; /* physical address of codec [0-3] */
@ -474,16 +444,16 @@ struct _snd_ac97_template {
DECLARE_BITMAP(reg_accessed, 0x80); /* bit flags */
};
struct _snd_ac97 {
struct snd_ac97 {
/* -- lowlevel (hardware) driver specific -- */
struct snd_ac97_build_ops * build_ops;
void *private_data;
void (*private_free) (ac97_t *ac97);
void (*private_free) (struct snd_ac97 *ac97);
/* --- */
ac97_bus_t *bus;
struct snd_ac97_bus *bus;
struct pci_dev *pci; /* assigned PCI device - used for quirks */
snd_info_entry_t *proc;
snd_info_entry_t *proc_regs;
struct snd_info_entry *proc;
struct snd_info_entry *proc_regs;
unsigned short subsystem_vendor;
unsigned short subsystem_device;
struct semaphore reg_mutex;
@ -517,43 +487,47 @@ struct _snd_ac97 {
struct device dev;
};
#define to_ac97_t(d) container_of(d, struct _snd_ac97, dev)
#define to_ac97_t(d) container_of(d, struct snd_ac97, dev)
/* conditions */
static inline int ac97_is_audio(ac97_t * ac97)
static inline int ac97_is_audio(struct snd_ac97 * ac97)
{
return (ac97->scaps & AC97_SCAP_AUDIO);
}
static inline int ac97_is_modem(ac97_t * ac97)
static inline int ac97_is_modem(struct snd_ac97 * ac97)
{
return (ac97->scaps & AC97_SCAP_MODEM);
}
static inline int ac97_is_rev22(ac97_t * ac97)
static inline int ac97_is_rev22(struct snd_ac97 * ac97)
{
return (ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_22;
}
static inline int ac97_can_amap(ac97_t * ac97)
static inline int ac97_can_amap(struct snd_ac97 * ac97)
{
return (ac97->ext_id & AC97_EI_AMAP) != 0;
}
static inline int ac97_can_spdif(ac97_t * ac97)
static inline int ac97_can_spdif(struct snd_ac97 * ac97)
{
return (ac97->ext_id & AC97_EI_SPDIF) != 0;
}
/* functions */
int snd_ac97_bus(snd_card_t *card, int num, ac97_bus_ops_t *ops, void *private_data, ac97_bus_t **rbus); /* create new AC97 bus */
int snd_ac97_mixer(ac97_bus_t *bus, ac97_template_t *template, ac97_t **rac97); /* create mixer controls */
const char *snd_ac97_get_short_name(ac97_t *ac97);
/* create new AC97 bus */
int snd_ac97_bus(struct snd_card *card, int num, struct snd_ac97_bus_ops *ops,
void *private_data, struct snd_ac97_bus **rbus);
/* create mixer controls */
int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template,
struct snd_ac97 **rac97);
const char *snd_ac97_get_short_name(struct snd_ac97 *ac97);
void snd_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short value);
unsigned short snd_ac97_read(ac97_t *ac97, unsigned short reg);
void snd_ac97_write_cache(ac97_t *ac97, unsigned short reg, unsigned short value);
int snd_ac97_update(ac97_t *ac97, unsigned short reg, unsigned short value);
int snd_ac97_update_bits(ac97_t *ac97, unsigned short reg, unsigned short mask, unsigned short value);
void snd_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short value);
unsigned short snd_ac97_read(struct snd_ac97 *ac97, unsigned short reg);
void snd_ac97_write_cache(struct snd_ac97 *ac97, unsigned short reg, unsigned short value);
int snd_ac97_update(struct snd_ac97 *ac97, unsigned short reg, unsigned short value);
int snd_ac97_update_bits(struct snd_ac97 *ac97, unsigned short reg, unsigned short mask, unsigned short value);
#ifdef CONFIG_PM
void snd_ac97_suspend(ac97_t *ac97);
void snd_ac97_resume(ac97_t *ac97);
void snd_ac97_suspend(struct snd_ac97 *ac97);
void snd_ac97_resume(struct snd_ac97 *ac97);
#endif
/* quirk types */
@ -567,6 +541,7 @@ enum {
AC97_TUNE_ALC_JACK, /* for Realtek, enable JACK detection */
AC97_TUNE_INV_EAPD, /* inverted EAPD implementation */
AC97_TUNE_MUTE_LED, /* EAPD bit works as mute LED */
AC97_TUNE_HP_MUTE_LED, /* EAPD bit works as mute LED, use headphone control as master */
};
struct ac97_quirk {
@ -578,24 +553,46 @@ struct ac97_quirk {
int type; /* quirk type above */
};
int snd_ac97_tune_hardware(ac97_t *ac97, struct ac97_quirk *quirk, const char *override);
int snd_ac97_set_rate(ac97_t *ac97, int reg, unsigned int rate);
int snd_ac97_tune_hardware(struct snd_ac97 *ac97, struct ac97_quirk *quirk, const char *override);
int snd_ac97_set_rate(struct snd_ac97 *ac97, int reg, unsigned int rate);
int snd_ac97_pcm_assign(ac97_bus_t *ac97,
/*
* PCM allocation
*/
enum ac97_pcm_cfg {
AC97_PCM_CFG_FRONT = 2,
AC97_PCM_CFG_REAR = 10, /* alias surround */
AC97_PCM_CFG_LFE = 11, /* center + lfe */
AC97_PCM_CFG_40 = 4, /* front + rear */
AC97_PCM_CFG_51 = 6, /* front + rear + center/lfe */
AC97_PCM_CFG_SPDIF = 20
};
struct ac97_pcm {
struct snd_ac97_bus *bus;
unsigned int stream: 1, /* stream type: 1 = capture */
exclusive: 1, /* exclusive mode, don't override with other pcms */
copy_flag: 1, /* lowlevel driver must fill all entries */
spdif: 1; /* spdif pcm */
unsigned short aslots; /* active slots */
unsigned int rates; /* available rates */
struct {
unsigned short slots; /* driver input: requested AC97 slot numbers */
unsigned short rslots[4]; /* allocated slots per codecs */
unsigned char rate_table[4];
struct snd_ac97 *codec[4]; /* allocated codecs */
} r[2]; /* 0 = standard rates, 1 = double rates */
unsigned long private_value; /* used by the hardware driver */
};
int snd_ac97_pcm_assign(struct snd_ac97_bus *ac97,
unsigned short pcms_count,
const struct ac97_pcm *pcms);
int snd_ac97_pcm_open(struct ac97_pcm *pcm, unsigned int rate,
enum ac97_pcm_cfg cfg, unsigned short slots);
int snd_ac97_pcm_close(struct ac97_pcm *pcm);
int snd_ac97_pcm_double_rate_rules(snd_pcm_runtime_t *runtime);
struct ac97_enum {
unsigned char reg;
unsigned char shift_l;
unsigned char shift_r;
unsigned short mask;
const char **texts;
};
int snd_ac97_pcm_double_rate_rules(struct snd_pcm_runtime *runtime);
/* ad hoc AC97 device driver access */
extern struct bus_type ac97_bus_type;

View File

@ -123,9 +123,7 @@
#define AD1816A_CAPTURE_NOT_EQUAL 0x1000
#define AD1816A_WSS_ENABLE 0x8000
typedef struct _snd_ad1816a ad1816a_t;
struct _snd_ad1816a {
struct snd_ad1816a {
unsigned long port;
struct resource *res_port;
int irq;
@ -140,15 +138,15 @@ struct _snd_ad1816a {
unsigned short mode;
unsigned int clock_freq;
snd_card_t *card;
snd_pcm_t *pcm;
struct snd_card *card;
struct snd_pcm *pcm;
snd_pcm_substream_t *playback_substream;
snd_pcm_substream_t *capture_substream;
struct snd_pcm_substream *playback_substream;
struct snd_pcm_substream *capture_substream;
unsigned int p_dma_size;
unsigned int c_dma_size;
snd_timer_t *timer;
struct snd_timer *timer;
};
@ -165,11 +163,11 @@ struct _snd_ad1816a {
AD1816A_MODE_TIMER)
extern int snd_ad1816a_create(snd_card_t *card, unsigned long port,
extern int snd_ad1816a_create(struct snd_card *card, unsigned long port,
int irq, int dma1, int dma2,
ad1816a_t **chip);
struct snd_ad1816a **chip);
extern int snd_ad1816a_pcm(ad1816a_t *chip, int device, snd_pcm_t **rpcm);
extern int snd_ad1816a_mixer(ad1816a_t *chip);
extern int snd_ad1816a_pcm(struct snd_ad1816a *chip, int device, struct snd_pcm **rpcm);
extern int snd_ad1816a_mixer(struct snd_ad1816a *chip);
#endif /* __SOUND_AD1816A_H */

View File

@ -127,7 +127,7 @@
#define AD1848_THINKPAD_CTL_PORT2 0x15e9
#define AD1848_THINKPAD_CS4248_ENABLE_BIT 0x02
struct _snd_ad1848 {
struct snd_ad1848 {
unsigned long port; /* i/o port */
struct resource *res_port;
int irq; /* IRQ line */
@ -137,10 +137,10 @@ struct _snd_ad1848 {
unsigned short hardware; /* see to AD1848_HW_XXXX */
unsigned short single_dma:1; /* forced single DMA mode (GUS 16-bit daughter board) or dma1 == dma2 */
snd_pcm_t *pcm;
snd_pcm_substream_t *playback_substream;
snd_pcm_substream_t *capture_substream;
snd_card_t *card;
struct snd_pcm *pcm;
struct snd_pcm_substream *playback_substream;
struct snd_pcm_substream *capture_substream;
struct snd_card *card;
unsigned char image[32]; /* SGalaxy needs an access to extended registers */
int mce_bit;
@ -148,25 +148,28 @@ struct _snd_ad1848 {
int dma_size;
int thinkpad_flag; /* Thinkpad CS4248 needs some extra help */
#ifdef CONFIG_PM
void (*suspend)(struct snd_ad1848 *chip);
void (*resume)(struct snd_ad1848 *chip);
#endif
spinlock_t reg_lock;
struct semaphore open_mutex;
};
typedef struct _snd_ad1848 ad1848_t;
/* exported functions */
void snd_ad1848_out(ad1848_t *chip, unsigned char reg, unsigned char value);
void snd_ad1848_out(struct snd_ad1848 *chip, unsigned char reg, unsigned char value);
int snd_ad1848_create(snd_card_t * card,
int snd_ad1848_create(struct snd_card *card,
unsigned long port,
int irq, int dma,
unsigned short hardware,
ad1848_t ** chip);
struct snd_ad1848 ** chip);
int snd_ad1848_pcm(ad1848_t * chip, int device, snd_pcm_t **rpcm);
const snd_pcm_ops_t *snd_ad1848_get_pcm_ops(int direction);
int snd_ad1848_mixer(ad1848_t * chip);
int snd_ad1848_pcm(struct snd_ad1848 * chip, int device, struct snd_pcm **rpcm);
const struct snd_pcm_ops *snd_ad1848_get_pcm_ops(int direction);
int snd_ad1848_mixer(struct snd_ad1848 * chip);
/* exported mixer stuffs */
enum { AD1848_MIX_SINGLE, AD1848_MIX_DOUBLE, AD1848_MIX_CAPTURE };
@ -176,7 +179,7 @@ enum { AD1848_MIX_SINGLE, AD1848_MIX_DOUBLE, AD1848_MIX_CAPTURE };
#define AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert) \
((left_reg) | ((right_reg) << 8) | ((shift_left) << 16) | ((shift_right) << 19) | ((mask) << 24) | ((invert) << 22))
int snd_ad1848_add_ctl(ad1848_t *chip, const char *name, int index, int type, unsigned long value);
int snd_ad1848_add_ctl(struct snd_ad1848 *chip, const char *name, int index, int type, unsigned long value);
/* for ease of use */
struct ad1848_mix_elem {
@ -198,7 +201,7 @@ struct ad1848_mix_elem {
.type = AD1848_MIX_DOUBLE, \
.private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert) }
static inline int snd_ad1848_add_ctl_elem(ad1848_t *chip, const struct ad1848_mix_elem *c)
static inline int snd_ad1848_add_ctl_elem(struct snd_ad1848 *chip, const struct ad1848_mix_elem *c)
{
return snd_ad1848_add_ctl(chip, c->name, c->index, c->type, c->private_value);
}

View File

@ -39,13 +39,13 @@
* FM operator
*/
typedef struct fm_operator {
struct fm_operator {
unsigned char am_vib;
unsigned char ksl_level;
unsigned char attack_decay;
unsigned char sustain_release;
unsigned char wave_select;
} fm_operator_t;
};
/*
* Instrument
@ -54,11 +54,11 @@ typedef struct fm_operator {
#define FM_PATCH_OPL2 0x01 /* OPL2 2 operators FM instrument */
#define FM_PATCH_OPL3 0x02 /* OPL3 4 operators FM instrument */
typedef struct {
struct fm_instrument {
unsigned int share_id[4]; /* share id - zero = no sharing */
unsigned char type; /* instrument type */
fm_operator_t op[4];
struct fm_operator op[4];
unsigned char feedback_connection[2];
unsigned char echo_delay;
@ -68,7 +68,7 @@ typedef struct {
unsigned char fix_dur;
unsigned char modes;
unsigned char fix_key;
} fm_instrument_t;
};
/*
*
@ -88,25 +88,25 @@ typedef struct {
* FM operator
*/
typedef struct fm_xoperator {
struct fm_xoperator {
__u8 am_vib;
__u8 ksl_level;
__u8 attack_decay;
__u8 sustain_release;
__u8 wave_select;
} fm_xoperator_t;
};
/*
* Instrument
*/
typedef struct fm_xinstrument {
struct fm_xinstrument {
__u32 stype; /* structure type */
__u32 share_id[4]; /* share id - zero = no sharing */
__u8 type; /* instrument type */
fm_xoperator_t op[4]; /* fm operators */
struct fm_xoperator op[4]; /* fm operators */
__u8 feedback_connection[2];
__u8 echo_delay;
@ -116,15 +116,19 @@ typedef struct fm_xinstrument {
__u8 fix_dur;
__u8 modes;
__u8 fix_key;
} fm_xinstrument_t;
};
#ifdef __KERNEL__
#include "seq_instr.h"
int snd_seq_fm_init(snd_seq_kinstr_ops_t * ops,
snd_seq_kinstr_ops_t * next);
int snd_seq_fm_init(struct snd_seq_kinstr_ops * ops,
struct snd_seq_kinstr_ops * next);
#endif
/* typedefs for compatibility to user-space */
typedef struct fm_xoperator fm_xoperator_t;
typedef struct fm_xinstrument fm_xinstrument_t;
#endif /* __SOUND_AINSTR_FM_H */

View File

@ -52,7 +52,7 @@
* Wavetable definitions
*/
typedef struct gf1_wave {
struct gf1_wave {
unsigned int share_id[4]; /* share id - zero = no sharing */
unsigned int format; /* wave format */
@ -88,7 +88,7 @@ typedef struct gf1_wave {
unsigned short scale_factor; /* 0-2048 or 0-2 */
struct gf1_wave *next;
} gf1_wave_t;
};
/*
* Instrument
@ -103,7 +103,7 @@ typedef struct gf1_wave {
#define IWFFFF_EFFECT_CHORUS 2
#define IWFFFF_EFFECT_ECHO 3
typedef struct {
struct gf1_instrument {
unsigned short exclusion;
unsigned short exclusion_group; /* 0 - none, 1-65535 */
@ -112,8 +112,8 @@ typedef struct {
unsigned char effect2; /* effect 2 */
unsigned char effect2_depth; /* 0-127 */
gf1_wave_t *wave; /* first waveform */
} gf1_instrument_t;
struct gf1_wave *wave; /* first waveform */
};
/*
*
@ -135,7 +135,7 @@ typedef struct {
* Wavetable definitions
*/
typedef struct gf1_xwave {
struct gf1_xwave {
__u32 stype; /* structure type */
__u32 share_id[4]; /* share id - zero = no sharing */
@ -165,13 +165,13 @@ typedef struct gf1_xwave {
__u8 vibrato_depth;
__u16 scale_frequency;
__u16 scale_factor; /* 0-2048 or 0-2 */
} gf1_xwave_t;
};
/*
* Instrument
*/
typedef struct gf1_xinstrument {
struct gf1_xinstrument {
__u32 stype;
__u16 exclusion;
@ -181,7 +181,7 @@ typedef struct gf1_xinstrument {
__u8 effect1_depth; /* 0-127 */
__u8 effect2; /* effect 2 */
__u8 effect2_depth; /* 0-127 */
} gf1_xinstrument_t;
};
/*
* Instrument info
@ -191,35 +191,39 @@ typedef struct gf1_xinstrument {
#define GF1_INFO_TREMOLO (1<<1)
#define GF1_INFO_VIBRATO (1<<2)
typedef struct gf1_info {
struct gf1_info {
unsigned char flags; /* supported wave flags */
unsigned char pad[3];
unsigned int features; /* supported features */
unsigned int max8_len; /* maximum 8-bit wave length */
unsigned int max16_len; /* maximum 16-bit wave length */
} gf1_info_t;
};
#ifdef __KERNEL__
#include "seq_instr.h"
typedef struct {
struct snd_gf1_ops {
void *private_data;
int (*info)(void *private_data, gf1_info_t *info);
int (*put_sample)(void *private_data, gf1_wave_t *wave,
int (*info)(void *private_data, struct gf1_info *info);
int (*put_sample)(void *private_data, struct gf1_wave *wave,
char __user *data, long len, int atomic);
int (*get_sample)(void *private_data, gf1_wave_t *wave,
int (*get_sample)(void *private_data, struct gf1_wave *wave,
char __user *data, long len, int atomic);
int (*remove_sample)(void *private_data, gf1_wave_t *wave,
int (*remove_sample)(void *private_data, struct gf1_wave *wave,
int atomic);
void (*notify)(void *private_data, snd_seq_kinstr_t *instr, int what);
snd_seq_kinstr_ops_t kops;
} snd_gf1_ops_t;
void (*notify)(void *private_data, struct snd_seq_kinstr *instr, int what);
struct snd_seq_kinstr_ops kops;
};
int snd_seq_gf1_init(snd_gf1_ops_t *ops,
int snd_seq_gf1_init(struct snd_gf1_ops *ops,
void *private_data,
snd_seq_kinstr_ops_t *next);
struct snd_seq_kinstr_ops *next);
#endif
/* typedefs for compatibility to user-space */
typedef struct gf1_xwave gf1_xwave_t;
typedef struct gf1_xinstrument gf1_xinstrument_t;
#endif /* __SOUND_AINSTR_GF1_H */

View File

@ -54,7 +54,7 @@
* Wavetable definitions
*/
typedef struct iwffff_wave {
struct iwffff_wave {
unsigned int share_id[4]; /* share id - zero = no sharing */
unsigned int format; /* wave format */
@ -76,7 +76,7 @@ typedef struct iwffff_wave {
unsigned char pad;
struct iwffff_wave *next;
} iwffff_wave_t;
};
/*
* Layer
@ -85,13 +85,13 @@ typedef struct iwffff_wave {
#define IWFFFF_LFO_SHAPE_TRIANGLE 0
#define IWFFFF_LFO_SHAPE_POSTRIANGLE 1
typedef struct iwffff_lfo {
struct iwffff_lfo {
unsigned short freq; /* (0-2047) 0.01Hz - 21.5Hz */
signed short depth; /* volume +- (0-255) 0.48675dB/step */
signed short sweep; /* 0 - 950 deciseconds */
unsigned char shape; /* see to IWFFFF_LFO_SHAPE_XXXX */
unsigned char delay; /* 0 - 255 deciseconds */
} iwffff_lfo_t;
};
#define IWFFFF_ENV_FLAG_RETRIGGER 0x0001 /* flag - retrigger */
@ -102,12 +102,12 @@ typedef struct iwffff_lfo {
#define IWFFFF_ENV_INDEX_VELOCITY 0x0001 /* index - velocity */
#define IWFFFF_ENV_INDEX_FREQUENCY 0x0002 /* index - frequency */
typedef struct iwffff_env_point {
struct iwffff_env_point {
unsigned short offset;
unsigned short rate;
} iwffff_env_point_t;
};
typedef struct iwffff_env_record {
struct iwffff_env_record {
unsigned short nattack;
unsigned short nrelease;
unsigned short sustain_offset;
@ -118,15 +118,15 @@ typedef struct iwffff_env_record {
struct iwffff_env_record *next;
/* points are stored here */
/* count of points = nattack + nrelease */
} iwffff_env_record_t;
};
typedef struct iwffff_env {
struct iwffff_env {
unsigned char flags;
unsigned char mode;
unsigned char index;
unsigned char pad;
struct iwffff_env_record *record;
} iwffff_env_t;
};
#define IWFFFF_LAYER_FLAG_RETRIGGER 0x0001 /* retrigger */
@ -138,7 +138,7 @@ typedef struct iwffff_env {
#define IWFFFF_LAYER_EVENT_RETRIG 0x0002 /* layer event - retrigger */
#define IWFFFF_LAYER_EVENT_LEGATO 0x0003 /* layer event - legato */
typedef struct iwffff_layer {
struct iwffff_layer {
unsigned char flags;
unsigned char velocity_mode;
unsigned char layer_event;
@ -147,17 +147,17 @@ typedef struct iwffff_layer {
unsigned char pan; /* pan offset from CC1 (0 left - 127 right) */
unsigned char pan_freq_scale; /* position based on frequency (0-127) */
unsigned char attenuation; /* 0-127 (no corresponding midi controller) */
iwffff_lfo_t tremolo; /* tremolo effect */
iwffff_lfo_t vibrato; /* vibrato effect */
struct iwffff_lfo tremolo; /* tremolo effect */
struct iwffff_lfo vibrato; /* vibrato effect */
unsigned short freq_scale; /* 0-2048, 1024 is equal to semitone scaling */
unsigned char freq_center; /* center for keyboard frequency scaling */
unsigned char pad;
iwffff_env_t penv; /* pitch envelope */
iwffff_env_t venv; /* volume envelope */
struct iwffff_env penv; /* pitch envelope */
struct iwffff_env venv; /* volume envelope */
iwffff_wave_t *wave;
struct iwffff_wave *wave;
struct iwffff_layer *next;
} iwffff_layer_t;
};
/*
* Instrument
@ -177,7 +177,7 @@ typedef struct iwffff_layer {
#define IWFFFF_EFFECT_CHORUS 2
#define IWFFFF_EFFECT_ECHO 3
typedef struct {
struct iwffff_instrument {
unsigned short exclusion;
unsigned short layer_type;
unsigned short exclusion_group; /* 0 - none, 1-65535 */
@ -187,8 +187,8 @@ typedef struct {
unsigned char effect2; /* effect 2 */
unsigned char effect2_depth; /* 0-127 */
iwffff_layer_t *layer; /* first layer */
} iwffff_instrument_t;
struct iwffff_layer *layer; /* first layer */
};
/*
*
@ -216,7 +216,7 @@ typedef struct {
* Wavetable definitions
*/
typedef struct iwffff_xwave {
struct iwffff_xwave {
__u32 stype; /* structure type */
__u32 share_id[4]; /* share id - zero = no sharing */
@ -234,26 +234,26 @@ typedef struct iwffff_xwave {
__u8 low_note; /* lower frequency range for this waveform */
__u8 high_note; /* higher frequency range for this waveform */
__u8 pad;
} iwffff_xwave_t;
};
/*
* Layer
*/
typedef struct iwffff_xlfo {
struct iwffff_xlfo {
__u16 freq; /* (0-2047) 0.01Hz - 21.5Hz */
__s16 depth; /* volume +- (0-255) 0.48675dB/step */
__s16 sweep; /* 0 - 950 deciseconds */
__u8 shape; /* see to ULTRA_IW_LFO_SHAPE_XXXX */
__u8 delay; /* 0 - 255 deciseconds */
} iwffff_xlfo_t;
};
typedef struct iwffff_xenv_point {
struct iwffff_xenv_point {
__u16 offset;
__u16 rate;
} iwffff_xenv_point_t;
};
typedef struct iwffff_xenv_record {
struct iwffff_xenv_record {
__u32 stype;
__u16 nattack;
__u16 nrelease;
@ -264,16 +264,16 @@ typedef struct iwffff_xenv_record {
__u8 pad;
/* points are stored here.. */
/* count of points = nattack + nrelease */
} iwffff_xenv_record_t;
};
typedef struct iwffff_xenv {
struct iwffff_xenv {
__u8 flags;
__u8 mode;
__u8 index;
__u8 pad;
} iwffff_xenv_t;
};
typedef struct iwffff_xlayer {
struct iwffff_xlayer {
__u32 stype;
__u8 flags;
__u8 velocity_mode;
@ -283,20 +283,20 @@ typedef struct iwffff_xlayer {
__u8 pan; /* pan offset from CC1 (0 left - 127 right) */
__u8 pan_freq_scale; /* position based on frequency (0-127) */
__u8 attenuation; /* 0-127 (no corresponding midi controller) */
iwffff_xlfo_t tremolo; /* tremolo effect */
iwffff_xlfo_t vibrato; /* vibrato effect */
struct iwffff_xlfo tremolo; /* tremolo effect */
struct iwffff_xlfo vibrato; /* vibrato effect */
__u16 freq_scale; /* 0-2048, 1024 is equal to semitone scaling */
__u8 freq_center; /* center for keyboard frequency scaling */
__u8 pad;
iwffff_xenv_t penv; /* pitch envelope */
iwffff_xenv_t venv; /* volume envelope */
} iwffff_xlayer_t;
struct iwffff_xenv penv; /* pitch envelope */
struct iwffff_xenv venv; /* volume envelope */
};
/*
* Instrument
*/
typedef struct iwffff_xinstrument {
struct iwffff_xinstrument {
__u32 stype;
__u16 exclusion;
@ -307,7 +307,7 @@ typedef struct iwffff_xinstrument {
__u8 effect1_depth; /* 0-127 */
__u8 effect2; /* effect 2 */
__u8 effect2_depth; /* 0-127 */
} iwffff_xinstrument_t;
};
/*
* ROM support
@ -316,7 +316,7 @@ typedef struct iwffff_xinstrument {
#define IWFFFF_ROM_HDR_SIZE 512
typedef struct {
struct iwffff_rom_header {
__u8 iwave[8];
__u8 revision;
__u8 series_number;
@ -328,7 +328,7 @@ typedef struct {
__u8 copyright[128];
__u8 vendor_name[64];
__u8 description[128];
} iwffff_rom_header_t;
};
/*
* Instrument info
@ -339,35 +339,46 @@ typedef struct {
#define IWFFFF_INFO_LFO_TREMOLO (1<<2)
#define IWFFFF_INFO_LFO_TREMOLO_SHAPE (1<<3)
typedef struct iwffff_info {
struct iwffff_info {
unsigned int format; /* supported format bits */
unsigned int effects; /* supported effects (1 << IWFFFF_EFFECT*) */
unsigned int lfos; /* LFO effects */
unsigned int max8_len; /* maximum 8-bit wave length */
unsigned int max16_len; /* maximum 16-bit wave length */
} iwffff_info_t;
};
#ifdef __KERNEL__
#include "seq_instr.h"
typedef struct {
struct snd_iwffff_ops {
void *private_data;
int (*info)(void *private_data, iwffff_info_t *info);
int (*put_sample)(void *private_data, iwffff_wave_t *wave,
int (*info)(void *private_data, struct iwffff_info *info);
int (*put_sample)(void *private_data, struct iwffff_wave *wave,
char __user *data, long len, int atomic);
int (*get_sample)(void *private_data, iwffff_wave_t *wave,
int (*get_sample)(void *private_data, struct iwffff_wave *wave,
char __user *data, long len, int atomic);
int (*remove_sample)(void *private_data, iwffff_wave_t *wave,
int (*remove_sample)(void *private_data, struct iwffff_wave *wave,
int atomic);
void (*notify)(void *private_data, snd_seq_kinstr_t *instr, int what);
snd_seq_kinstr_ops_t kops;
} snd_iwffff_ops_t;
void (*notify)(void *private_data, struct snd_seq_kinstr *instr, int what);
struct snd_seq_kinstr_ops kops;
};
int snd_seq_iwffff_init(snd_iwffff_ops_t *ops,
int snd_seq_iwffff_init(struct snd_iwffff_ops *ops,
void *private_data,
snd_seq_kinstr_ops_t *next);
struct snd_seq_kinstr_ops *next);
#endif
/* typedefs for compatibility to user-space */
typedef struct iwffff_xwave iwffff_xwave_t;
typedef struct iwffff_xlfo iwffff_xlfo_t;
typedef struct iwffff_xenv_point iwffff_xenv_point_t;
typedef struct iwffff_xenv_record iwffff_xenv_record_t;
typedef struct iwffff_xenv iwffff_xenv_t;
typedef struct iwffff_xlayer iwffff_xlayer_t;
typedef struct iwffff_xinstrument iwffff_xinstrument_t;
typedef struct iwffff_rom_header iwffff_rom_header_t;
typedef struct iwffff_info iwffff_info_t;
#endif /* __SOUND_AINSTR_IW_H */

View File

@ -61,18 +61,18 @@
* instrument info
*/
typedef struct simple_instrument_info {
struct simple_instrument_info {
unsigned int format; /* supported format bits */
unsigned int effects; /* supported effects (1 << SIMPLE_EFFECT_*) */
unsigned int max8_len; /* maximum 8-bit wave length */
unsigned int max16_len; /* maximum 16-bit wave length */
} simple_instrument_info_t;
};
/*
* Instrument
*/
typedef struct {
struct simple_instrument {
unsigned int share_id[4]; /* share id - zero = no sharing */
unsigned int format; /* wave format */
@ -92,7 +92,7 @@ typedef struct {
unsigned char effect1_depth; /* 0-127 */
unsigned char effect2; /* effect 2 */
unsigned char effect2_depth; /* 0-127 */
} simple_instrument_t;
};
/*
*
@ -112,7 +112,7 @@ typedef struct {
* Instrument
*/
typedef struct simple_xinstrument {
struct simple_xinstrument {
__u32 stype;
__u32 share_id[4]; /* share id - zero = no sharing */
@ -128,29 +128,32 @@ typedef struct simple_xinstrument {
__u8 effect1_depth; /* 0-127 */
__u8 effect2; /* effect 2 */
__u8 effect2_depth; /* 0-127 */
} simple_xinstrument_t;
};
#ifdef __KERNEL__
#include "seq_instr.h"
typedef struct {
struct snd_simple_ops {
void *private_data;
int (*info)(void *private_data, simple_instrument_info_t *info);
int (*put_sample)(void *private_data, simple_instrument_t *instr,
int (*info)(void *private_data, struct simple_instrument_info *info);
int (*put_sample)(void *private_data, struct simple_instrument *instr,
char __user *data, long len, int atomic);
int (*get_sample)(void *private_data, simple_instrument_t *instr,
int (*get_sample)(void *private_data, struct simple_instrument *instr,
char __user *data, long len, int atomic);
int (*remove_sample)(void *private_data, simple_instrument_t *instr,
int (*remove_sample)(void *private_data, struct simple_instrument *instr,
int atomic);
void (*notify)(void *private_data, snd_seq_kinstr_t *instr, int what);
snd_seq_kinstr_ops_t kops;
} snd_simple_ops_t;
void (*notify)(void *private_data, struct snd_seq_kinstr *instr, int what);
struct snd_seq_kinstr_ops kops;
};
int snd_seq_simple_init(snd_simple_ops_t *ops,
int snd_seq_simple_init(struct snd_simple_ops *ops,
void *private_data,
snd_seq_kinstr_ops_t *next);
struct snd_seq_kinstr_ops *next);
#endif
/* typedefs for compatibility to user-space */
typedef struct simple_xinstrument simple_xinstrument_t;
#endif /* __SOUND_AINSTR_SIMPLE_H */

View File

@ -163,10 +163,8 @@
typedef void (ak4114_write_t)(void *private_data, unsigned char addr, unsigned char data);
typedef unsigned char (ak4114_read_t)(void *private_data, unsigned char addr);
typedef struct ak4114 ak4114_t;
struct ak4114 {
snd_card_t * card;
struct snd_card *card;
ak4114_write_t * write;
ak4114_read_t * read;
void * private_data;
@ -174,9 +172,9 @@ struct ak4114 {
spinlock_t lock;
unsigned char regmap[7];
unsigned char txcsb[5];
snd_kcontrol_t *kctls[AK4114_CONTROLS];
snd_pcm_substream_t *playback_substream;
snd_pcm_substream_t *capture_substream;
struct snd_kcontrol *kctls[AK4114_CONTROLS];
struct snd_pcm_substream *playback_substream;
struct snd_pcm_substream *capture_substream;
unsigned long parity_errors;
unsigned long v_bit_errors;
unsigned long qcrc_errors;
@ -186,20 +184,20 @@ struct ak4114 {
struct workqueue_struct *workqueue;
struct work_struct work;
void *change_callback_private;
void (*change_callback)(ak4114_t *ak4114, unsigned char c0, unsigned char c1);
void (*change_callback)(struct ak4114 *ak4114, unsigned char c0, unsigned char c1);
};
int snd_ak4114_create(snd_card_t *card,
int snd_ak4114_create(struct snd_card *card,
ak4114_read_t *read, ak4114_write_t *write,
unsigned char pgm[7], unsigned char txcsb[5],
void *private_data, ak4114_t **r_ak4114);
void snd_ak4114_reg_write(ak4114_t *ak4114, unsigned char reg, unsigned char mask, unsigned char val);
void snd_ak4114_reinit(ak4114_t *ak4114);
int snd_ak4114_build(ak4114_t *ak4114,
snd_pcm_substream_t *playback_substream,
snd_pcm_substream_t *capture_substream);
int snd_ak4114_external_rate(ak4114_t *ak4114);
int snd_ak4114_check_rate_and_errors(ak4114_t *ak4114, unsigned int flags);
void *private_data, struct ak4114 **r_ak4114);
void snd_ak4114_reg_write(struct ak4114 *ak4114, unsigned char reg, unsigned char mask, unsigned char val);
void snd_ak4114_reinit(struct ak4114 *ak4114);
int snd_ak4114_build(struct ak4114 *ak4114,
struct snd_pcm_substream *playback_substream,
struct snd_pcm_substream *capture_substream);
int snd_ak4114_external_rate(struct ak4114 *ak4114);
int snd_ak4114_check_rate_and_errors(struct ak4114 *ak4114, unsigned int flags);
#endif /* __SOUND_AK4114_H */

View File

@ -155,18 +155,16 @@
typedef void (ak4117_write_t)(void *private_data, unsigned char addr, unsigned char data);
typedef unsigned char (ak4117_read_t)(void *private_data, unsigned char addr);
typedef struct ak4117 ak4117_t;
struct ak4117 {
snd_card_t * card;
struct snd_card *card;
ak4117_write_t * write;
ak4117_read_t * read;
void * private_data;
unsigned int init: 1;
spinlock_t lock;
unsigned char regmap[5];
snd_kcontrol_t *kctls[AK4117_CONTROLS];
snd_pcm_substream_t *substream;
struct snd_kcontrol *kctls[AK4117_CONTROLS];
struct snd_pcm_substream *substream;
unsigned long parity_errors;
unsigned long v_bit_errors;
unsigned long qcrc_errors;
@ -176,16 +174,16 @@ struct ak4117 {
unsigned char rcs2;
struct timer_list timer; /* statistic timer */
void *change_callback_private;
void (*change_callback)(ak4117_t *ak4117, unsigned char c0, unsigned char c1);
void (*change_callback)(struct ak4117 *ak4117, unsigned char c0, unsigned char c1);
};
int snd_ak4117_create(snd_card_t *card, ak4117_read_t *read, ak4117_write_t *write,
unsigned char pgm[5], void *private_data, ak4117_t **r_ak4117);
void snd_ak4117_reg_write(ak4117_t *ak4117, unsigned char reg, unsigned char mask, unsigned char val);
void snd_ak4117_reinit(ak4117_t *ak4117);
int snd_ak4117_build(ak4117_t *ak4117, snd_pcm_substream_t *capture_substream);
int snd_ak4117_external_rate(ak4117_t *ak4117);
int snd_ak4117_check_rate_and_errors(ak4117_t *ak4117, unsigned int flags);
int snd_ak4117_create(struct snd_card *card, ak4117_read_t *read, ak4117_write_t *write,
unsigned char pgm[5], void *private_data, struct ak4117 **r_ak4117);
void snd_ak4117_reg_write(struct ak4117 *ak4117, unsigned char reg, unsigned char mask, unsigned char val);
void snd_ak4117_reinit(struct ak4117 *ak4117);
int snd_ak4117_build(struct ak4117 *ak4117, struct snd_pcm_substream *capture_substream);
int snd_ak4117_external_rate(struct ak4117 *ak4117);
int snd_ak4117_check_rate_and_errors(struct ak4117 *ak4117, unsigned int flags);
#endif /* __SOUND_AK4117_H */

View File

@ -64,17 +64,22 @@
#define AK4531_AD_IN 0x18 /* AD input select */
#define AK4531_MIC_GAIN 0x19 /* MIC amplified gain */
typedef struct _snd_ak4531 ak4531_t;
struct _snd_ak4531 {
void (*write) (ak4531_t *ak4531, unsigned short reg, unsigned short val);
struct snd_ak4531 {
void (*write) (struct snd_ak4531 *ak4531, unsigned short reg,
unsigned short val);
void *private_data;
void (*private_free) (ak4531_t *ak4531);
void (*private_free) (struct snd_ak4531 *ak4531);
/* --- */
unsigned char regs[0x20];
struct semaphore reg_mutex;
};
int snd_ak4531_mixer(snd_card_t * card, ak4531_t * _ak4531, ak4531_t ** rak4531);
int snd_ak4531_mixer(struct snd_card *card, struct snd_ak4531 *_ak4531,
struct snd_ak4531 **rak4531);
#ifdef CONFIG_PM
void snd_ak4531_suspend(struct snd_ak4531 *ak4531);
void snd_ak4531_resume(struct snd_ak4531 *ak4531);
#endif
#endif /* __SOUND_AK4531_CODEC_H */

View File

@ -27,20 +27,20 @@
#define AK4XXX_MAX_CHIPS 4
#endif
typedef struct snd_akm4xxx akm4xxx_t;
struct snd_akm4xxx;
struct snd_ak4xxx_ops {
void (*lock)(akm4xxx_t *ak, int chip);
void (*unlock)(akm4xxx_t *ak, int chip);
void (*write)(akm4xxx_t *ak, int chip, unsigned char reg, unsigned char val);
// unsigned char (*read)(akm4xxx_t *ak, int chip, unsigned char reg);
void (*set_rate_val)(akm4xxx_t *ak, unsigned int rate);
void (*lock)(struct snd_akm4xxx *ak, int chip);
void (*unlock)(struct snd_akm4xxx *ak, int chip);
void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsigned char val);
// unsigned char (*read)(struct snd_akm4xxx *ak, int chip, unsigned char reg);
void (*set_rate_val)(struct snd_akm4xxx *ak, unsigned int rate);
};
#define AK4XXX_IMAGE_SIZE (AK4XXX_MAX_CHIPS * 16) /* 64 bytes */
struct snd_akm4xxx {
snd_card_t *card;
struct snd_card *card;
unsigned int num_adcs; /* AK4524 or AK4528 ADCs */
unsigned int num_dacs; /* AK4524 or AK4528 DACs */
unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */
@ -56,10 +56,10 @@ struct snd_akm4xxx {
struct snd_ak4xxx_ops ops;
};
void snd_akm4xxx_write(akm4xxx_t *ak, int chip, unsigned char reg, unsigned char val);
void snd_akm4xxx_reset(akm4xxx_t *ak, int state);
void snd_akm4xxx_init(akm4xxx_t *ak);
int snd_akm4xxx_build_controls(akm4xxx_t *ak);
void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsigned char val);
void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state);
void snd_akm4xxx_init(struct snd_akm4xxx *ak);
int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak);
#define snd_akm4xxx_get(ak,chip,reg) (ak)->images[(chip) * 16 + (reg)]
#define snd_akm4xxx_set(ak,chip,reg,val) ((ak)->images[(chip) * 16 + (reg)] = (val))

View File

@ -22,11 +22,10 @@
#ifndef __SOUND_ASEQUENCER_H
#define __SOUND_ASEQUENCER_H
#ifndef __KERNEL__
#ifdef __KERNEL__
#include <linux/ioctl.h>
#endif
#include <sound/asound.h>
#endif
/** version of the sequencer */
#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION (1, 0, 1)
@ -36,13 +35,13 @@
*/
/** system messages
* event data type = #sndrv_seq_result_t
* event data type = #snd_seq_result
*/
#define SNDRV_SEQ_EVENT_SYSTEM 0
#define SNDRV_SEQ_EVENT_RESULT 1
/** note messages (channel specific)
* event data type = #sndrv_seq_ev_note
* event data type = #snd_seq_ev_note
*/
#define SNDRV_SEQ_EVENT_NOTE 5
#define SNDRV_SEQ_EVENT_NOTEON 6
@ -50,7 +49,7 @@
#define SNDRV_SEQ_EVENT_KEYPRESS 8
/** control messages (channel specific)
* event data type = #sndrv_seq_ev_ctrl
* event data type = #snd_seq_ev_ctrl
*/
#define SNDRV_SEQ_EVENT_CONTROLLER 10
#define SNDRV_SEQ_EVENT_PGMCHANGE 11
@ -61,7 +60,7 @@
#define SNDRV_SEQ_EVENT_REGPARAM 16 /**< 14 bit RPN address + 14 bit unsigned value */
/** synchronisation messages
* event data type = #sndrv_seq_ev_ctrl
* event data type = #snd_seq_ev_ctrl
*/
#define SNDRV_SEQ_EVENT_SONGPOS 20 /* Song Position Pointer with LSB and MSB values */
#define SNDRV_SEQ_EVENT_SONGSEL 21 /* Song Select with song ID number */
@ -70,7 +69,7 @@
#define SNDRV_SEQ_EVENT_KEYSIGN 24 /* SMF Key Signature event */
/** timer messages
* event data type = sndrv_seq_ev_queue_control_t
* event data type = snd_seq_ev_queue_control
*/
#define SNDRV_SEQ_EVENT_START 30 /* midi Real Time Start message */
#define SNDRV_SEQ_EVENT_CONTINUE 31 /* midi Real Time Continue message */
@ -96,7 +95,7 @@
#define SNDRV_SEQ_EVENT_OSS 51 /* OSS raw event */
/** system status messages (broadcast for subscribers)
* event data type = sndrv_seq_addr_t
* event data type = snd_seq_addr
*/
#define SNDRV_SEQ_EVENT_CLIENT_START 60 /* new client has connected */
#define SNDRV_SEQ_EVENT_CLIENT_EXIT 61 /* client has left the system */
@ -106,13 +105,13 @@
#define SNDRV_SEQ_EVENT_PORT_CHANGE 65 /* port status/info has changed */
/** port connection changes
* event data type = sndrv_seq_connect_t
* event data type = snd_seq_connect
*/
#define SNDRV_SEQ_EVENT_PORT_SUBSCRIBED 66 /* ports connected */
#define SNDRV_SEQ_EVENT_PORT_UNSUBSCRIBED 67 /* ports disconnected */
/** synthesizer events
* event data type = sndrv_seq_eve_sample_control_t
* event data type = snd_seq_eve_sample_control
*/
#define SNDRV_SEQ_EVENT_SAMPLE 70 /* sample select */
#define SNDRV_SEQ_EVENT_SAMPLE_CLUSTER 71 /* sample cluster select */
@ -163,7 +162,7 @@
/* 119-129: reserved */
/* 130-139: variable length events
* event data type = sndrv_seq_ev_ext
* event data type = snd_seq_ev_ext
* (SNDRV_SEQ_EVENT_LENGTH_VARIABLE must be set)
*/
#define SNDRV_SEQ_EVENT_SYSEX 130 /* system exclusive data (variable length) */
@ -187,18 +186,18 @@
#define SNDRV_SEQ_EVENT_NONE 255
typedef unsigned char sndrv_seq_event_type_t;
typedef unsigned char snd_seq_event_type_t;
/** event address */
struct sndrv_seq_addr {
struct snd_seq_addr {
unsigned char client; /**< Client number: 0..255, 255 = broadcast to all clients */
unsigned char port; /**< Port within client: 0..255, 255 = broadcast to all ports */
};
/** port connection */
struct sndrv_seq_connect {
struct sndrv_seq_addr sender;
struct sndrv_seq_addr dest;
struct snd_seq_connect {
struct snd_seq_addr sender;
struct snd_seq_addr dest;
};
@ -227,7 +226,7 @@ struct sndrv_seq_connect {
/* note event */
struct sndrv_seq_ev_note {
struct snd_seq_ev_note {
unsigned char channel;
unsigned char note;
unsigned char velocity;
@ -236,7 +235,7 @@ struct sndrv_seq_ev_note {
};
/* controller event */
struct sndrv_seq_ev_ctrl {
struct snd_seq_ev_ctrl {
unsigned char channel;
unsigned char unused1, unused2, unused3; /* pad */
unsigned int param;
@ -244,59 +243,59 @@ struct sndrv_seq_ev_ctrl {
};
/* generic set of bytes (12x8 bit) */
struct sndrv_seq_ev_raw8 {
struct snd_seq_ev_raw8 {
unsigned char d[12]; /* 8 bit value */
};
/* generic set of integers (3x32 bit) */
struct sndrv_seq_ev_raw32 {
struct snd_seq_ev_raw32 {
unsigned int d[3]; /* 32 bit value */
};
/* external stored data */
struct sndrv_seq_ev_ext {
struct snd_seq_ev_ext {
unsigned int len; /* length of data */
void *ptr; /* pointer to data (note: maybe 64-bit) */
} __attribute__((packed));
/* Instrument cluster type */
typedef unsigned int sndrv_seq_instr_cluster_t;
typedef unsigned int snd_seq_instr_cluster_t;
/* Instrument type */
struct sndrv_seq_instr {
sndrv_seq_instr_cluster_t cluster;
struct snd_seq_instr {
snd_seq_instr_cluster_t cluster;
unsigned int std; /* the upper byte means a private instrument (owner - client #) */
unsigned short bank;
unsigned short prg;
};
/* sample number */
struct sndrv_seq_ev_sample {
struct snd_seq_ev_sample {
unsigned int std;
unsigned short bank;
unsigned short prg;
};
/* sample cluster */
struct sndrv_seq_ev_cluster {
sndrv_seq_instr_cluster_t cluster;
struct snd_seq_ev_cluster {
snd_seq_instr_cluster_t cluster;
};
/* sample position */
typedef unsigned int sndrv_seq_position_t; /* playback position (in samples) * 16 */
typedef unsigned int snd_seq_position_t; /* playback position (in samples) * 16 */
/* sample stop mode */
enum sndrv_seq_stop_mode {
enum {
SAMPLE_STOP_IMMEDIATELY = 0, /* terminate playing immediately */
SAMPLE_STOP_VENVELOPE = 1, /* finish volume envelope */
SAMPLE_STOP_LOOP = 2 /* terminate loop and finish wave */
};
/* sample frequency */
typedef int sndrv_seq_frequency_t; /* playback frequency in HZ * 16 */
typedef int snd_seq_frequency_t; /* playback frequency in HZ * 16 */
/* sample volume control; if any value is set to -1 == do not change */
struct sndrv_seq_ev_volume {
struct snd_seq_ev_volume {
signed short volume; /* range: 0-16383 */
signed short lr; /* left-right balance; range: 0-16383 */
signed short fr; /* front-rear balance; range: 0-16383 */
@ -304,22 +303,22 @@ struct sndrv_seq_ev_volume {
};
/* simple loop redefinition */
struct sndrv_seq_ev_loop {
struct snd_seq_ev_loop {
unsigned int start; /* loop start (in samples) * 16 */
unsigned int end; /* loop end (in samples) * 16 */
};
struct sndrv_seq_ev_sample_control {
struct snd_seq_ev_sample_control {
unsigned char channel;
unsigned char unused1, unused2, unused3; /* pad */
union {
struct sndrv_seq_ev_sample sample;
struct sndrv_seq_ev_cluster cluster;
sndrv_seq_position_t position;
enum sndrv_seq_stop_mode stop_mode;
sndrv_seq_frequency_t frequency;
struct sndrv_seq_ev_volume volume;
struct sndrv_seq_ev_loop loop;
struct snd_seq_ev_sample sample;
struct snd_seq_ev_cluster cluster;
snd_seq_position_t position;
int stop_mode;
snd_seq_frequency_t frequency;
struct snd_seq_ev_volume volume;
struct snd_seq_ev_loop loop;
unsigned char raw8[8];
} param;
};
@ -327,82 +326,82 @@ struct sndrv_seq_ev_sample_control {
/* INSTR_BEGIN event */
struct sndrv_seq_ev_instr_begin {
struct snd_seq_ev_instr_begin {
int timeout; /* zero = forever, otherwise timeout in ms */
};
struct sndrv_seq_result {
struct snd_seq_result {
int event; /* processed event type */
int result;
};
struct sndrv_seq_real_time {
struct snd_seq_real_time {
unsigned int tv_sec; /* seconds */
unsigned int tv_nsec; /* nanoseconds */
};
typedef unsigned int sndrv_seq_tick_time_t; /* midi ticks */
typedef unsigned int snd_seq_tick_time_t; /* midi ticks */
union sndrv_seq_timestamp {
sndrv_seq_tick_time_t tick;
struct sndrv_seq_real_time time;
union snd_seq_timestamp {
snd_seq_tick_time_t tick;
struct snd_seq_real_time time;
};
struct sndrv_seq_queue_skew {
struct snd_seq_queue_skew {
unsigned int value;
unsigned int base;
};
/* queue timer control */
struct sndrv_seq_ev_queue_control {
struct snd_seq_ev_queue_control {
unsigned char queue; /* affected queue */
unsigned char pad[3]; /* reserved */
union {
signed int value; /* affected value (e.g. tempo) */
union sndrv_seq_timestamp time; /* time */
union snd_seq_timestamp time; /* time */
unsigned int position; /* sync position */
struct sndrv_seq_queue_skew skew;
struct snd_seq_queue_skew skew;
unsigned int d32[2];
unsigned char d8[8];
} param;
};
/* quoted event - inside the kernel only */
struct sndrv_seq_ev_quote {
struct sndrv_seq_addr origin; /* original sender */
struct snd_seq_ev_quote {
struct snd_seq_addr origin; /* original sender */
unsigned short value; /* optional data */
struct sndrv_seq_event *event; /* quoted event */
struct snd_seq_event *event; /* quoted event */
} __attribute__((packed));
/* sequencer event */
struct sndrv_seq_event {
sndrv_seq_event_type_t type; /* event type */
struct snd_seq_event {
snd_seq_event_type_t type; /* event type */
unsigned char flags; /* event flags */
char tag;
unsigned char queue; /* schedule queue */
union sndrv_seq_timestamp time; /* schedule time */
union snd_seq_timestamp time; /* schedule time */
struct sndrv_seq_addr source; /* source address */
struct sndrv_seq_addr dest; /* destination address */
struct snd_seq_addr source; /* source address */
struct snd_seq_addr dest; /* destination address */
union { /* event data... */
struct sndrv_seq_ev_note note;
struct sndrv_seq_ev_ctrl control;
struct sndrv_seq_ev_raw8 raw8;
struct sndrv_seq_ev_raw32 raw32;
struct sndrv_seq_ev_ext ext;
struct sndrv_seq_ev_queue_control queue;
union sndrv_seq_timestamp time;
struct sndrv_seq_addr addr;
struct sndrv_seq_connect connect;
struct sndrv_seq_result result;
struct sndrv_seq_ev_instr_begin instr_begin;
struct sndrv_seq_ev_sample_control sample;
struct sndrv_seq_ev_quote quote;
struct snd_seq_ev_note note;
struct snd_seq_ev_ctrl control;
struct snd_seq_ev_raw8 raw8;
struct snd_seq_ev_raw32 raw32;
struct snd_seq_ev_ext ext;
struct snd_seq_ev_queue_control queue;
union snd_seq_timestamp time;
struct snd_seq_addr addr;
struct snd_seq_connect connect;
struct snd_seq_result result;
struct snd_seq_ev_instr_begin instr_begin;
struct snd_seq_ev_sample_control sample;
struct snd_seq_ev_quote quote;
} data;
};
@ -410,72 +409,77 @@ struct sndrv_seq_event {
/*
* bounce event - stored as variable size data
*/
struct sndrv_seq_event_bounce {
struct snd_seq_event_bounce {
int err;
struct sndrv_seq_event event;
struct snd_seq_event event;
/* external data follows here. */
};
#define sndrv_seq_event_bounce_ext_data(ev) ((void*)((char *)(ev)->data.ext.ptr + sizeof(sndrv_seq_event_bounce_t)))
#ifdef __KERNEL__
/* helper macro */
#define snd_seq_event_bounce_ext_data(ev) ((void*)((char *)(ev)->data.ext.ptr + sizeof(struct snd_seq_event_bounce)))
/*
* type check macros
*/
/* result events: 0-4 */
#define sndrv_seq_ev_is_result_type(ev) ((ev)->type < 5)
#define snd_seq_ev_is_result_type(ev) ((ev)->type < 5)
/* channel specific events: 5-19 */
#define sndrv_seq_ev_is_channel_type(ev) ((ev)->type >= 5 && (ev)->type < 20)
#define snd_seq_ev_is_channel_type(ev) ((ev)->type >= 5 && (ev)->type < 20)
/* note events: 5-9 */
#define sndrv_seq_ev_is_note_type(ev) ((ev)->type >= 5 && (ev)->type < 10)
#define snd_seq_ev_is_note_type(ev) ((ev)->type >= 5 && (ev)->type < 10)
/* control events: 10-19 */
#define sndrv_seq_ev_is_control_type(ev) ((ev)->type >= 10 && (ev)->type < 20)
#define snd_seq_ev_is_control_type(ev) ((ev)->type >= 10 && (ev)->type < 20)
/* queue control events: 30-39 */
#define sndrv_seq_ev_is_queue_type(ev) ((ev)->type >= 30 && (ev)->type < 40)
#define snd_seq_ev_is_queue_type(ev) ((ev)->type >= 30 && (ev)->type < 40)
/* system status messages */
#define sndrv_seq_ev_is_message_type(ev) ((ev)->type >= 60 && (ev)->type < 69)
#define snd_seq_ev_is_message_type(ev) ((ev)->type >= 60 && (ev)->type < 69)
/* sample messages */
#define sndrv_seq_ev_is_sample_type(ev) ((ev)->type >= 70 && (ev)->type < 79)
#define snd_seq_ev_is_sample_type(ev) ((ev)->type >= 70 && (ev)->type < 79)
/* user-defined messages */
#define sndrv_seq_ev_is_user_type(ev) ((ev)->type >= 90 && (ev)->type < 99)
#define snd_seq_ev_is_user_type(ev) ((ev)->type >= 90 && (ev)->type < 99)
/* fixed length events: 0-99 */
#define sndrv_seq_ev_is_fixed_type(ev) ((ev)->type < 100)
#define snd_seq_ev_is_fixed_type(ev) ((ev)->type < 100)
/* instrument layer events: 100-129 */
#define sndrv_seq_ev_is_instr_type(ev) ((ev)->type >= 100 && (ev)->type < 130)
#define snd_seq_ev_is_instr_type(ev) ((ev)->type >= 100 && (ev)->type < 130)
/* variable length events: 130-139 */
#define sndrv_seq_ev_is_variable_type(ev) ((ev)->type >= 130 && (ev)->type < 140)
#define snd_seq_ev_is_variable_type(ev) ((ev)->type >= 130 && (ev)->type < 140)
/* reserved for kernel */
#define sndrv_seq_ev_is_reserved(ev) ((ev)->type >= 150)
#define snd_seq_ev_is_reserved(ev) ((ev)->type >= 150)
/* direct dispatched events */
#define sndrv_seq_ev_is_direct(ev) ((ev)->queue == SNDRV_SEQ_QUEUE_DIRECT)
#define snd_seq_ev_is_direct(ev) ((ev)->queue == SNDRV_SEQ_QUEUE_DIRECT)
/*
* macros to check event flags
*/
/* prior events */
#define sndrv_seq_ev_is_prior(ev) (((ev)->flags & SNDRV_SEQ_PRIORITY_MASK) == SNDRV_SEQ_PRIORITY_HIGH)
#define snd_seq_ev_is_prior(ev) (((ev)->flags & SNDRV_SEQ_PRIORITY_MASK) == SNDRV_SEQ_PRIORITY_HIGH)
/* event length type */
#define sndrv_seq_ev_length_type(ev) ((ev)->flags & SNDRV_SEQ_EVENT_LENGTH_MASK)
#define sndrv_seq_ev_is_fixed(ev) (sndrv_seq_ev_length_type(ev) == SNDRV_SEQ_EVENT_LENGTH_FIXED)
#define sndrv_seq_ev_is_variable(ev) (sndrv_seq_ev_length_type(ev) == SNDRV_SEQ_EVENT_LENGTH_VARIABLE)
#define sndrv_seq_ev_is_varusr(ev) (sndrv_seq_ev_length_type(ev) == SNDRV_SEQ_EVENT_LENGTH_VARUSR)
#define snd_seq_ev_length_type(ev) ((ev)->flags & SNDRV_SEQ_EVENT_LENGTH_MASK)
#define snd_seq_ev_is_fixed(ev) (snd_seq_ev_length_type(ev) == SNDRV_SEQ_EVENT_LENGTH_FIXED)
#define snd_seq_ev_is_variable(ev) (snd_seq_ev_length_type(ev) == SNDRV_SEQ_EVENT_LENGTH_VARIABLE)
#define snd_seq_ev_is_varusr(ev) (snd_seq_ev_length_type(ev) == SNDRV_SEQ_EVENT_LENGTH_VARUSR)
/* time-stamp type */
#define sndrv_seq_ev_timestamp_type(ev) ((ev)->flags & SNDRV_SEQ_TIME_STAMP_MASK)
#define sndrv_seq_ev_is_tick(ev) (sndrv_seq_ev_timestamp_type(ev) == SNDRV_SEQ_TIME_STAMP_TICK)
#define sndrv_seq_ev_is_real(ev) (sndrv_seq_ev_timestamp_type(ev) == SNDRV_SEQ_TIME_STAMP_REAL)
#define snd_seq_ev_timestamp_type(ev) ((ev)->flags & SNDRV_SEQ_TIME_STAMP_MASK)
#define snd_seq_ev_is_tick(ev) (snd_seq_ev_timestamp_type(ev) == SNDRV_SEQ_TIME_STAMP_TICK)
#define snd_seq_ev_is_real(ev) (snd_seq_ev_timestamp_type(ev) == SNDRV_SEQ_TIME_STAMP_REAL)
/* time-mode type */
#define sndrv_seq_ev_timemode_type(ev) ((ev)->flags & SNDRV_SEQ_TIME_MODE_MASK)
#define sndrv_seq_ev_is_abstime(ev) (sndrv_seq_ev_timemode_type(ev) == SNDRV_SEQ_TIME_MODE_ABS)
#define sndrv_seq_ev_is_reltime(ev) (sndrv_seq_ev_timemode_type(ev) == SNDRV_SEQ_TIME_MODE_REL)
#define snd_seq_ev_timemode_type(ev) ((ev)->flags & SNDRV_SEQ_TIME_MODE_MASK)
#define snd_seq_ev_is_abstime(ev) (snd_seq_ev_timemode_type(ev) == SNDRV_SEQ_TIME_MODE_ABS)
#define snd_seq_ev_is_reltime(ev) (snd_seq_ev_timemode_type(ev) == SNDRV_SEQ_TIME_MODE_REL)
/* queue sync port */
#define sndrv_seq_queue_sync_port(q) ((q) + 16)
#define snd_seq_queue_sync_port(q) ((q) + 16)
#endif /* __KERNEL__ */
/* system information */
struct sndrv_seq_system_info {
struct snd_seq_system_info {
int queues; /* maximum queues count */
int clients; /* maximum clients count */
int ports; /* maximum ports per client */
@ -487,7 +491,7 @@ struct sndrv_seq_system_info {
/* system running information */
struct sndrv_seq_running_info {
struct snd_seq_running_info {
unsigned char client; /* client id */
unsigned char big_endian; /* 1 = big-endian */
unsigned char cpu_mode; /* 4 = 32bit, 8 = 64bit */
@ -498,16 +502,16 @@ struct sndrv_seq_running_info {
/* known client numbers */
#define SNDRV_SEQ_CLIENT_SYSTEM 0
#define SNDRV_SEQ_CLIENT_DUMMY 62 /* dummy ports */
#define SNDRV_SEQ_CLIENT_OSS 63 /* oss sequencer emulator */
/* internal client numbers */
#define SNDRV_SEQ_CLIENT_DUMMY 14 /* midi through */
#define SNDRV_SEQ_CLIENT_OSS 15 /* oss sequencer emulator */
/* client types */
enum sndrv_seq_client_type {
NO_CLIENT = 0,
USER_CLIENT = 1,
KERNEL_CLIENT = 2
};
typedef int __bitwise snd_seq_client_type_t;
#define NO_CLIENT ((__force snd_seq_client_type_t) 0)
#define USER_CLIENT ((__force snd_seq_client_type_t) 1)
#define KERNEL_CLIENT ((__force snd_seq_client_type_t) 2)
/* event filter flags */
#define SNDRV_SEQ_FILTER_BROADCAST (1<<0) /* accept broadcast messages */
@ -515,9 +519,9 @@ enum sndrv_seq_client_type {
#define SNDRV_SEQ_FILTER_BOUNCE (1<<2) /* accept bounce event in error */
#define SNDRV_SEQ_FILTER_USE_EVENT (1<<31) /* use event filter */
struct sndrv_seq_client_info {
struct snd_seq_client_info {
int client; /* client number to inquire */
enum sndrv_seq_client_type type; /* client type */
snd_seq_client_type_t type; /* client type */
char name[64]; /* client name */
unsigned int filter; /* filter flags */
unsigned char multicast_filter[8]; /* multicast filter bitmap */
@ -529,7 +533,7 @@ struct sndrv_seq_client_info {
/* client pool size */
struct sndrv_seq_client_pool {
struct snd_seq_client_pool {
int client; /* client number to inquire */
int output_pool; /* outgoing (write) pool size */
int input_pool; /* incoming (read) pool size */
@ -553,13 +557,13 @@ struct sndrv_seq_client_pool {
#define SNDRV_SEQ_REMOVE_IGNORE_OFF (1<<8) /* Do not flush off events */
#define SNDRV_SEQ_REMOVE_TAG_MATCH (1<<9) /* Restrict to events with given tag */
struct sndrv_seq_remove_events {
struct snd_seq_remove_events {
unsigned int remove_mode; /* Flags that determine what gets removed */
union sndrv_seq_timestamp time;
union snd_seq_timestamp time;
unsigned char queue; /* Queue for REMOVE_DEST */
struct sndrv_seq_addr dest; /* Address for REMOVE_DEST */
struct snd_seq_addr dest; /* Address for REMOVE_DEST */
unsigned char channel; /* Channel for REMOVE_DEST */
int type; /* For REMOVE_EVENT_TYPE */
@ -608,8 +612,8 @@ struct sndrv_seq_remove_events {
#define SNDRV_SEQ_PORT_FLG_TIMESTAMP (1<<1)
#define SNDRV_SEQ_PORT_FLG_TIME_REAL (1<<2)
struct sndrv_seq_port_info {
struct sndrv_seq_addr addr; /* client/port numbers */
struct snd_seq_port_info {
struct snd_seq_addr addr; /* client/port numbers */
char name[64]; /* port name */
unsigned int capability; /* port capability bits */
@ -632,7 +636,7 @@ struct sndrv_seq_port_info {
#define SNDRV_SEQ_QUEUE_FLG_SYNC (1<<0) /* sync enabled */
/* queue information */
struct sndrv_seq_queue_info {
struct snd_seq_queue_info {
int queue; /* queue id */
/*
@ -648,11 +652,11 @@ struct sndrv_seq_queue_info {
};
/* queue info/status */
struct sndrv_seq_queue_status {
struct snd_seq_queue_status {
int queue; /* queue id */
int events; /* read-only - queue size */
sndrv_seq_tick_time_t tick; /* current tick */
struct sndrv_seq_real_time time; /* current time */
snd_seq_tick_time_t tick; /* current tick */
struct snd_seq_real_time time; /* current time */
int running; /* running state of queue */
int flags; /* various flags */
char reserved[64]; /* for the future */
@ -660,7 +664,7 @@ struct sndrv_seq_queue_status {
/* queue tempo */
struct sndrv_seq_queue_tempo {
struct snd_seq_queue_tempo {
int queue; /* sequencer queue */
unsigned int tempo; /* current tempo, us/tick */
int ppq; /* time resolution, ticks/quarter */
@ -676,12 +680,12 @@ struct sndrv_seq_queue_tempo {
#define SNDRV_SEQ_TIMER_MIDI_TICK 2 /* Midi Timer Tick (TICK event) */
/* queue timer info */
struct sndrv_seq_queue_timer {
struct snd_seq_queue_timer {
int queue; /* sequencer queue */
int type; /* source timer type */
union {
struct {
struct sndrv_timer_id id; /* ALSA's timer ID */
struct snd_timer_id id; /* ALSA's timer ID */
unsigned int resolution; /* resolution in Hz */
} alsa;
} u;
@ -689,7 +693,7 @@ struct sndrv_seq_queue_timer {
};
struct sndrv_seq_queue_client {
struct snd_seq_queue_client {
int queue; /* sequencer queue */
int client; /* sequencer client */
int used; /* queue is used with this client
@ -703,9 +707,9 @@ struct sndrv_seq_queue_client {
#define SNDRV_SEQ_PORT_SUBS_TIMESTAMP (1<<1)
#define SNDRV_SEQ_PORT_SUBS_TIME_REAL (1<<2)
struct sndrv_seq_port_subscribe {
struct sndrv_seq_addr sender; /* sender address */
struct sndrv_seq_addr dest; /* destination address */
struct snd_seq_port_subscribe {
struct snd_seq_addr sender; /* sender address */
struct snd_seq_addr dest; /* destination address */
unsigned int voices; /* number of voices to be allocated (0 = don't care) */
unsigned int flags; /* modes */
unsigned char queue; /* input time-stamp queue (optional) */
@ -717,12 +721,12 @@ struct sndrv_seq_port_subscribe {
#define SNDRV_SEQ_QUERY_SUBS_READ 0
#define SNDRV_SEQ_QUERY_SUBS_WRITE 1
struct sndrv_seq_query_subs {
struct sndrv_seq_addr root; /* client/port id to be searched */
struct snd_seq_query_subs {
struct snd_seq_addr root; /* client/port id to be searched */
int type; /* READ or WRITE */
int index; /* 0..N-1 */
int num_subs; /* R/O: number of subscriptions on this port */
struct sndrv_seq_addr addr; /* R/O: result */
struct snd_seq_addr addr; /* R/O: result */
unsigned char queue; /* R/O: result */
unsigned int flags; /* R/O: result */
char reserved[64]; /* for future use */
@ -779,72 +783,72 @@ struct sndrv_seq_query_subs {
#define SNDRV_SEQ_INSTR_FREE_CMD_SINGLE 3
/* size of ROM/RAM */
typedef unsigned int sndrv_seq_instr_size_t;
typedef unsigned int snd_seq_instr_size_t;
/* INSTR_INFO */
struct sndrv_seq_instr_info {
struct snd_seq_instr_info {
int result; /* operation result */
unsigned int formats[8]; /* bitmap of supported formats */
int ram_count; /* count of RAM banks */
sndrv_seq_instr_size_t ram_sizes[16]; /* size of RAM banks */
snd_seq_instr_size_t ram_sizes[16]; /* size of RAM banks */
int rom_count; /* count of ROM banks */
sndrv_seq_instr_size_t rom_sizes[8]; /* size of ROM banks */
snd_seq_instr_size_t rom_sizes[8]; /* size of ROM banks */
char reserved[128];
};
/* INSTR_STATUS */
struct sndrv_seq_instr_status {
struct snd_seq_instr_status {
int result; /* operation result */
sndrv_seq_instr_size_t free_ram[16]; /* free RAM in banks */
snd_seq_instr_size_t free_ram[16]; /* free RAM in banks */
int instrument_count; /* count of downloaded instruments */
char reserved[128];
};
/* INSTR_FORMAT_INFO */
struct sndrv_seq_instr_format_info {
struct snd_seq_instr_format_info {
char format[16]; /* format identifier - SNDRV_SEQ_INSTR_ID_* */
unsigned int len; /* max data length (without this structure) */
};
struct sndrv_seq_instr_format_info_result {
struct snd_seq_instr_format_info_result {
int result; /* operation result */
char format[16]; /* format identifier */
unsigned int len; /* filled data length (without this structure) */
};
/* instrument data */
struct sndrv_seq_instr_data {
struct snd_seq_instr_data {
char name[32]; /* instrument name */
char reserved[16]; /* for the future use */
int type; /* instrument type */
union {
char format[16]; /* format identifier */
struct sndrv_seq_instr alias;
struct snd_seq_instr alias;
} data;
};
/* INSTR_PUT/GET, data are stored in one block (extended), header + data */
struct sndrv_seq_instr_header {
struct snd_seq_instr_header {
union {
struct sndrv_seq_instr instr;
sndrv_seq_instr_cluster_t cluster;
struct snd_seq_instr instr;
snd_seq_instr_cluster_t cluster;
} id; /* instrument identifier */
unsigned int cmd; /* get/put/free command */
unsigned int flags; /* query flags (only for get) */
unsigned int len; /* real instrument data length (without header) */
int result; /* operation result */
char reserved[16]; /* for the future */
struct sndrv_seq_instr_data data; /* instrument data (for put/get result) */
struct snd_seq_instr_data data; /* instrument data (for put/get result) */
};
/* INSTR_CLUSTER_SET */
struct sndrv_seq_instr_cluster_set {
sndrv_seq_instr_cluster_t cluster; /* cluster identifier */
struct snd_seq_instr_cluster_set {
snd_seq_instr_cluster_t cluster; /* cluster identifier */
char name[32]; /* cluster name */
int priority; /* cluster priority */
char reserved[64]; /* for the future use */
@ -852,8 +856,8 @@ struct sndrv_seq_instr_cluster_set {
/* INSTR_CLUSTER_GET */
struct sndrv_seq_instr_cluster_get {
sndrv_seq_instr_cluster_t cluster; /* cluster identifier */
struct snd_seq_instr_cluster_get {
snd_seq_instr_cluster_t cluster; /* cluster identifier */
char name[32]; /* cluster name */
int priority; /* cluster priority */
char reserved[64]; /* for the future use */
@ -865,44 +869,44 @@ struct sndrv_seq_instr_cluster_get {
#define SNDRV_SEQ_IOCTL_PVERSION _IOR ('S', 0x00, int)
#define SNDRV_SEQ_IOCTL_CLIENT_ID _IOR ('S', 0x01, int)
#define SNDRV_SEQ_IOCTL_SYSTEM_INFO _IOWR('S', 0x02, struct sndrv_seq_system_info)
#define SNDRV_SEQ_IOCTL_RUNNING_MODE _IOWR('S', 0x03, struct sndrv_seq_running_info)
#define SNDRV_SEQ_IOCTL_SYSTEM_INFO _IOWR('S', 0x02, struct snd_seq_system_info)
#define SNDRV_SEQ_IOCTL_RUNNING_MODE _IOWR('S', 0x03, struct snd_seq_running_info)
#define SNDRV_SEQ_IOCTL_GET_CLIENT_INFO _IOWR('S', 0x10, struct sndrv_seq_client_info)
#define SNDRV_SEQ_IOCTL_SET_CLIENT_INFO _IOW ('S', 0x11, struct sndrv_seq_client_info)
#define SNDRV_SEQ_IOCTL_GET_CLIENT_INFO _IOWR('S', 0x10, struct snd_seq_client_info)
#define SNDRV_SEQ_IOCTL_SET_CLIENT_INFO _IOW ('S', 0x11, struct snd_seq_client_info)
#define SNDRV_SEQ_IOCTL_CREATE_PORT _IOWR('S', 0x20, struct sndrv_seq_port_info)
#define SNDRV_SEQ_IOCTL_DELETE_PORT _IOW ('S', 0x21, struct sndrv_seq_port_info)
#define SNDRV_SEQ_IOCTL_GET_PORT_INFO _IOWR('S', 0x22, struct sndrv_seq_port_info)
#define SNDRV_SEQ_IOCTL_SET_PORT_INFO _IOW ('S', 0x23, struct sndrv_seq_port_info)
#define SNDRV_SEQ_IOCTL_CREATE_PORT _IOWR('S', 0x20, struct snd_seq_port_info)
#define SNDRV_SEQ_IOCTL_DELETE_PORT _IOW ('S', 0x21, struct snd_seq_port_info)
#define SNDRV_SEQ_IOCTL_GET_PORT_INFO _IOWR('S', 0x22, struct snd_seq_port_info)
#define SNDRV_SEQ_IOCTL_SET_PORT_INFO _IOW ('S', 0x23, struct snd_seq_port_info)
#define SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT _IOW ('S', 0x30, struct sndrv_seq_port_subscribe)
#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW ('S', 0x31, struct sndrv_seq_port_subscribe)
#define SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT _IOW ('S', 0x30, struct snd_seq_port_subscribe)
#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW ('S', 0x31, struct snd_seq_port_subscribe)
#define SNDRV_SEQ_IOCTL_CREATE_QUEUE _IOWR('S', 0x32, struct sndrv_seq_queue_info)
#define SNDRV_SEQ_IOCTL_DELETE_QUEUE _IOW ('S', 0x33, struct sndrv_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_INFO _IOWR('S', 0x34, struct sndrv_seq_queue_info)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO _IOWR('S', 0x35, struct sndrv_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE _IOWR('S', 0x36, struct sndrv_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS _IOWR('S', 0x40, struct sndrv_seq_queue_status)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO _IOWR('S', 0x41, struct sndrv_seq_queue_tempo)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO _IOW ('S', 0x42, struct sndrv_seq_queue_tempo)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_OWNER _IOWR('S', 0x43, struct sndrv_seq_queue_owner)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_OWNER _IOW ('S', 0x44, struct sndrv_seq_queue_owner)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER _IOWR('S', 0x45, struct sndrv_seq_queue_timer)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER _IOW ('S', 0x46, struct sndrv_seq_queue_timer)
#define SNDRV_SEQ_IOCTL_CREATE_QUEUE _IOWR('S', 0x32, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_DELETE_QUEUE _IOW ('S', 0x33, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_INFO _IOWR('S', 0x34, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO _IOWR('S', 0x35, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE _IOWR('S', 0x36, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS _IOWR('S', 0x40, struct snd_seq_queue_status)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO _IOWR('S', 0x41, struct snd_seq_queue_tempo)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO _IOW ('S', 0x42, struct snd_seq_queue_tempo)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_OWNER _IOWR('S', 0x43, struct snd_seq_queue_owner)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_OWNER _IOW ('S', 0x44, struct snd_seq_queue_owner)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER _IOWR('S', 0x45, struct snd_seq_queue_timer)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER _IOW ('S', 0x46, struct snd_seq_queue_timer)
/* XXX
#define SNDRV_SEQ_IOCTL_GET_QUEUE_SYNC _IOWR('S', 0x53, struct sndrv_seq_queue_sync)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_SYNC _IOW ('S', 0x54, struct sndrv_seq_queue_sync)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_SYNC _IOWR('S', 0x53, struct snd_seq_queue_sync)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_SYNC _IOW ('S', 0x54, struct snd_seq_queue_sync)
*/
#define SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT _IOWR('S', 0x49, struct sndrv_seq_queue_client)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT _IOW ('S', 0x4a, struct sndrv_seq_queue_client)
#define SNDRV_SEQ_IOCTL_GET_CLIENT_POOL _IOWR('S', 0x4b, struct sndrv_seq_client_pool)
#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL _IOW ('S', 0x4c, struct sndrv_seq_client_pool)
#define SNDRV_SEQ_IOCTL_REMOVE_EVENTS _IOW ('S', 0x4e, struct sndrv_seq_remove_events)
#define SNDRV_SEQ_IOCTL_QUERY_SUBS _IOWR('S', 0x4f, struct sndrv_seq_query_subs)
#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION _IOWR('S', 0x50, struct sndrv_seq_port_subscribe)
#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT _IOWR('S', 0x51, struct sndrv_seq_client_info)
#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT _IOWR('S', 0x52, struct sndrv_seq_port_info)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT _IOWR('S', 0x49, struct snd_seq_queue_client)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT _IOW ('S', 0x4a, struct snd_seq_queue_client)
#define SNDRV_SEQ_IOCTL_GET_CLIENT_POOL _IOWR('S', 0x4b, struct snd_seq_client_pool)
#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL _IOW ('S', 0x4c, struct snd_seq_client_pool)
#define SNDRV_SEQ_IOCTL_REMOVE_EVENTS _IOW ('S', 0x4e, struct snd_seq_remove_events)
#define SNDRV_SEQ_IOCTL_QUERY_SUBS _IOWR('S', 0x4f, struct snd_seq_query_subs)
#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION _IOWR('S', 0x50, struct snd_seq_port_subscribe)
#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT _IOWR('S', 0x51, struct snd_seq_client_info)
#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT _IOWR('S', 0x52, struct snd_seq_port_info)
#endif /* __SOUND_ASEQUENCER_H */

View File

@ -23,12 +23,8 @@
#ifndef __SOUND_ASOUND_H
#define __SOUND_ASOUND_H
#if defined(LINUX) || defined(__LINUX__) || defined(__linux__)
#include <linux/ioctl.h>
#ifdef __KERNEL__
#include <linux/ioctl.h>
#include <linux/types.h>
#include <linux/time.h>
#include <asm/byteorder.h>
@ -43,25 +39,7 @@
#endif
#endif
#else /* !__KERNEL__ */
#include <endian.h>
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define SNDRV_LITTLE_ENDIAN
#elif __BYTE_ORDER == __BIG_ENDIAN
#define SNDRV_BIG_ENDIAN
#else
#error "Unsupported endian..."
#endif
#endif /* __KERNEL **/
#endif /* LINUX */
#ifndef __KERNEL__
#include <sys/time.h>
#include <sys/types.h>
#endif
#endif /* __KERNEL__ **/
/*
* protocol version
@ -82,7 +60,7 @@
* *
****************************************************************************/
struct sndrv_aes_iec958 {
struct snd_aes_iec958 {
unsigned char status[24]; /* AES/IEC958 channel status bits */
unsigned char subcode[147]; /* AES/IEC958 subcode bits */
unsigned char pad; /* nothing */
@ -97,7 +75,7 @@ struct sndrv_aes_iec958 {
#define SNDRV_HWDEP_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
enum sndrv_hwdep_iface {
enum {
SNDRV_HWDEP_IFACE_OPL2 = 0,
SNDRV_HWDEP_IFACE_OPL3,
SNDRV_HWDEP_IFACE_OPL4,
@ -119,17 +97,17 @@ enum sndrv_hwdep_iface {
SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_SB_RC
};
struct sndrv_hwdep_info {
struct snd_hwdep_info {
unsigned int device; /* WR: device number */
int card; /* R: card number */
unsigned char id[64]; /* ID (user selectable) */
unsigned char name[80]; /* hwdep name */
enum sndrv_hwdep_iface iface; /* hwdep interface */
int iface; /* hwdep interface */
unsigned char reserved[64]; /* reserved for future */
};
/* generic DSP loader */
struct sndrv_hwdep_dsp_status {
struct snd_hwdep_dsp_status {
unsigned int version; /* R: driver-specific version */
unsigned char id[32]; /* R: driver-specific ID string */
unsigned int num_dsps; /* R: number of DSP images to transfer */
@ -138,7 +116,7 @@ struct sndrv_hwdep_dsp_status {
unsigned char reserved[16]; /* reserved for future use */
};
struct sndrv_hwdep_dsp_image {
struct snd_hwdep_dsp_image {
unsigned int index; /* W: DSP index */
unsigned char name[64]; /* W: ID (e.g. file name) */
unsigned char __user *image; /* W: binary image */
@ -148,9 +126,9 @@ struct sndrv_hwdep_dsp_image {
enum {
SNDRV_HWDEP_IOCTL_PVERSION = _IOR ('H', 0x00, int),
SNDRV_HWDEP_IOCTL_INFO = _IOR ('H', 0x01, struct sndrv_hwdep_info),
SNDRV_HWDEP_IOCTL_DSP_STATUS = _IOR('H', 0x02, struct sndrv_hwdep_dsp_status),
SNDRV_HWDEP_IOCTL_DSP_LOAD = _IOW('H', 0x03, struct sndrv_hwdep_dsp_image)
SNDRV_HWDEP_IOCTL_INFO = _IOR ('H', 0x01, struct snd_hwdep_info),
SNDRV_HWDEP_IOCTL_DSP_STATUS = _IOR('H', 0x02, struct snd_hwdep_dsp_status),
SNDRV_HWDEP_IOCTL_DSP_LOAD = _IOW('H', 0x03, struct snd_hwdep_dsp_image)
};
/*****************************************************************************
@ -161,10 +139,10 @@ enum {
#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7)
typedef unsigned long sndrv_pcm_uframes_t;
typedef long sndrv_pcm_sframes_t;
typedef unsigned long snd_pcm_uframes_t;
typedef signed long snd_pcm_sframes_t;
enum sndrv_pcm_class {
enum {
SNDRV_PCM_CLASS_GENERIC = 0, /* standard mono or stereo device */
SNDRV_PCM_CLASS_MULTI, /* multichannel device */
SNDRV_PCM_CLASS_MODEM, /* software modem class */
@ -173,97 +151,94 @@ enum sndrv_pcm_class {
SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER,
};
enum sndrv_pcm_subclass {
enum {
SNDRV_PCM_SUBCLASS_GENERIC_MIX = 0, /* mono or stereo subdevices are mixed together */
SNDRV_PCM_SUBCLASS_MULTI_MIX, /* multichannel subdevices are mixed together */
/* Don't forget to change the following: */
SNDRV_PCM_SUBCLASS_LAST = SNDRV_PCM_SUBCLASS_MULTI_MIX,
};
enum sndrv_pcm_stream {
enum {
SNDRV_PCM_STREAM_PLAYBACK = 0,
SNDRV_PCM_STREAM_CAPTURE,
SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE,
};
enum sndrv_pcm_access {
SNDRV_PCM_ACCESS_MMAP_INTERLEAVED = 0, /* interleaved mmap */
SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED, /* noninterleaved mmap */
SNDRV_PCM_ACCESS_MMAP_COMPLEX, /* complex mmap */
SNDRV_PCM_ACCESS_RW_INTERLEAVED, /* readi/writei */
SNDRV_PCM_ACCESS_RW_NONINTERLEAVED, /* readn/writen */
SNDRV_PCM_ACCESS_LAST = SNDRV_PCM_ACCESS_RW_NONINTERLEAVED,
};
typedef int __bitwise snd_pcm_access_t;
#define SNDRV_PCM_ACCESS_MMAP_INTERLEAVED ((__force snd_pcm_access_t) 0) /* interleaved mmap */
#define SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED ((__force snd_pcm_access_t) 1) /* noninterleaved mmap */
#define SNDRV_PCM_ACCESS_MMAP_COMPLEX ((__force snd_pcm_access_t) 2) /* complex mmap */
#define SNDRV_PCM_ACCESS_RW_INTERLEAVED ((__force snd_pcm_access_t) 3) /* readi/writei */
#define SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ((__force snd_pcm_access_t) 4) /* readn/writen */
#define SNDRV_PCM_ACCESS_LAST SNDRV_PCM_ACCESS_RW_NONINTERLEAVED
enum sndrv_pcm_format {
SNDRV_PCM_FORMAT_S8 = 0,
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, /* low three bytes */
SNDRV_PCM_FORMAT_S24_BE, /* low three bytes */
SNDRV_PCM_FORMAT_U24_LE, /* low three bytes */
SNDRV_PCM_FORMAT_U24_BE, /* low three bytes */
SNDRV_PCM_FORMAT_S32_LE,
SNDRV_PCM_FORMAT_S32_BE,
SNDRV_PCM_FORMAT_U32_LE,
SNDRV_PCM_FORMAT_U32_BE,
SNDRV_PCM_FORMAT_FLOAT_LE, /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
SNDRV_PCM_FORMAT_FLOAT_BE, /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
SNDRV_PCM_FORMAT_FLOAT64_LE, /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
SNDRV_PCM_FORMAT_FLOAT64_BE, /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE, /* IEC-958 subframe, Little Endian */
SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE, /* IEC-958 subframe, Big Endian */
SNDRV_PCM_FORMAT_MU_LAW,
SNDRV_PCM_FORMAT_A_LAW,
SNDRV_PCM_FORMAT_IMA_ADPCM,
SNDRV_PCM_FORMAT_MPEG,
SNDRV_PCM_FORMAT_GSM,
SNDRV_PCM_FORMAT_SPECIAL = 31,
SNDRV_PCM_FORMAT_S24_3LE = 32, /* in three bytes */
SNDRV_PCM_FORMAT_S24_3BE, /* in three bytes */
SNDRV_PCM_FORMAT_U24_3LE, /* in three bytes */
SNDRV_PCM_FORMAT_U24_3BE, /* in three bytes */
SNDRV_PCM_FORMAT_S20_3LE, /* in three bytes */
SNDRV_PCM_FORMAT_S20_3BE, /* in three bytes */
SNDRV_PCM_FORMAT_U20_3LE, /* in three bytes */
SNDRV_PCM_FORMAT_U20_3BE, /* in three bytes */
SNDRV_PCM_FORMAT_S18_3LE, /* in three bytes */
SNDRV_PCM_FORMAT_S18_3BE, /* in three bytes */
SNDRV_PCM_FORMAT_U18_3LE, /* in three bytes */
SNDRV_PCM_FORMAT_U18_3BE, /* in three bytes */
SNDRV_PCM_FORMAT_LAST = SNDRV_PCM_FORMAT_U18_3BE,
typedef int __bitwise snd_pcm_format_t;
#define SNDRV_PCM_FORMAT_S8 ((__force snd_pcm_format_t) 0)
#define SNDRV_PCM_FORMAT_U8 ((__force snd_pcm_format_t) 1)
#define SNDRV_PCM_FORMAT_S16_LE ((__force snd_pcm_format_t) 2)
#define SNDRV_PCM_FORMAT_S16_BE ((__force snd_pcm_format_t) 3)
#define SNDRV_PCM_FORMAT_U16_LE ((__force snd_pcm_format_t) 4)
#define SNDRV_PCM_FORMAT_U16_BE ((__force snd_pcm_format_t) 5)
#define SNDRV_PCM_FORMAT_S24_LE ((__force snd_pcm_format_t) 6) /* low three bytes */
#define SNDRV_PCM_FORMAT_S24_BE ((__force snd_pcm_format_t) 7) /* low three bytes */
#define SNDRV_PCM_FORMAT_U24_LE ((__force snd_pcm_format_t) 8) /* low three bytes */
#define SNDRV_PCM_FORMAT_U24_BE ((__force snd_pcm_format_t) 9) /* low three bytes */
#define SNDRV_PCM_FORMAT_S32_LE ((__force snd_pcm_format_t) 10)
#define SNDRV_PCM_FORMAT_S32_BE ((__force snd_pcm_format_t) 11)
#define SNDRV_PCM_FORMAT_U32_LE ((__force snd_pcm_format_t) 12)
#define SNDRV_PCM_FORMAT_U32_BE ((__force snd_pcm_format_t) 13)
#define SNDRV_PCM_FORMAT_FLOAT_LE ((__force snd_pcm_format_t) 14) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
#define SNDRV_PCM_FORMAT_FLOAT_BE ((__force snd_pcm_format_t) 15) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
#define SNDRV_PCM_FORMAT_FLOAT64_LE ((__force snd_pcm_format_t) 16) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
#define SNDRV_PCM_FORMAT_FLOAT64_BE ((__force snd_pcm_format_t) 17) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((__force snd_pcm_format_t) 18) /* IEC-958 subframe, Little Endian */
#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((__force snd_pcm_format_t) 19) /* IEC-958 subframe, Big Endian */
#define SNDRV_PCM_FORMAT_MU_LAW ((__force snd_pcm_format_t) 20)
#define SNDRV_PCM_FORMAT_A_LAW ((__force snd_pcm_format_t) 21)
#define SNDRV_PCM_FORMAT_IMA_ADPCM ((__force snd_pcm_format_t) 22)
#define SNDRV_PCM_FORMAT_MPEG ((__force snd_pcm_format_t) 23)
#define SNDRV_PCM_FORMAT_GSM ((__force snd_pcm_format_t) 24)
#define SNDRV_PCM_FORMAT_SPECIAL ((__force snd_pcm_format_t) 31)
#define SNDRV_PCM_FORMAT_S24_3LE ((__force snd_pcm_format_t) 32) /* in three bytes */
#define SNDRV_PCM_FORMAT_S24_3BE ((__force snd_pcm_format_t) 33) /* in three bytes */
#define SNDRV_PCM_FORMAT_U24_3LE ((__force snd_pcm_format_t) 34) /* in three bytes */
#define SNDRV_PCM_FORMAT_U24_3BE ((__force snd_pcm_format_t) 35) /* in three bytes */
#define SNDRV_PCM_FORMAT_S20_3LE ((__force snd_pcm_format_t) 36) /* in three bytes */
#define SNDRV_PCM_FORMAT_S20_3BE ((__force snd_pcm_format_t) 37) /* in three bytes */
#define SNDRV_PCM_FORMAT_U20_3LE ((__force snd_pcm_format_t) 38) /* in three bytes */
#define SNDRV_PCM_FORMAT_U20_3BE ((__force snd_pcm_format_t) 39) /* in three bytes */
#define SNDRV_PCM_FORMAT_S18_3LE ((__force snd_pcm_format_t) 40) /* in three bytes */
#define SNDRV_PCM_FORMAT_S18_3BE ((__force snd_pcm_format_t) 41) /* in three bytes */
#define SNDRV_PCM_FORMAT_U18_3LE ((__force snd_pcm_format_t) 42) /* in three bytes */
#define SNDRV_PCM_FORMAT_U18_3BE ((__force snd_pcm_format_t) 43) /* in three bytes */
#define SNDRV_PCM_FORMAT_LAST SNDRV_PCM_FORMAT_U18_3BE
#ifdef SNDRV_LITTLE_ENDIAN
SNDRV_PCM_FORMAT_S16 = SNDRV_PCM_FORMAT_S16_LE,
SNDRV_PCM_FORMAT_U16 = SNDRV_PCM_FORMAT_U16_LE,
SNDRV_PCM_FORMAT_S24 = SNDRV_PCM_FORMAT_S24_LE,
SNDRV_PCM_FORMAT_U24 = SNDRV_PCM_FORMAT_U24_LE,
SNDRV_PCM_FORMAT_S32 = SNDRV_PCM_FORMAT_S32_LE,
SNDRV_PCM_FORMAT_U32 = SNDRV_PCM_FORMAT_U32_LE,
SNDRV_PCM_FORMAT_FLOAT = SNDRV_PCM_FORMAT_FLOAT_LE,
SNDRV_PCM_FORMAT_FLOAT64 = SNDRV_PCM_FORMAT_FLOAT64_LE,
SNDRV_PCM_FORMAT_IEC958_SUBFRAME = SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE,
#define SNDRV_PCM_FORMAT_S16 SNDRV_PCM_FORMAT_S16_LE
#define SNDRV_PCM_FORMAT_U16 SNDRV_PCM_FORMAT_U16_LE
#define SNDRV_PCM_FORMAT_S24 SNDRV_PCM_FORMAT_S24_LE
#define SNDRV_PCM_FORMAT_U24 SNDRV_PCM_FORMAT_U24_LE
#define SNDRV_PCM_FORMAT_S32 SNDRV_PCM_FORMAT_S32_LE
#define SNDRV_PCM_FORMAT_U32 SNDRV_PCM_FORMAT_U32_LE
#define SNDRV_PCM_FORMAT_FLOAT SNDRV_PCM_FORMAT_FLOAT_LE
#define SNDRV_PCM_FORMAT_FLOAT64 SNDRV_PCM_FORMAT_FLOAT64_LE
#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE
#endif
#ifdef SNDRV_BIG_ENDIAN
SNDRV_PCM_FORMAT_S16 = SNDRV_PCM_FORMAT_S16_BE,
SNDRV_PCM_FORMAT_U16 = SNDRV_PCM_FORMAT_U16_BE,
SNDRV_PCM_FORMAT_S24 = SNDRV_PCM_FORMAT_S24_BE,
SNDRV_PCM_FORMAT_U24 = SNDRV_PCM_FORMAT_U24_BE,
SNDRV_PCM_FORMAT_S32 = SNDRV_PCM_FORMAT_S32_BE,
SNDRV_PCM_FORMAT_U32 = SNDRV_PCM_FORMAT_U32_BE,
SNDRV_PCM_FORMAT_FLOAT = SNDRV_PCM_FORMAT_FLOAT_BE,
SNDRV_PCM_FORMAT_FLOAT64 = SNDRV_PCM_FORMAT_FLOAT64_BE,
SNDRV_PCM_FORMAT_IEC958_SUBFRAME = SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE,
#define SNDRV_PCM_FORMAT_S16 SNDRV_PCM_FORMAT_S16_BE
#define SNDRV_PCM_FORMAT_U16 SNDRV_PCM_FORMAT_U16_BE
#define SNDRV_PCM_FORMAT_S24 SNDRV_PCM_FORMAT_S24_BE
#define SNDRV_PCM_FORMAT_U24 SNDRV_PCM_FORMAT_U24_BE
#define SNDRV_PCM_FORMAT_S32 SNDRV_PCM_FORMAT_S32_BE
#define SNDRV_PCM_FORMAT_U32 SNDRV_PCM_FORMAT_U32_BE
#define SNDRV_PCM_FORMAT_FLOAT SNDRV_PCM_FORMAT_FLOAT_BE
#define SNDRV_PCM_FORMAT_FLOAT64 SNDRV_PCM_FORMAT_FLOAT64_BE
#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE
#endif
};
enum sndrv_pcm_subformat {
SNDRV_PCM_SUBFORMAT_STD = 0,
SNDRV_PCM_SUBFORMAT_LAST = SNDRV_PCM_SUBFORMAT_STD,
};
typedef int __bitwise snd_pcm_subformat_t;
#define SNDRV_PCM_SUBFORMAT_STD ((__force snd_pcm_subformat_t) 0)
#define SNDRV_PCM_SUBFORMAT_LAST SNDRV_PCM_SUBFORMAT_STD
#define SNDRV_PCM_INFO_MMAP 0x00000001 /* hardware supports mmap */
#define SNDRV_PCM_INFO_MMAP_VALID 0x00000002 /* period data are valid during transfer */
@ -280,18 +255,17 @@ enum sndrv_pcm_subformat {
#define SNDRV_PCM_INFO_JOINT_DUPLEX 0x00200000 /* playback and capture stream are somewhat correlated */
#define SNDRV_PCM_INFO_SYNC_START 0x00400000 /* pcm support some kind of sync go */
enum sndrv_pcm_state {
SNDRV_PCM_STATE_OPEN = 0, /* stream is open */
SNDRV_PCM_STATE_SETUP, /* stream has a setup */
SNDRV_PCM_STATE_PREPARED, /* stream is ready to start */
SNDRV_PCM_STATE_RUNNING, /* stream is running */
SNDRV_PCM_STATE_XRUN, /* stream reached an xrun */
SNDRV_PCM_STATE_DRAINING, /* stream is draining */
SNDRV_PCM_STATE_PAUSED, /* stream is paused */
SNDRV_PCM_STATE_SUSPENDED, /* hardware is suspended */
SNDRV_PCM_STATE_DISCONNECTED, /* hardware is disconnected */
SNDRV_PCM_STATE_LAST = SNDRV_PCM_STATE_DISCONNECTED,
};
typedef int __bitwise snd_pcm_state_t;
#define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0) /* stream is open */
#define SNDRV_PCM_STATE_SETUP ((__force snd_pcm_state_t) 1) /* stream has a setup */
#define SNDRV_PCM_STATE_PREPARED ((__force snd_pcm_state_t) 2) /* stream is ready to start */
#define SNDRV_PCM_STATE_RUNNING ((__force snd_pcm_state_t) 3) /* stream is running */
#define SNDRV_PCM_STATE_XRUN ((__force snd_pcm_state_t) 4) /* stream reached an xrun */
#define SNDRV_PCM_STATE_DRAINING ((__force snd_pcm_state_t) 5) /* stream is draining */
#define SNDRV_PCM_STATE_PAUSED ((__force snd_pcm_state_t) 6) /* stream is paused */
#define SNDRV_PCM_STATE_SUSPENDED ((__force snd_pcm_state_t) 7) /* hardware is suspended */
#define SNDRV_PCM_STATE_DISCONNECTED ((__force snd_pcm_state_t) 8) /* hardware is disconnected */
#define SNDRV_PCM_STATE_LAST SNDRV_PCM_STATE_DISCONNECTED
enum {
SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
@ -299,55 +273,53 @@ enum {
SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
};
union sndrv_pcm_sync_id {
union snd_pcm_sync_id {
unsigned char id[16];
unsigned short id16[8];
unsigned int id32[4];
};
struct sndrv_pcm_info {
struct snd_pcm_info {
unsigned int device; /* RO/WR (control): device number */
unsigned int subdevice; /* RO/WR (control): subdevice number */
enum sndrv_pcm_stream stream; /* RO/WR (control): stream number */
int stream; /* RO/WR (control): stream direction */
int card; /* R: card number */
unsigned char id[64]; /* ID (user selectable) */
unsigned char name[80]; /* name of this device */
unsigned char subname[32]; /* subdevice name */
enum sndrv_pcm_class dev_class; /* SNDRV_PCM_CLASS_* */
enum sndrv_pcm_subclass dev_subclass; /* SNDRV_PCM_SUBCLASS_* */
int dev_class; /* SNDRV_PCM_CLASS_* */
int dev_subclass; /* SNDRV_PCM_SUBCLASS_* */
unsigned int subdevices_count;
unsigned int subdevices_avail;
union sndrv_pcm_sync_id sync; /* hardware synchronization ID */
union snd_pcm_sync_id sync; /* hardware synchronization ID */
unsigned char reserved[64]; /* reserved for future... */
};
enum sndrv_pcm_hw_param {
SNDRV_PCM_HW_PARAM_ACCESS = 0, /* Access type */
SNDRV_PCM_HW_PARAM_FIRST_MASK = SNDRV_PCM_HW_PARAM_ACCESS,
SNDRV_PCM_HW_PARAM_FORMAT, /* Format */
SNDRV_PCM_HW_PARAM_SUBFORMAT, /* Subformat */
SNDRV_PCM_HW_PARAM_LAST_MASK = SNDRV_PCM_HW_PARAM_SUBFORMAT,
typedef int __bitwise snd_pcm_hw_param_t;
#define SNDRV_PCM_HW_PARAM_ACCESS ((__force snd_pcm_hw_param_t) 0) /* Access type */
#define SNDRV_PCM_HW_PARAM_FORMAT ((__force snd_pcm_hw_param_t) 1) /* Format */
#define SNDRV_PCM_HW_PARAM_SUBFORMAT ((__force snd_pcm_hw_param_t) 2) /* Subformat */
#define SNDRV_PCM_HW_PARAM_FIRST_MASK SNDRV_PCM_HW_PARAM_ACCESS
#define SNDRV_PCM_HW_PARAM_LAST_MASK SNDRV_PCM_HW_PARAM_SUBFORMAT
SNDRV_PCM_HW_PARAM_SAMPLE_BITS = 8, /* Bits per sample */
SNDRV_PCM_HW_PARAM_FIRST_INTERVAL = SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
SNDRV_PCM_HW_PARAM_FRAME_BITS, /* Bits per frame */
SNDRV_PCM_HW_PARAM_CHANNELS, /* Channels */
SNDRV_PCM_HW_PARAM_RATE, /* Approx rate */
SNDRV_PCM_HW_PARAM_PERIOD_TIME, /* Approx distance between interrupts
in us */
SNDRV_PCM_HW_PARAM_PERIOD_SIZE, /* Approx frames between interrupts */
SNDRV_PCM_HW_PARAM_PERIOD_BYTES, /* Approx bytes between interrupts */
SNDRV_PCM_HW_PARAM_PERIODS, /* Approx interrupts per buffer */
SNDRV_PCM_HW_PARAM_BUFFER_TIME, /* Approx duration of buffer in us */
SNDRV_PCM_HW_PARAM_BUFFER_SIZE, /* Size of buffer in frames */
SNDRV_PCM_HW_PARAM_BUFFER_BYTES, /* Size of buffer in bytes */
SNDRV_PCM_HW_PARAM_TICK_TIME, /* Approx tick duration in us */
SNDRV_PCM_HW_PARAM_LAST_INTERVAL = SNDRV_PCM_HW_PARAM_TICK_TIME
};
#define SNDRV_PCM_HW_PARAM_SAMPLE_BITS ((__force snd_pcm_hw_param_t) 8) /* Bits per sample */
#define SNDRV_PCM_HW_PARAM_FRAME_BITS ((__force snd_pcm_hw_param_t) 9) /* Bits per frame */
#define SNDRV_PCM_HW_PARAM_CHANNELS ((__force snd_pcm_hw_param_t) 10) /* Channels */
#define SNDRV_PCM_HW_PARAM_RATE ((__force snd_pcm_hw_param_t) 11) /* Approx rate */
#define SNDRV_PCM_HW_PARAM_PERIOD_TIME ((__force snd_pcm_hw_param_t) 12) /* Approx distance between interrupts in us */
#define SNDRV_PCM_HW_PARAM_PERIOD_SIZE ((__force snd_pcm_hw_param_t) 13) /* Approx frames between interrupts */
#define SNDRV_PCM_HW_PARAM_PERIOD_BYTES ((__force snd_pcm_hw_param_t) 14) /* Approx bytes between interrupts */
#define SNDRV_PCM_HW_PARAM_PERIODS ((__force snd_pcm_hw_param_t) 15) /* Approx interrupts per buffer */
#define SNDRV_PCM_HW_PARAM_BUFFER_TIME ((__force snd_pcm_hw_param_t) 16) /* Approx duration of buffer in us */
#define SNDRV_PCM_HW_PARAM_BUFFER_SIZE ((__force snd_pcm_hw_param_t) 17) /* Size of buffer in frames */
#define SNDRV_PCM_HW_PARAM_BUFFER_BYTES ((__force snd_pcm_hw_param_t) 18) /* Size of buffer in bytes */
#define SNDRV_PCM_HW_PARAM_TICK_TIME ((__force snd_pcm_hw_param_t) 19) /* Approx tick duration in us */
#define SNDRV_PCM_HW_PARAM_FIRST_INTERVAL SNDRV_PCM_HW_PARAM_SAMPLE_BITS
#define SNDRV_PCM_HW_PARAM_LAST_INTERVAL SNDRV_PCM_HW_PARAM_TICK_TIME
#define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1<<0) /* avoid rate resampling */
struct sndrv_interval {
struct snd_interval {
unsigned int min, max;
unsigned int openmin:1,
openmax:1,
@ -357,137 +329,137 @@ struct sndrv_interval {
#define SNDRV_MASK_MAX 256
struct sndrv_mask {
struct snd_mask {
u_int32_t bits[(SNDRV_MASK_MAX+31)/32];
};
struct sndrv_pcm_hw_params {
struct snd_pcm_hw_params {
unsigned int flags;
struct sndrv_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
struct sndrv_mask mres[5]; /* reserved masks */
struct sndrv_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
struct snd_mask mres[5]; /* reserved masks */
struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
struct sndrv_interval ires[9]; /* reserved intervals */
struct snd_interval ires[9]; /* reserved intervals */
unsigned int rmask; /* W: requested masks */
unsigned int cmask; /* R: changed masks */
unsigned int info; /* R: Info flags for returned setup */
unsigned int msbits; /* R: used most significant bits */
unsigned int rate_num; /* R: rate numerator */
unsigned int rate_den; /* R: rate denominator */
sndrv_pcm_uframes_t fifo_size; /* R: chip FIFO size in frames */
snd_pcm_uframes_t fifo_size; /* R: chip FIFO size in frames */
unsigned char reserved[64]; /* reserved for future */
};
enum sndrv_pcm_tstamp {
enum {
SNDRV_PCM_TSTAMP_NONE = 0,
SNDRV_PCM_TSTAMP_MMAP,
SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_MMAP,
};
struct sndrv_pcm_sw_params {
enum sndrv_pcm_tstamp tstamp_mode; /* timestamp mode */
struct snd_pcm_sw_params {
int tstamp_mode; /* timestamp mode */
unsigned int period_step;
unsigned int sleep_min; /* min ticks to sleep */
sndrv_pcm_uframes_t avail_min; /* min avail frames for wakeup */
sndrv_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */
sndrv_pcm_uframes_t start_threshold; /* min hw_avail frames for automatic start */
sndrv_pcm_uframes_t stop_threshold; /* min avail frames for automatic stop */
sndrv_pcm_uframes_t silence_threshold; /* min distance from noise for silence filling */
sndrv_pcm_uframes_t silence_size; /* silence block size */
sndrv_pcm_uframes_t boundary; /* pointers wrap point */
snd_pcm_uframes_t avail_min; /* min avail frames for wakeup */
snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */
snd_pcm_uframes_t start_threshold; /* min hw_avail frames for automatic start */
snd_pcm_uframes_t stop_threshold; /* min avail frames for automatic stop */
snd_pcm_uframes_t silence_threshold; /* min distance from noise for silence filling */
snd_pcm_uframes_t silence_size; /* silence block size */
snd_pcm_uframes_t boundary; /* pointers wrap point */
unsigned char reserved[64]; /* reserved for future */
};
struct sndrv_pcm_channel_info {
struct snd_pcm_channel_info {
unsigned int channel;
off_t offset; /* mmap offset */
unsigned int first; /* offset to first sample in bits */
unsigned int step; /* samples distance in bits */
};
struct sndrv_pcm_status {
enum sndrv_pcm_state state; /* stream state */
struct snd_pcm_status {
snd_pcm_state_t state; /* stream state */
struct timespec trigger_tstamp; /* time when stream was started/stopped/paused */
struct timespec tstamp; /* reference timestamp */
sndrv_pcm_uframes_t appl_ptr; /* appl ptr */
sndrv_pcm_uframes_t hw_ptr; /* hw ptr */
sndrv_pcm_sframes_t delay; /* current delay in frames */
sndrv_pcm_uframes_t avail; /* number of frames available */
sndrv_pcm_uframes_t avail_max; /* max frames available on hw since last status */
sndrv_pcm_uframes_t overrange; /* count of ADC (capture) overrange detections from last status */
enum sndrv_pcm_state suspended_state; /* suspended stream state */
snd_pcm_uframes_t appl_ptr; /* appl ptr */
snd_pcm_uframes_t hw_ptr; /* hw ptr */
snd_pcm_sframes_t delay; /* current delay in frames */
snd_pcm_uframes_t avail; /* number of frames available */
snd_pcm_uframes_t avail_max; /* max frames available on hw since last status */
snd_pcm_uframes_t overrange; /* count of ADC (capture) overrange detections from last status */
snd_pcm_state_t suspended_state; /* suspended stream state */
unsigned char reserved[60]; /* must be filled with zero */
};
struct sndrv_pcm_mmap_status {
enum sndrv_pcm_state state; /* RO: state - SNDRV_PCM_STATE_XXXX */
struct snd_pcm_mmap_status {
snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */
int pad1; /* Needed for 64 bit alignment */
sndrv_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
struct timespec tstamp; /* Timestamp */
enum sndrv_pcm_state suspended_state; /* RO: suspended stream state */
snd_pcm_state_t suspended_state; /* RO: suspended stream state */
};
struct sndrv_pcm_mmap_control {
sndrv_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */
sndrv_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */
struct snd_pcm_mmap_control {
snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */
snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */
};
#define SNDRV_PCM_SYNC_PTR_HWSYNC (1<<0) /* execute hwsync */
#define SNDRV_PCM_SYNC_PTR_APPL (1<<1) /* get appl_ptr from driver (r/w op) */
#define SNDRV_PCM_SYNC_PTR_AVAIL_MIN (1<<2) /* get avail_min from driver */
struct sndrv_pcm_sync_ptr {
struct snd_pcm_sync_ptr {
unsigned int flags;
union {
struct sndrv_pcm_mmap_status status;
struct snd_pcm_mmap_status status;
unsigned char reserved[64];
} s;
union {
struct sndrv_pcm_mmap_control control;
struct snd_pcm_mmap_control control;
unsigned char reserved[64];
} c;
};
struct sndrv_xferi {
sndrv_pcm_sframes_t result;
struct snd_xferi {
snd_pcm_sframes_t result;
void __user *buf;
sndrv_pcm_uframes_t frames;
snd_pcm_uframes_t frames;
};
struct sndrv_xfern {
sndrv_pcm_sframes_t result;
struct snd_xfern {
snd_pcm_sframes_t result;
void __user * __user *bufs;
sndrv_pcm_uframes_t frames;
snd_pcm_uframes_t frames;
};
enum {
SNDRV_PCM_IOCTL_PVERSION = _IOR('A', 0x00, int),
SNDRV_PCM_IOCTL_INFO = _IOR('A', 0x01, struct sndrv_pcm_info),
SNDRV_PCM_IOCTL_INFO = _IOR('A', 0x01, struct snd_pcm_info),
SNDRV_PCM_IOCTL_TSTAMP = _IOW('A', 0x02, int),
SNDRV_PCM_IOCTL_HW_REFINE = _IOWR('A', 0x10, struct sndrv_pcm_hw_params),
SNDRV_PCM_IOCTL_HW_PARAMS = _IOWR('A', 0x11, struct sndrv_pcm_hw_params),
SNDRV_PCM_IOCTL_HW_REFINE = _IOWR('A', 0x10, struct snd_pcm_hw_params),
SNDRV_PCM_IOCTL_HW_PARAMS = _IOWR('A', 0x11, struct snd_pcm_hw_params),
SNDRV_PCM_IOCTL_HW_FREE = _IO('A', 0x12),
SNDRV_PCM_IOCTL_SW_PARAMS = _IOWR('A', 0x13, struct sndrv_pcm_sw_params),
SNDRV_PCM_IOCTL_STATUS = _IOR('A', 0x20, struct sndrv_pcm_status),
SNDRV_PCM_IOCTL_DELAY = _IOR('A', 0x21, sndrv_pcm_sframes_t),
SNDRV_PCM_IOCTL_SW_PARAMS = _IOWR('A', 0x13, struct snd_pcm_sw_params),
SNDRV_PCM_IOCTL_STATUS = _IOR('A', 0x20, struct snd_pcm_status),
SNDRV_PCM_IOCTL_DELAY = _IOR('A', 0x21, snd_pcm_sframes_t),
SNDRV_PCM_IOCTL_HWSYNC = _IO('A', 0x22),
SNDRV_PCM_IOCTL_SYNC_PTR = _IOWR('A', 0x23, struct sndrv_pcm_sync_ptr),
SNDRV_PCM_IOCTL_CHANNEL_INFO = _IOR('A', 0x32, struct sndrv_pcm_channel_info),
SNDRV_PCM_IOCTL_SYNC_PTR = _IOWR('A', 0x23, struct snd_pcm_sync_ptr),
SNDRV_PCM_IOCTL_CHANNEL_INFO = _IOR('A', 0x32, struct snd_pcm_channel_info),
SNDRV_PCM_IOCTL_PREPARE = _IO('A', 0x40),
SNDRV_PCM_IOCTL_RESET = _IO('A', 0x41),
SNDRV_PCM_IOCTL_START = _IO('A', 0x42),
SNDRV_PCM_IOCTL_DROP = _IO('A', 0x43),
SNDRV_PCM_IOCTL_DRAIN = _IO('A', 0x44),
SNDRV_PCM_IOCTL_PAUSE = _IOW('A', 0x45, int),
SNDRV_PCM_IOCTL_REWIND = _IOW('A', 0x46, sndrv_pcm_uframes_t),
SNDRV_PCM_IOCTL_REWIND = _IOW('A', 0x46, snd_pcm_uframes_t),
SNDRV_PCM_IOCTL_RESUME = _IO('A', 0x47),
SNDRV_PCM_IOCTL_XRUN = _IO('A', 0x48),
SNDRV_PCM_IOCTL_FORWARD = _IOW('A', 0x49, sndrv_pcm_uframes_t),
SNDRV_PCM_IOCTL_WRITEI_FRAMES = _IOW('A', 0x50, struct sndrv_xferi),
SNDRV_PCM_IOCTL_READI_FRAMES = _IOR('A', 0x51, struct sndrv_xferi),
SNDRV_PCM_IOCTL_WRITEN_FRAMES = _IOW('A', 0x52, struct sndrv_xfern),
SNDRV_PCM_IOCTL_READN_FRAMES = _IOR('A', 0x53, struct sndrv_xfern),
SNDRV_PCM_IOCTL_FORWARD = _IOW('A', 0x49, snd_pcm_uframes_t),
SNDRV_PCM_IOCTL_WRITEI_FRAMES = _IOW('A', 0x50, struct snd_xferi),
SNDRV_PCM_IOCTL_READI_FRAMES = _IOR('A', 0x51, struct snd_xferi),
SNDRV_PCM_IOCTL_WRITEN_FRAMES = _IOW('A', 0x52, struct snd_xfern),
SNDRV_PCM_IOCTL_READN_FRAMES = _IOR('A', 0x53, struct snd_xfern),
SNDRV_PCM_IOCTL_LINK = _IOW('A', 0x60, int),
SNDRV_PCM_IOCTL_UNLINK = _IO('A', 0x61),
};
@ -507,7 +479,7 @@ enum {
#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 0)
enum sndrv_rawmidi_stream {
enum {
SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
SNDRV_RAWMIDI_STREAM_INPUT,
SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT,
@ -517,10 +489,10 @@ enum sndrv_rawmidi_stream {
#define SNDRV_RAWMIDI_INFO_INPUT 0x00000002
#define SNDRV_RAWMIDI_INFO_DUPLEX 0x00000004
struct sndrv_rawmidi_info {
struct snd_rawmidi_info {
unsigned int device; /* RO/WR (control): device number */
unsigned int subdevice; /* RO/WR (control): subdevice number */
enum sndrv_rawmidi_stream stream; /* WR: stream */
int stream; /* WR: stream */
int card; /* R: card number */
unsigned int flags; /* SNDRV_RAWMIDI_INFO_XXXX */
unsigned char id[64]; /* ID (user selectable) */
@ -531,16 +503,16 @@ struct sndrv_rawmidi_info {
unsigned char reserved[64]; /* reserved for future use */
};
struct sndrv_rawmidi_params {
enum sndrv_rawmidi_stream stream;
struct snd_rawmidi_params {
int stream;
size_t buffer_size; /* queue size in bytes */
size_t avail_min; /* minimum avail bytes for wakeup */
unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */
unsigned char reserved[16]; /* reserved for future use */
};
struct sndrv_rawmidi_status {
enum sndrv_rawmidi_stream stream;
struct snd_rawmidi_status {
int stream;
struct timespec tstamp; /* Timestamp */
size_t avail; /* available bytes */
size_t xruns; /* count of overruns since last status (in bytes) */
@ -549,9 +521,9 @@ struct sndrv_rawmidi_status {
enum {
SNDRV_RAWMIDI_IOCTL_PVERSION = _IOR('W', 0x00, int),
SNDRV_RAWMIDI_IOCTL_INFO = _IOR('W', 0x01, struct sndrv_rawmidi_info),
SNDRV_RAWMIDI_IOCTL_PARAMS = _IOWR('W', 0x10, struct sndrv_rawmidi_params),
SNDRV_RAWMIDI_IOCTL_STATUS = _IOWR('W', 0x20, struct sndrv_rawmidi_status),
SNDRV_RAWMIDI_IOCTL_INFO = _IOR('W', 0x01, struct snd_rawmidi_info),
SNDRV_RAWMIDI_IOCTL_PARAMS = _IOWR('W', 0x10, struct snd_rawmidi_params),
SNDRV_RAWMIDI_IOCTL_STATUS = _IOWR('W', 0x20, struct snd_rawmidi_status),
SNDRV_RAWMIDI_IOCTL_DROP = _IOW('W', 0x30, int),
SNDRV_RAWMIDI_IOCTL_DRAIN = _IOW('W', 0x31, int),
};
@ -562,7 +534,7 @@ enum {
#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 5)
enum sndrv_timer_class {
enum {
SNDRV_TIMER_CLASS_NONE = -1,
SNDRV_TIMER_CLASS_SLAVE = 0,
SNDRV_TIMER_CLASS_GLOBAL,
@ -572,7 +544,7 @@ enum sndrv_timer_class {
};
/* slave timer classes */
enum sndrv_timer_slave_class {
enum {
SNDRV_TIMER_SCLASS_NONE = 0,
SNDRV_TIMER_SCLASS_APPLICATION,
SNDRV_TIMER_SCLASS_SEQUENCER, /* alias */
@ -588,16 +560,16 @@ enum sndrv_timer_slave_class {
/* info flags */
#define SNDRV_TIMER_FLG_SLAVE (1<<0) /* cannot be controlled */
struct sndrv_timer_id {
enum sndrv_timer_class dev_class;
enum sndrv_timer_slave_class dev_sclass;
struct snd_timer_id {
int dev_class;
int dev_sclass;
int card;
int device;
int subdevice;
};
struct sndrv_timer_ginfo {
struct sndrv_timer_id tid; /* requested timer ID */
struct snd_timer_ginfo {
struct snd_timer_id tid; /* requested timer ID */
unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */
int card; /* card number */
unsigned char id[64]; /* timer identification */
@ -610,27 +582,27 @@ struct sndrv_timer_ginfo {
unsigned char reserved[32];
};
struct sndrv_timer_gparams {
struct sndrv_timer_id tid; /* requested timer ID */
struct snd_timer_gparams {
struct snd_timer_id tid; /* requested timer ID */
unsigned long period_num; /* requested precise period duration (in seconds) - numerator */
unsigned long period_den; /* requested precise period duration (in seconds) - denominator */
unsigned char reserved[32];
};
struct sndrv_timer_gstatus {
struct sndrv_timer_id tid; /* requested timer ID */
struct snd_timer_gstatus {
struct snd_timer_id tid; /* requested timer ID */
unsigned long resolution; /* current period resolution in ns */
unsigned long resolution_num; /* precise current period resolution (in seconds) - numerator */
unsigned long resolution_den; /* precise current period resolution (in seconds) - denominator */
unsigned char reserved[32];
};
struct sndrv_timer_select {
struct sndrv_timer_id id; /* bind to timer ID */
struct snd_timer_select {
struct snd_timer_id id; /* bind to timer ID */
unsigned char reserved[32]; /* reserved */
};
struct sndrv_timer_info {
struct snd_timer_info {
unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */
int card; /* card number */
unsigned char id[64]; /* timer identificator */
@ -644,7 +616,7 @@ struct sndrv_timer_info {
#define SNDRV_TIMER_PSFLG_EXCLUSIVE (1<<1) /* exclusive use, precise start/stop/pause/continue */
#define SNDRV_TIMER_PSFLG_EARLY_EVENT (1<<2) /* write early event to the poll queue */
struct sndrv_timer_params {
struct snd_timer_params {
unsigned int flags; /* flags - SNDRV_MIXER_PSFLG_* */
unsigned int ticks; /* requested resolution in ticks */
unsigned int queue_size; /* total size of queue (32-1024) */
@ -653,7 +625,7 @@ struct sndrv_timer_params {
unsigned char reserved[60]; /* reserved */
};
struct sndrv_timer_status {
struct snd_timer_status {
struct timespec tstamp; /* Timestamp - last update */
unsigned int resolution; /* current period resolution in ns */
unsigned int lost; /* counter of master tick lost */
@ -664,15 +636,15 @@ struct sndrv_timer_status {
enum {
SNDRV_TIMER_IOCTL_PVERSION = _IOR('T', 0x00, int),
SNDRV_TIMER_IOCTL_NEXT_DEVICE = _IOWR('T', 0x01, struct sndrv_timer_id),
SNDRV_TIMER_IOCTL_NEXT_DEVICE = _IOWR('T', 0x01, struct snd_timer_id),
SNDRV_TIMER_IOCTL_TREAD = _IOW('T', 0x02, int),
SNDRV_TIMER_IOCTL_GINFO = _IOWR('T', 0x03, struct sndrv_timer_ginfo),
SNDRV_TIMER_IOCTL_GPARAMS = _IOW('T', 0x04, struct sndrv_timer_gparams),
SNDRV_TIMER_IOCTL_GSTATUS = _IOWR('T', 0x05, struct sndrv_timer_gstatus),
SNDRV_TIMER_IOCTL_SELECT = _IOW('T', 0x10, struct sndrv_timer_select),
SNDRV_TIMER_IOCTL_INFO = _IOR('T', 0x11, struct sndrv_timer_info),
SNDRV_TIMER_IOCTL_PARAMS = _IOW('T', 0x12, struct sndrv_timer_params),
SNDRV_TIMER_IOCTL_STATUS = _IOR('T', 0x14, struct sndrv_timer_status),
SNDRV_TIMER_IOCTL_GINFO = _IOWR('T', 0x03, struct snd_timer_ginfo),
SNDRV_TIMER_IOCTL_GPARAMS = _IOW('T', 0x04, struct snd_timer_gparams),
SNDRV_TIMER_IOCTL_GSTATUS = _IOWR('T', 0x05, struct snd_timer_gstatus),
SNDRV_TIMER_IOCTL_SELECT = _IOW('T', 0x10, struct snd_timer_select),
SNDRV_TIMER_IOCTL_INFO = _IOR('T', 0x11, struct snd_timer_info),
SNDRV_TIMER_IOCTL_PARAMS = _IOW('T', 0x12, struct snd_timer_params),
SNDRV_TIMER_IOCTL_STATUS = _IOR('T', 0x14, struct snd_timer_status),
/* The following four ioctls are changed since 1.0.9 due to confliction */
SNDRV_TIMER_IOCTL_START = _IO('T', 0xa0),
SNDRV_TIMER_IOCTL_STOP = _IO('T', 0xa1),
@ -680,12 +652,12 @@ enum {
SNDRV_TIMER_IOCTL_PAUSE = _IO('T', 0xa3),
};
struct sndrv_timer_read {
struct snd_timer_read {
unsigned int resolution;
unsigned int ticks;
};
enum sndrv_timer_event {
enum {
SNDRV_TIMER_EVENT_RESOLUTION = 0, /* val = resolution in ns */
SNDRV_TIMER_EVENT_TICK, /* val = ticks */
SNDRV_TIMER_EVENT_START, /* val = resolution in ns */
@ -704,8 +676,8 @@ enum sndrv_timer_event {
SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10,
};
struct sndrv_timer_tread {
enum sndrv_timer_event event;
struct snd_timer_tread {
int event;
struct timespec tstamp;
unsigned int val;
};
@ -718,7 +690,7 @@ struct sndrv_timer_tread {
#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 3)
struct sndrv_ctl_card_info {
struct snd_ctl_card_info {
int card; /* card number */
int pad; /* reserved for future (was type) */
unsigned char id[16]; /* ID of card (user selectable) */
@ -731,27 +703,25 @@ struct sndrv_ctl_card_info {
unsigned char reserved[48]; /* reserved for future */
};
enum sndrv_ctl_elem_type {
SNDRV_CTL_ELEM_TYPE_NONE = 0, /* invalid */
SNDRV_CTL_ELEM_TYPE_BOOLEAN, /* boolean type */
SNDRV_CTL_ELEM_TYPE_INTEGER, /* integer type */
SNDRV_CTL_ELEM_TYPE_ENUMERATED, /* enumerated type */
SNDRV_CTL_ELEM_TYPE_BYTES, /* byte array */
SNDRV_CTL_ELEM_TYPE_IEC958, /* IEC958 (S/PDIF) setup */
SNDRV_CTL_ELEM_TYPE_INTEGER64, /* 64-bit integer type */
SNDRV_CTL_ELEM_TYPE_LAST = SNDRV_CTL_ELEM_TYPE_INTEGER64,
};
typedef int __bitwise snd_ctl_elem_type_t;
#define SNDRV_CTL_ELEM_TYPE_NONE ((__force snd_ctl_elem_type_t) 0) /* invalid */
#define SNDRV_CTL_ELEM_TYPE_BOOLEAN ((__force snd_ctl_elem_type_t) 1) /* boolean type */
#define SNDRV_CTL_ELEM_TYPE_INTEGER ((__force snd_ctl_elem_type_t) 2) /* integer type */
#define SNDRV_CTL_ELEM_TYPE_ENUMERATED ((__force snd_ctl_elem_type_t) 3) /* enumerated type */
#define SNDRV_CTL_ELEM_TYPE_BYTES ((__force snd_ctl_elem_type_t) 4) /* byte array */
#define SNDRV_CTL_ELEM_TYPE_IEC958 ((__force snd_ctl_elem_type_t) 5) /* IEC958 (S/PDIF) setup */
#define SNDRV_CTL_ELEM_TYPE_INTEGER64 ((__force snd_ctl_elem_type_t) 6) /* 64-bit integer type */
#define SNDRV_CTL_ELEM_TYPE_LAST SNDRV_CTL_ELEM_TYPE_INTEGER64
enum sndrv_ctl_elem_iface {
SNDRV_CTL_ELEM_IFACE_CARD = 0, /* global control */
SNDRV_CTL_ELEM_IFACE_HWDEP, /* hardware dependent device */
SNDRV_CTL_ELEM_IFACE_MIXER, /* virtual mixer device */
SNDRV_CTL_ELEM_IFACE_PCM, /* PCM device */
SNDRV_CTL_ELEM_IFACE_RAWMIDI, /* RawMidi device */
SNDRV_CTL_ELEM_IFACE_TIMER, /* timer device */
SNDRV_CTL_ELEM_IFACE_SEQUENCER, /* sequencer client */
SNDRV_CTL_ELEM_IFACE_LAST = SNDRV_CTL_ELEM_IFACE_SEQUENCER,
};
typedef int __bitwise snd_ctl_elem_iface_t;
#define SNDRV_CTL_ELEM_IFACE_CARD ((__force snd_ctl_elem_iface_t) 0) /* global control */
#define SNDRV_CTL_ELEM_IFACE_HWDEP ((__force snd_ctl_elem_iface_t) 1) /* hardware dependent device */
#define SNDRV_CTL_ELEM_IFACE_MIXER ((__force snd_ctl_elem_iface_t) 2) /* virtual mixer device */
#define SNDRV_CTL_ELEM_IFACE_PCM ((__force snd_ctl_elem_iface_t) 3) /* PCM device */
#define SNDRV_CTL_ELEM_IFACE_RAWMIDI ((__force snd_ctl_elem_iface_t) 4) /* RawMidi device */
#define SNDRV_CTL_ELEM_IFACE_TIMER ((__force snd_ctl_elem_iface_t) 5) /* timer device */
#define SNDRV_CTL_ELEM_IFACE_SEQUENCER ((__force snd_ctl_elem_iface_t) 6) /* sequencer client */
#define SNDRV_CTL_ELEM_IFACE_LAST SNDRV_CTL_ELEM_IFACE_SEQUENCER
#define SNDRV_CTL_ELEM_ACCESS_READ (1<<0)
#define SNDRV_CTL_ELEM_ACCESS_WRITE (1<<1)
@ -773,27 +743,27 @@ enum sndrv_ctl_elem_iface {
#define SNDRV_CTL_POWER_D3hot (SNDRV_CTL_POWER_D3|0x0000) /* Off, with power */
#define SNDRV_CTL_POWER_D3cold (SNDRV_CTL_POWER_D3|0x0001) /* Off, without power */
struct sndrv_ctl_elem_id {
struct snd_ctl_elem_id {
unsigned int numid; /* numeric identifier, zero = invalid */
enum sndrv_ctl_elem_iface iface; /* interface identifier */
snd_ctl_elem_iface_t iface; /* interface identifier */
unsigned int device; /* device/client number */
unsigned int subdevice; /* subdevice (substream) number */
unsigned char name[44]; /* ASCII name of item */
unsigned int index; /* index of item */
};
struct sndrv_ctl_elem_list {
struct snd_ctl_elem_list {
unsigned int offset; /* W: first element ID to get */
unsigned int space; /* W: count of element IDs to get */
unsigned int used; /* R: count of element IDs set */
unsigned int count; /* R: count of all elements */
struct sndrv_ctl_elem_id __user *pids; /* R: IDs */
struct snd_ctl_elem_id __user *pids; /* R: IDs */
unsigned char reserved[50];
};
struct sndrv_ctl_elem_info {
struct sndrv_ctl_elem_id id; /* W: element ID */
enum sndrv_ctl_elem_type type; /* R: value type - SNDRV_CTL_ELEM_TYPE_* */
struct snd_ctl_elem_info {
struct snd_ctl_elem_id id; /* W: element ID */
snd_ctl_elem_type_t type; /* R: value type - SNDRV_CTL_ELEM_TYPE_* */
unsigned int access; /* R: value access (bitmask) - SNDRV_CTL_ELEM_ACCESS_* */
unsigned int count; /* count of values */
pid_t owner; /* owner's PID of this control */
@ -822,8 +792,8 @@ struct sndrv_ctl_elem_info {
unsigned char reserved[64-4*sizeof(unsigned short)];
};
struct sndrv_ctl_elem_value {
struct sndrv_ctl_elem_id id; /* W: element ID */
struct snd_ctl_elem_value {
struct snd_ctl_elem_id id; /* W: element ID */
unsigned int indirect: 1; /* W: use indirect pointer (xxx_ptr member) */
union {
union {
@ -842,7 +812,7 @@ struct sndrv_ctl_elem_value {
unsigned char data[512];
unsigned char *data_ptr;
} bytes;
struct sndrv_aes_iec958 iec958;
struct snd_aes_iec958 iec958;
} value; /* RO */
struct timespec tstamp;
unsigned char reserved[128-sizeof(struct timespec)];
@ -850,24 +820,24 @@ struct sndrv_ctl_elem_value {
enum {
SNDRV_CTL_IOCTL_PVERSION = _IOR('U', 0x00, int),
SNDRV_CTL_IOCTL_CARD_INFO = _IOR('U', 0x01, struct sndrv_ctl_card_info),
SNDRV_CTL_IOCTL_ELEM_LIST = _IOWR('U', 0x10, struct sndrv_ctl_elem_list),
SNDRV_CTL_IOCTL_ELEM_INFO = _IOWR('U', 0x11, struct sndrv_ctl_elem_info),
SNDRV_CTL_IOCTL_ELEM_READ = _IOWR('U', 0x12, struct sndrv_ctl_elem_value),
SNDRV_CTL_IOCTL_ELEM_WRITE = _IOWR('U', 0x13, struct sndrv_ctl_elem_value),
SNDRV_CTL_IOCTL_ELEM_LOCK = _IOW('U', 0x14, struct sndrv_ctl_elem_id),
SNDRV_CTL_IOCTL_ELEM_UNLOCK = _IOW('U', 0x15, struct sndrv_ctl_elem_id),
SNDRV_CTL_IOCTL_CARD_INFO = _IOR('U', 0x01, struct snd_ctl_card_info),
SNDRV_CTL_IOCTL_ELEM_LIST = _IOWR('U', 0x10, struct snd_ctl_elem_list),
SNDRV_CTL_IOCTL_ELEM_INFO = _IOWR('U', 0x11, struct snd_ctl_elem_info),
SNDRV_CTL_IOCTL_ELEM_READ = _IOWR('U', 0x12, struct snd_ctl_elem_value),
SNDRV_CTL_IOCTL_ELEM_WRITE = _IOWR('U', 0x13, struct snd_ctl_elem_value),
SNDRV_CTL_IOCTL_ELEM_LOCK = _IOW('U', 0x14, struct snd_ctl_elem_id),
SNDRV_CTL_IOCTL_ELEM_UNLOCK = _IOW('U', 0x15, struct snd_ctl_elem_id),
SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS = _IOWR('U', 0x16, int),
SNDRV_CTL_IOCTL_ELEM_ADD = _IOWR('U', 0x17, struct sndrv_ctl_elem_info),
SNDRV_CTL_IOCTL_ELEM_REPLACE = _IOWR('U', 0x18, struct sndrv_ctl_elem_info),
SNDRV_CTL_IOCTL_ELEM_REMOVE = _IOWR('U', 0x19, struct sndrv_ctl_elem_id),
SNDRV_CTL_IOCTL_ELEM_ADD = _IOWR('U', 0x17, struct snd_ctl_elem_info),
SNDRV_CTL_IOCTL_ELEM_REPLACE = _IOWR('U', 0x18, struct snd_ctl_elem_info),
SNDRV_CTL_IOCTL_ELEM_REMOVE = _IOWR('U', 0x19, struct snd_ctl_elem_id),
SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE = _IOWR('U', 0x20, int),
SNDRV_CTL_IOCTL_HWDEP_INFO = _IOR('U', 0x21, struct sndrv_hwdep_info),
SNDRV_CTL_IOCTL_HWDEP_INFO = _IOR('U', 0x21, struct snd_hwdep_info),
SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE = _IOR('U', 0x30, int),
SNDRV_CTL_IOCTL_PCM_INFO = _IOWR('U', 0x31, struct sndrv_pcm_info),
SNDRV_CTL_IOCTL_PCM_INFO = _IOWR('U', 0x31, struct snd_pcm_info),
SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE = _IOW('U', 0x32, int),
SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE = _IOWR('U', 0x40, int),
SNDRV_CTL_IOCTL_RAWMIDI_INFO = _IOWR('U', 0x41, struct sndrv_rawmidi_info),
SNDRV_CTL_IOCTL_RAWMIDI_INFO = _IOWR('U', 0x41, struct snd_rawmidi_info),
SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE = _IOW('U', 0x42, int),
SNDRV_CTL_IOCTL_POWER = _IOWR('U', 0xd0, int),
SNDRV_CTL_IOCTL_POWER_STATE = _IOR('U', 0xd1, int),
@ -887,12 +857,12 @@ enum sndrv_ctl_event_type {
#define SNDRV_CTL_EVENT_MASK_ADD (1<<2) /* element was added */
#define SNDRV_CTL_EVENT_MASK_REMOVE (~0U) /* element was removed */
struct sndrv_ctl_event {
enum sndrv_ctl_event_type type; /* event type - SNDRV_CTL_EVENT_* */
struct snd_ctl_event {
int type; /* event type - SNDRV_CTL_EVENT_* */
union {
struct {
unsigned int mask;
struct sndrv_ctl_elem_id id;
struct snd_ctl_elem_id id;
} elem;
unsigned char data8[60];
} data;
@ -920,14 +890,14 @@ struct sndrv_ctl_event {
*
*/
struct sndrv_xferv {
struct snd_xferv {
const struct iovec *vector;
unsigned long count;
};
enum {
SNDRV_IOCTL_READV = _IOW('K', 0x00, struct sndrv_xferv),
SNDRV_IOCTL_WRITEV = _IOW('K', 0x01, struct sndrv_xferv),
SNDRV_IOCTL_READV = _IOW('K', 0x00, struct snd_xferv),
SNDRV_IOCTL_WRITEV = _IOW('K', 0x01, struct snd_xferv),
};
#endif /* __SOUND_ASOUND_H */

View File

@ -29,16 +29,16 @@
#define SNDRV_DM_FM_MODE_OPL2 0x00
#define SNDRV_DM_FM_MODE_OPL3 0x01
typedef struct snd_dm_fm_info {
struct snd_dm_fm_info {
unsigned char fm_mode; /* OPL mode, see SNDRV_DM_FM_MODE_XXX */
unsigned char rhythm; /* percussion mode flag */
} snd_dm_fm_info_t;
};
/*
* Data structure composing an FM "note" or sound event.
*/
typedef struct snd_dm_fm_voice {
struct snd_dm_fm_voice {
unsigned char op; /* operator cell (0 or 1) */
unsigned char voice; /* FM voice (0 to 17) */
@ -60,25 +60,25 @@ typedef struct snd_dm_fm_voice {
unsigned char left; /* stereo left */
unsigned char right; /* stereo right */
unsigned char waveform; /* 3 bits: waveform shape */
} snd_dm_fm_voice_t;
};
/*
* This describes an FM note by its voice, octave, frequency number (10bit)
* and key on/off.
*/
typedef struct snd_dm_fm_note {
struct snd_dm_fm_note {
unsigned char voice; /* 0-17 voice channel */
unsigned char octave; /* 3 bits: what octave to play */
unsigned int fnum; /* 10 bits: frequency number */
unsigned char key_on; /* set for active, clear for silent */
} snd_dm_fm_note_t;
};
/*
* FM parameters that apply globally to all voices, and thus are not "notes"
*/
typedef struct snd_dm_fm_params {
struct snd_dm_fm_params {
unsigned char am_depth; /* amplitude modulation depth (1=hi) */
unsigned char vib_depth; /* vibrato depth (1=hi) */
unsigned char kbd_split; /* keyboard split */
@ -90,17 +90,17 @@ typedef struct snd_dm_fm_params {
unsigned char tomtom;
unsigned char cymbal;
unsigned char hihat;
} snd_dm_fm_params_t;
};
/*
* FM mode ioctl settings
*/
#define SNDRV_DM_FM_IOCTL_INFO _IOR('H', 0x20, snd_dm_fm_info_t)
#define SNDRV_DM_FM_IOCTL_INFO _IOR('H', 0x20, struct snd_dm_fm_info)
#define SNDRV_DM_FM_IOCTL_RESET _IO ('H', 0x21)
#define SNDRV_DM_FM_IOCTL_PLAY_NOTE _IOW('H', 0x22, snd_dm_fm_note_t)
#define SNDRV_DM_FM_IOCTL_SET_VOICE _IOW('H', 0x23, snd_dm_fm_voice_t)
#define SNDRV_DM_FM_IOCTL_SET_PARAMS _IOW('H', 0x24, snd_dm_fm_params_t)
#define SNDRV_DM_FM_IOCTL_PLAY_NOTE _IOW('H', 0x22, struct snd_dm_fm_note)
#define SNDRV_DM_FM_IOCTL_SET_VOICE _IOW('H', 0x23, struct snd_dm_fm_voice)
#define SNDRV_DM_FM_IOCTL_SET_PARAMS _IOW('H', 0x24, struct snd_dm_fm_params)
#define SNDRV_DM_FM_IOCTL_SET_MODE _IOW('H', 0x25, int)
/* for OPL3 only */
#define SNDRV_DM_FM_IOCTL_SET_CONNECTION _IOW('H', 0x26, int)

View File

@ -24,24 +24,14 @@
#include <sound/asound.h>
typedef struct sndrv_aes_iec958 snd_aes_iec958_t;
typedef struct sndrv_ctl_card_info snd_ctl_card_info_t;
typedef enum sndrv_ctl_elem_type snd_ctl_elem_type_t;
typedef enum sndrv_ctl_elem_iface snd_ctl_elem_iface_t;
typedef struct sndrv_ctl_elem_id snd_ctl_elem_id_t;
typedef struct sndrv_ctl_elem_list snd_ctl_elem_list_t;
typedef struct sndrv_ctl_elem_info snd_ctl_elem_info_t;
typedef struct sndrv_ctl_elem_value snd_ctl_elem_value_t;
typedef enum sndrv_ctl_event_type snd_ctl_event_type_t;
typedef struct sndrv_ctl_event snd_ctl_event_t;
#define snd_kcontrol_chip(kcontrol) ((kcontrol)->private_data)
typedef int (snd_kcontrol_info_t) (snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo);
typedef int (snd_kcontrol_get_t) (snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
typedef int (snd_kcontrol_put_t) (snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
struct snd_kcontrol;
typedef int (snd_kcontrol_info_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_info * uinfo);
typedef int (snd_kcontrol_get_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol);
typedef int (snd_kcontrol_put_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol);
typedef struct _snd_kcontrol_new {
struct snd_kcontrol_new {
snd_ctl_elem_iface_t iface; /* interface identifier */
unsigned int device; /* device/client number */
unsigned int subdevice; /* subdevice (substream) number */
@ -53,40 +43,40 @@ typedef struct _snd_kcontrol_new {
snd_kcontrol_get_t *get;
snd_kcontrol_put_t *put;
unsigned long private_value;
} snd_kcontrol_new_t;
};
typedef struct _snd_kcontrol_volatile {
snd_ctl_file_t *owner; /* locked */
struct snd_kcontrol_volatile {
struct snd_ctl_file *owner; /* locked */
pid_t owner_pid;
unsigned int access; /* access rights */
} snd_kcontrol_volatile_t;
};
struct _snd_kcontrol {
struct snd_kcontrol {
struct list_head list; /* list of controls */
snd_ctl_elem_id_t id;
struct snd_ctl_elem_id id;
unsigned int count; /* count of same elements */
snd_kcontrol_info_t *info;
snd_kcontrol_get_t *get;
snd_kcontrol_put_t *put;
unsigned long private_value;
void *private_data;
void (*private_free)(snd_kcontrol_t *kcontrol);
snd_kcontrol_volatile_t vd[0]; /* volatile data */
void (*private_free)(struct snd_kcontrol *kcontrol);
struct snd_kcontrol_volatile vd[0]; /* volatile data */
};
#define snd_kcontrol(n) list_entry(n, snd_kcontrol_t, list)
#define snd_kcontrol(n) list_entry(n, struct snd_kcontrol, list)
typedef struct _snd_kctl_event {
struct snd_kctl_event {
struct list_head list; /* list of events */
snd_ctl_elem_id_t id;
struct snd_ctl_elem_id id;
unsigned int mask;
} snd_kctl_event_t;
};
#define snd_kctl_event(n) list_entry(n, snd_kctl_event_t, list)
#define snd_kctl_event(n) list_entry(n, struct snd_kctl_event, list)
struct _snd_ctl_file {
struct snd_ctl_file {
struct list_head list; /* list of all control files */
snd_card_t *card;
struct snd_card *card;
pid_t pid;
int prefer_pcm_subdevice;
int prefer_rawmidi_subdevice;
@ -97,25 +87,25 @@ struct _snd_ctl_file {
struct list_head events; /* waiting events for read */
};
#define snd_ctl_file(n) list_entry(n, snd_ctl_file_t, list)
#define snd_ctl_file(n) list_entry(n, struct snd_ctl_file, list)
typedef int (*snd_kctl_ioctl_func_t) (snd_card_t * card,
snd_ctl_file_t * control,
unsigned int cmd, unsigned long arg);
typedef int (*snd_kctl_ioctl_func_t) (struct snd_card * card,
struct snd_ctl_file * control,
unsigned int cmd, unsigned long arg);
void snd_ctl_notify(snd_card_t * card, unsigned int mask, snd_ctl_elem_id_t * id);
void snd_ctl_notify(struct snd_card * card, unsigned int mask, struct snd_ctl_elem_id * id);
snd_kcontrol_t *snd_ctl_new(snd_kcontrol_t * kcontrol, unsigned int access);
snd_kcontrol_t *snd_ctl_new1(const snd_kcontrol_new_t * kcontrolnew, void * private_data);
void snd_ctl_free_one(snd_kcontrol_t * kcontrol);
int snd_ctl_add(snd_card_t * card, snd_kcontrol_t * kcontrol);
int snd_ctl_remove(snd_card_t * card, snd_kcontrol_t * kcontrol);
int snd_ctl_remove_id(snd_card_t * card, snd_ctl_elem_id_t *id);
int snd_ctl_rename_id(snd_card_t * card, snd_ctl_elem_id_t *src_id, snd_ctl_elem_id_t *dst_id);
snd_kcontrol_t *snd_ctl_find_numid(snd_card_t * card, unsigned int numid);
snd_kcontrol_t *snd_ctl_find_id(snd_card_t * card, snd_ctl_elem_id_t *id);
struct snd_kcontrol *snd_ctl_new(struct snd_kcontrol * kcontrol, unsigned int access);
struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new * kcontrolnew, void * private_data);
void snd_ctl_free_one(struct snd_kcontrol * kcontrol);
int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol);
int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol);
int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id);
int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id);
struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid);
struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id);
int snd_ctl_create(snd_card_t *card);
int snd_ctl_create(struct snd_card *card);
int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn);
int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn);
@ -127,20 +117,20 @@ int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn);
#define snd_ctl_unregister_ioctl_compat(fcn)
#endif
int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t *control);
int snd_ctl_elem_write(snd_card_t *card, snd_ctl_file_t *file, snd_ctl_elem_value_t *control);
int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control);
int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, struct snd_ctl_elem_value *control);
static inline unsigned int snd_ctl_get_ioffnum(snd_kcontrol_t *kctl, snd_ctl_elem_id_t *id)
static inline unsigned int snd_ctl_get_ioffnum(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
{
return id->numid - kctl->id.numid;
}
static inline unsigned int snd_ctl_get_ioffidx(snd_kcontrol_t *kctl, snd_ctl_elem_id_t *id)
static inline unsigned int snd_ctl_get_ioffidx(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
{
return id->index - kctl->id.index;
}
static inline unsigned int snd_ctl_get_ioff(snd_kcontrol_t *kctl, snd_ctl_elem_id_t *id)
static inline unsigned int snd_ctl_get_ioff(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
{
if (id->numid) {
return snd_ctl_get_ioffnum(kctl, id);
@ -149,8 +139,8 @@ static inline unsigned int snd_ctl_get_ioff(snd_kcontrol_t *kctl, snd_ctl_elem_i
}
}
static inline snd_ctl_elem_id_t *snd_ctl_build_ioff(snd_ctl_elem_id_t *dst_id,
snd_kcontrol_t *src_kctl,
static inline struct snd_ctl_elem_id *snd_ctl_build_ioff(struct snd_ctl_elem_id *dst_id,
struct snd_kcontrol *src_kctl,
unsigned int offset)
{
*dst_id = src_kctl->id;

View File

@ -28,13 +28,6 @@
#include <linux/workqueue.h> /* struct workqueue_struct */
#include <linux/pm.h> /* pm_message_t */
/* Typedef's */
typedef struct sndrv_interval snd_interval_t;
typedef enum sndrv_card_type snd_card_type;
typedef struct sndrv_xferi snd_xferi_t;
typedef struct sndrv_xfern snd_xfern_t;
typedef struct sndrv_xferv snd_xferv_t;
/* forward declarations */
#ifdef CONFIG_PCI
struct pci_dev;
@ -47,76 +40,50 @@ struct sbus_dev;
#define SNDRV_DEV_TYPE_RANGE_SIZE 0x1000
typedef enum {
SNDRV_DEV_TOPLEVEL = (0*SNDRV_DEV_TYPE_RANGE_SIZE),
SNDRV_DEV_CONTROL,
SNDRV_DEV_LOWLEVEL_PRE,
SNDRV_DEV_LOWLEVEL_NORMAL = (1*SNDRV_DEV_TYPE_RANGE_SIZE),
SNDRV_DEV_PCM,
SNDRV_DEV_RAWMIDI,
SNDRV_DEV_TIMER,
SNDRV_DEV_SEQUENCER,
SNDRV_DEV_HWDEP,
SNDRV_DEV_INFO,
SNDRV_DEV_BUS,
SNDRV_DEV_CODEC,
SNDRV_DEV_LOWLEVEL = (2*SNDRV_DEV_TYPE_RANGE_SIZE)
} snd_device_type_t;
typedef int __bitwise snd_device_type_t;
#define SNDRV_DEV_TOPLEVEL ((__force snd_device_type_t) 0)
#define SNDRV_DEV_CONTROL ((__force snd_device_type_t) 1)
#define SNDRV_DEV_LOWLEVEL_PRE ((__force snd_device_type_t) 2)
#define SNDRV_DEV_LOWLEVEL_NORMAL ((__force snd_device_type_t) 0x1000)
#define SNDRV_DEV_PCM ((__force snd_device_type_t) 0x1001)
#define SNDRV_DEV_RAWMIDI ((__force snd_device_type_t) 0x1002)
#define SNDRV_DEV_TIMER ((__force snd_device_type_t) 0x1003)
#define SNDRV_DEV_SEQUENCER ((__force snd_device_type_t) 0x1004)
#define SNDRV_DEV_HWDEP ((__force snd_device_type_t) 0x1005)
#define SNDRV_DEV_INFO ((__force snd_device_type_t) 0x1006)
#define SNDRV_DEV_BUS ((__force snd_device_type_t) 0x1007)
#define SNDRV_DEV_CODEC ((__force snd_device_type_t) 0x1008)
#define SNDRV_DEV_LOWLEVEL ((__force snd_device_type_t) 0x2000)
typedef enum {
SNDRV_DEV_BUILD,
SNDRV_DEV_REGISTERED,
SNDRV_DEV_DISCONNECTED
} snd_device_state_t;
typedef int __bitwise snd_device_state_t;
#define SNDRV_DEV_BUILD ((__force snd_device_state_t) 0)
#define SNDRV_DEV_REGISTERED ((__force snd_device_state_t) 1)
#define SNDRV_DEV_DISCONNECTED ((__force snd_device_state_t) 2)
typedef enum {
SNDRV_DEV_CMD_PRE = 0,
SNDRV_DEV_CMD_NORMAL = 1,
SNDRV_DEV_CMD_POST = 2
} snd_device_cmd_t;
typedef int __bitwise snd_device_cmd_t;
#define SNDRV_DEV_CMD_PRE ((__force snd_device_cmd_t) 0)
#define SNDRV_DEV_CMD_NORMAL ((__force snd_device_cmd_t) 1)
#define SNDRV_DEV_CMD_POST ((__force snd_device_cmd_t) 2)
typedef struct _snd_card snd_card_t;
typedef struct _snd_device snd_device_t;
struct snd_device;
typedef int (snd_dev_free_t)(snd_device_t *device);
typedef int (snd_dev_register_t)(snd_device_t *device);
typedef int (snd_dev_disconnect_t)(snd_device_t *device);
typedef int (snd_dev_unregister_t)(snd_device_t *device);
struct snd_device_ops {
int (*dev_free)(struct snd_device *dev);
int (*dev_register)(struct snd_device *dev);
int (*dev_disconnect)(struct snd_device *dev);
int (*dev_unregister)(struct snd_device *dev);
};
typedef struct {
snd_dev_free_t *dev_free;
snd_dev_register_t *dev_register;
snd_dev_disconnect_t *dev_disconnect;
snd_dev_unregister_t *dev_unregister;
} snd_device_ops_t;
struct _snd_device {
struct snd_device {
struct list_head list; /* list of registered devices */
snd_card_t *card; /* card which holds this device */
struct snd_card *card; /* card which holds this device */
snd_device_state_t state; /* state of the device */
snd_device_type_t type; /* device type */
void *device_data; /* device structure */
snd_device_ops_t *ops; /* operations */
struct snd_device_ops *ops; /* operations */
};
#define snd_device(n) list_entry(n, snd_device_t, list)
/* various typedefs */
typedef struct snd_info_entry snd_info_entry_t;
typedef struct _snd_pcm snd_pcm_t;
typedef struct _snd_pcm_str snd_pcm_str_t;
typedef struct _snd_pcm_substream snd_pcm_substream_t;
typedef struct _snd_mixer snd_kmixer_t;
typedef struct _snd_rawmidi snd_rawmidi_t;
typedef struct _snd_ctl_file snd_ctl_file_t;
typedef struct _snd_kcontrol snd_kcontrol_t;
typedef struct _snd_timer snd_timer_t;
typedef struct _snd_timer_instance snd_timer_instance_t;
typedef struct _snd_hwdep snd_hwdep_t;
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
typedef struct _snd_oss_mixer snd_mixer_oss_t;
#endif
#define snd_device(n) list_entry(n, struct snd_device, list)
/* monitor files for graceful shutdown (hotplug) */
@ -129,7 +96,7 @@ struct snd_shutdown_f_ops; /* define it later in init.c */
/* main structure for soundcard */
struct _snd_card {
struct snd_card {
int number; /* number of soundcard (index to
snd_cards) */
@ -143,7 +110,7 @@ struct _snd_card {
struct module *module; /* top-level module */
void *private_data; /* private data for soundcard */
void (*private_free) (snd_card_t *card); /* callback for freeing of
void (*private_free) (struct snd_card *card); /* callback for freeing of
private data */
struct list_head devices; /* devices */
@ -155,8 +122,8 @@ struct _snd_card {
struct list_head controls; /* all controls for this card */
struct list_head ctl_files; /* active control files */
snd_info_entry_t *proc_root; /* root for soundcard specific files */
snd_info_entry_t *proc_id; /* the card id */
struct snd_info_entry *proc_root; /* root for soundcard specific files */
struct snd_info_entry *proc_id; /* the card id */
struct proc_dir_entry *proc_root_link; /* number link to real id */
struct snd_monitor_file *files; /* all files associated to this card */
@ -167,92 +134,64 @@ struct _snd_card {
wait_queue_head_t shutdown_sleep;
struct work_struct free_workq; /* for free in workqueue */
struct device *dev;
#ifdef CONFIG_SND_GENERIC_DRIVER
struct snd_generic_device *generic_dev;
#endif
#ifdef CONFIG_PM
int (*pm_suspend)(snd_card_t *card, pm_message_t state);
int (*pm_resume)(snd_card_t *card);
void *pm_private_data;
unsigned int power_state; /* power state */
struct semaphore power_lock; /* power lock */
wait_queue_head_t power_sleep;
#endif
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
snd_mixer_oss_t *mixer_oss;
struct snd_mixer_oss *mixer_oss;
int mixer_oss_change_count;
#endif
};
#ifdef CONFIG_PM
static inline void snd_power_lock(snd_card_t *card)
static inline void snd_power_lock(struct snd_card *card)
{
down(&card->power_lock);
}
static inline void snd_power_unlock(snd_card_t *card)
static inline void snd_power_unlock(struct snd_card *card)
{
up(&card->power_lock);
}
static inline unsigned int snd_power_get_state(snd_card_t *card)
static inline unsigned int snd_power_get_state(struct snd_card *card)
{
return card->power_state;
}
static inline void snd_power_change_state(snd_card_t *card, unsigned int state)
static inline void snd_power_change_state(struct snd_card *card, unsigned int state)
{
card->power_state = state;
wake_up(&card->power_sleep);
}
/* init.c */
int snd_power_wait(snd_card_t *card, unsigned int power_state, struct file *file);
int snd_card_set_pm_callback(snd_card_t *card,
int (*suspend)(snd_card_t *, pm_message_t),
int (*resume)(snd_card_t *),
void *private_data);
int snd_card_set_generic_pm_callback(snd_card_t *card,
int (*suspend)(snd_card_t *, pm_message_t),
int (*resume)(snd_card_t *),
void *private_data);
#define snd_card_set_isa_pm_callback(card,suspend,resume,data) \
snd_card_set_generic_pm_callback(card, suspend, resume, data)
struct pci_dev;
int snd_card_pci_suspend(struct pci_dev *dev, pm_message_t state);
int snd_card_pci_resume(struct pci_dev *dev);
#define SND_PCI_PM_CALLBACKS \
.suspend = snd_card_pci_suspend, .resume = snd_card_pci_resume
int snd_power_wait(struct snd_card *card, unsigned int power_state, struct file *file);
#else /* ! CONFIG_PM */
#define snd_power_lock(card) do { (void)(card); } while (0)
#define snd_power_unlock(card) do { (void)(card); } while (0)
static inline int snd_power_wait(snd_card_t *card, unsigned int state, struct file *file) { return 0; }
static inline int snd_power_wait(struct snd_card *card, unsigned int state, struct file *file) { return 0; }
#define snd_power_get_state(card) SNDRV_CTL_POWER_D0
#define snd_power_change_state(card, state) do { (void)(card); } while (0)
#define snd_card_set_pm_callback(card,suspend,resume,data)
#define snd_card_set_generic_pm_callback(card,suspend,resume,data)
#define snd_card_set_isa_pm_callback(card,suspend,resume,data)
#define SND_PCI_PM_CALLBACKS
#endif /* CONFIG_PM */
struct _snd_minor {
struct list_head list; /* list of all minors per card */
int number; /* minor number */
struct snd_minor {
int type; /* SNDRV_DEVICE_TYPE_XXX */
int card; /* card number */
int device; /* device number */
const char *comment; /* for /proc/asound/devices */
struct file_operations *f_ops; /* file operations */
void *private_data; /* private data for f_ops->open */
char name[0]; /* device name (keep at the end of
structure) */
};
typedef struct _snd_minor snd_minor_t;
/* sound.c */
extern int snd_major;
@ -260,12 +199,18 @@ extern int snd_ecards_limit;
void snd_request_card(int card);
int snd_register_device(int type, snd_card_t *card, int dev, snd_minor_t *reg, const char *name);
int snd_unregister_device(int type, snd_card_t *card, int dev);
int snd_register_device(int type, struct snd_card *card, int dev,
struct file_operations *f_ops, void *private_data,
const char *name);
int snd_unregister_device(int type, struct snd_card *card, int dev);
void *snd_lookup_minor_data(unsigned int minor, int type);
#ifdef CONFIG_SND_OSSEMUL
int snd_register_oss_device(int type, snd_card_t *card, int dev, snd_minor_t *reg, const char *name);
int snd_unregister_oss_device(int type, snd_card_t *card, int dev);
int snd_register_oss_device(int type, struct snd_card *card, int dev,
struct file_operations *f_ops, void *private_data,
const char *name);
int snd_unregister_oss_device(int type, struct snd_card *card, int dev);
void *snd_lookup_oss_minor_data(unsigned int minor, int type);
#endif
int snd_minor_info_init(void);
@ -276,11 +221,9 @@ int snd_minor_info_done(void);
#ifdef CONFIG_SND_OSSEMUL
int snd_minor_info_oss_init(void);
int snd_minor_info_oss_done(void);
int snd_oss_init_module(void);
#else
#define snd_minor_info_oss_init() /*NOP*/
#define snd_minor_info_oss_done() /*NOP*/
#define snd_oss_init_module() 0
#endif
/* memory.c */
@ -291,43 +234,41 @@ int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size
/* init.c */
extern unsigned int snd_cards_lock;
extern snd_card_t *snd_cards[SNDRV_CARDS];
extern struct snd_card *snd_cards[SNDRV_CARDS];
extern rwlock_t snd_card_rwlock;
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
#define SND_MIXER_OSS_NOTIFY_REGISTER 0
#define SND_MIXER_OSS_NOTIFY_DISCONNECT 1
#define SND_MIXER_OSS_NOTIFY_FREE 2
extern int (*snd_mixer_oss_notify_callback)(snd_card_t *card, int cmd);
extern int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int cmd);
#endif
snd_card_t *snd_card_new(int idx, const char *id,
struct snd_card *snd_card_new(int idx, const char *id,
struct module *module, int extra_size);
int snd_card_disconnect(snd_card_t *card);
int snd_card_free(snd_card_t *card);
int snd_card_free_in_thread(snd_card_t *card);
int snd_card_register(snd_card_t *card);
int snd_card_disconnect(struct snd_card *card);
int snd_card_free(struct snd_card *card);
int snd_card_free_in_thread(struct snd_card *card);
int snd_card_register(struct snd_card *card);
int snd_card_info_init(void);
int snd_card_info_done(void);
int snd_component_add(snd_card_t *card, const char *component);
int snd_card_file_add(snd_card_t *card, struct file *file);
int snd_card_file_remove(snd_card_t *card, struct file *file);
int snd_component_add(struct snd_card *card, const char *component);
int snd_card_file_add(struct snd_card *card, struct file *file);
int snd_card_file_remove(struct snd_card *card, struct file *file);
#ifndef snd_card_set_dev
#define snd_card_set_dev(card,devptr) ((card)->dev = (devptr))
#endif
/* register a generic device (for ISA, etc) */
int snd_card_set_generic_dev(snd_card_t *card);
/* device.c */
int snd_device_new(snd_card_t *card, snd_device_type_t type,
void *device_data, snd_device_ops_t *ops);
int snd_device_register(snd_card_t *card, void *device_data);
int snd_device_register_all(snd_card_t *card);
int snd_device_disconnect(snd_card_t *card, void *device_data);
int snd_device_disconnect_all(snd_card_t *card);
int snd_device_free(snd_card_t *card, void *device_data);
int snd_device_free_all(snd_card_t *card, snd_device_cmd_t cmd);
int snd_device_new(struct snd_card *card, snd_device_type_t type,
void *device_data, struct snd_device_ops *ops);
int snd_device_register(struct snd_card *card, void *device_data);
int snd_device_register_all(struct snd_card *card);
int snd_device_disconnect(struct snd_card *card, void *device_data);
int snd_device_disconnect_all(struct snd_card *card);
int snd_device_free(struct snd_card *card, void *device_data);
int snd_device_free_all(struct snd_card *card, snd_device_cmd_t cmd);
/* isadma.c */
@ -443,4 +384,6 @@ void snd_verbose_printd(const char *file, int line, const char *format, ...)
#endif
#endif
#include "typedefs.h"
#endif /* __SOUND_CORE_H */

View File

@ -26,21 +26,6 @@
#include "pcm.h"
#include "timer.h"
#ifdef CONFIG_SBUS
#define SBUS_SUPPORT
#include <asm/sbus.h>
#endif
#if defined(CONFIG_PCI) && defined(CONFIG_SPARC64)
#define EBUS_SUPPORT
#include <linux/pci.h>
#include <asm/ebus.h>
#endif
#if !defined(SBUS_SUPPORT) && !defined(EBUS_SUPPORT)
#define LEGACY_SUPPORT
#endif
/* IO ports */
#define CS4231P(x) (c_d_c_CS4231##x)
@ -232,18 +217,14 @@
#define CS4231_HWSHARE_DMA1 (1<<1)
#define CS4231_HWSHARE_DMA2 (1<<2)
typedef struct _snd_cs4231 cs4231_t;
struct _snd_cs4231 {
struct snd_cs4231 {
unsigned long port; /* base i/o port */
#ifdef LEGACY_SUPPORT
struct resource *res_port;
unsigned long cport; /* control base i/o port (CS4236) */
struct resource *res_cport;
int irq; /* IRQ line */
int dma1; /* playback DMA */
int dma2; /* record DMA */
#endif
unsigned short version; /* version of CODEC chip */
unsigned short mode; /* see to CS4231_MODE_XXXX */
unsigned short hardware; /* see to CS4231_HW_XXXX */
@ -251,29 +232,11 @@ struct _snd_cs4231 {
unsigned short single_dma:1, /* forced single DMA mode (GUS 16-bit daughter board) or dma1 == dma2 */
ebus_flag:1; /* SPARC: EBUS present */
#ifdef EBUS_SUPPORT
struct ebus_dma_info eb2c;
struct ebus_dma_info eb2p;
#endif
#if defined(SBUS_SUPPORT) || defined(EBUS_SUPPORT)
union {
#ifdef SBUS_SUPPORT
struct sbus_dev *sdev;
#endif
#ifdef EBUS_SUPPORT
struct pci_dev *pdev;
#endif
} dev_u;
unsigned int p_periods_sent;
unsigned int c_periods_sent;
#endif
snd_card_t *card;
snd_pcm_t *pcm;
snd_pcm_substream_t *playback_substream;
snd_pcm_substream_t *capture_substream;
snd_timer_t *timer;
struct snd_card *card;
struct snd_pcm *pcm;
struct snd_pcm_substream *playback_substream;
struct snd_pcm_substream *capture_substream;
struct snd_timer *timer;
unsigned char image[32]; /* registers image */
unsigned char eimage[32]; /* extended registers image */
@ -281,63 +244,59 @@ struct _snd_cs4231 {
int mce_bit;
int calibrate_mute;
int sw_3d_bit;
#ifdef LEGACY_SUPPORT
unsigned int p_dma_size;
unsigned int c_dma_size;
#endif
spinlock_t reg_lock;
struct semaphore mce_mutex;
struct semaphore open_mutex;
int (*rate_constraint) (snd_pcm_runtime_t *runtime);
void (*set_playback_format) (cs4231_t *chip, snd_pcm_hw_params_t *hw_params, unsigned char pdfr);
void (*set_capture_format) (cs4231_t *chip, snd_pcm_hw_params_t *hw_params, unsigned char cdfr);
void (*trigger) (cs4231_t *chip, unsigned int what, int start);
int (*rate_constraint) (struct snd_pcm_runtime *runtime);
void (*set_playback_format) (struct snd_cs4231 *chip, struct snd_pcm_hw_params *hw_params, unsigned char pdfr);
void (*set_capture_format) (struct snd_cs4231 *chip, struct snd_pcm_hw_params *hw_params, unsigned char cdfr);
void (*trigger) (struct snd_cs4231 *chip, unsigned int what, int start);
#ifdef CONFIG_PM
void (*suspend) (cs4231_t *chip);
void (*resume) (cs4231_t *chip);
void (*suspend) (struct snd_cs4231 *chip);
void (*resume) (struct snd_cs4231 *chip);
#endif
void *dma_private_data;
#ifdef LEGACY_SUPPORT
int (*claim_dma) (cs4231_t *chip, void *dma_private_data, int dma);
int (*release_dma) (cs4231_t *chip, void *dma_private_data, int dma);
#endif
int (*claim_dma) (struct snd_cs4231 *chip, void *dma_private_data, int dma);
int (*release_dma) (struct snd_cs4231 *chip, void *dma_private_data, int dma);
};
/* exported functions */
void snd_cs4231_out(cs4231_t *chip, unsigned char reg, unsigned char val);
unsigned char snd_cs4231_in(cs4231_t *chip, unsigned char reg);
void snd_cs4236_ext_out(cs4231_t *chip, unsigned char reg, unsigned char val);
unsigned char snd_cs4236_ext_in(cs4231_t *chip, unsigned char reg);
void snd_cs4231_mce_up(cs4231_t *chip);
void snd_cs4231_mce_down(cs4231_t *chip);
void snd_cs4231_out(struct snd_cs4231 *chip, unsigned char reg, unsigned char val);
unsigned char snd_cs4231_in(struct snd_cs4231 *chip, unsigned char reg);
void snd_cs4236_ext_out(struct snd_cs4231 *chip, unsigned char reg, unsigned char val);
unsigned char snd_cs4236_ext_in(struct snd_cs4231 *chip, unsigned char reg);
void snd_cs4231_mce_up(struct snd_cs4231 *chip);
void snd_cs4231_mce_down(struct snd_cs4231 *chip);
irqreturn_t snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs);
const char *snd_cs4231_chip_id(cs4231_t *chip);
const char *snd_cs4231_chip_id(struct snd_cs4231 *chip);
int snd_cs4231_create(snd_card_t * card,
int snd_cs4231_create(struct snd_card *card,
unsigned long port,
unsigned long cport,
int irq, int dma1, int dma2,
unsigned short hardware,
unsigned short hwshare,
cs4231_t ** rchip);
int snd_cs4231_pcm(cs4231_t * chip, int device, snd_pcm_t **rpcm);
int snd_cs4231_timer(cs4231_t * chip, int device, snd_timer_t **rtimer);
int snd_cs4231_mixer(cs4231_t * chip);
struct snd_cs4231 ** rchip);
int snd_cs4231_pcm(struct snd_cs4231 * chip, int device, struct snd_pcm **rpcm);
int snd_cs4231_timer(struct snd_cs4231 * chip, int device, struct snd_timer **rtimer);
int snd_cs4231_mixer(struct snd_cs4231 * chip);
int snd_cs4236_create(snd_card_t * card,
int snd_cs4236_create(struct snd_card *card,
unsigned long port,
unsigned long cport,
int irq, int dma1, int dma2,
unsigned short hardware,
unsigned short hwshare,
cs4231_t ** rchip);
int snd_cs4236_pcm(cs4231_t * chip, int device, snd_pcm_t **rpcm);
int snd_cs4236_mixer(cs4231_t * chip);
struct snd_cs4231 ** rchip);
int snd_cs4236_pcm(struct snd_cs4231 * chip, int device, struct snd_pcm **rpcm);
int snd_cs4236_mixer(struct snd_cs4231 * chip);
/*
* mixer library
@ -349,9 +308,9 @@ int snd_cs4236_mixer(cs4231_t * chip);
.get = snd_cs4231_get_single, .put = snd_cs4231_put_single, \
.private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
int snd_cs4231_info_single(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo);
int snd_cs4231_get_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
int snd_cs4231_put_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
int snd_cs4231_info_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo);
int snd_cs4231_get_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
int snd_cs4231_put_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
#define CS4231_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
@ -359,8 +318,8 @@ int snd_cs4231_put_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucon
.get = snd_cs4231_get_double, .put = snd_cs4231_put_double, \
.private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
int snd_cs4231_info_double(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo);
int snd_cs4231_get_double(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
int snd_cs4231_put_double(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
int snd_cs4231_info_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo);
int snd_cs4231_get_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
int snd_cs4231_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
#endif /* __SOUND_CS4231_H */

View File

@ -1631,42 +1631,41 @@
#define CS46XX_MIXER_SPDIF_INPUT_ELEMENT 1
#define CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT 2
typedef struct _snd_cs46xx cs46xx_t;
typedef struct _snd_cs46xx_pcm_t {
struct snd_cs46xx_pcm {
struct snd_dma_buffer hw_buf;
unsigned int ctl;
unsigned int shift; /* Shift count to trasform frames in bytes */
snd_pcm_indirect_t pcm_rec;
snd_pcm_substream_t *substream;
struct snd_pcm_indirect pcm_rec;
struct snd_pcm_substream *substream;
pcm_channel_descriptor_t * pcm_channel;
struct dsp_pcm_channel_descriptor * pcm_channel;
int pcm_channel_id; /* Fron Rear, Center Lfe ... */
} cs46xx_pcm_t;
};
typedef struct {
struct snd_cs46xx_region {
char name[24];
unsigned long base;
void __iomem *remap_addr;
unsigned long size;
struct resource *resource;
} snd_cs46xx_region_t;
};
struct _snd_cs46xx {
struct snd_cs46xx {
int irq;
unsigned long ba0_addr;
unsigned long ba1_addr;
union {
struct {
snd_cs46xx_region_t ba0;
snd_cs46xx_region_t data0;
snd_cs46xx_region_t data1;
snd_cs46xx_region_t pmem;
snd_cs46xx_region_t reg;
struct snd_cs46xx_region ba0;
struct snd_cs46xx_region data0;
struct snd_cs46xx_region data1;
struct snd_cs46xx_region pmem;
struct snd_cs46xx_region reg;
} name;
snd_cs46xx_region_t idx[5];
struct snd_cs46xx_region idx[5];
} region;
unsigned int mode;
@ -1676,34 +1675,34 @@ struct _snd_cs46xx {
unsigned int ctl;
unsigned int shift; /* Shift count to trasform frames in bytes */
snd_pcm_indirect_t pcm_rec;
snd_pcm_substream_t *substream;
struct snd_pcm_indirect pcm_rec;
struct snd_pcm_substream *substream;
} capt;
int nr_ac97_codecs;
ac97_bus_t *ac97_bus;
ac97_t *ac97[MAX_NR_AC97];
struct snd_ac97_bus *ac97_bus;
struct snd_ac97 *ac97[MAX_NR_AC97];
struct pci_dev *pci;
snd_card_t *card;
snd_pcm_t *pcm;
struct snd_card *card;
struct snd_pcm *pcm;
snd_rawmidi_t *rmidi;
snd_rawmidi_substream_t *midi_input;
snd_rawmidi_substream_t *midi_output;
struct snd_rawmidi *rmidi;
struct snd_rawmidi_substream *midi_input;
struct snd_rawmidi_substream *midi_output;
spinlock_t reg_lock;
unsigned int midcr;
unsigned int uartm;
int amplifier;
void (*amplifier_ctrl)(cs46xx_t *, int);
void (*active_ctrl)(cs46xx_t *, int);
void (*mixer_init)(cs46xx_t *);
void (*amplifier_ctrl)(struct snd_cs46xx *, int);
void (*active_ctrl)(struct snd_cs46xx *, int);
void (*mixer_init)(struct snd_cs46xx *);
int acpi_port;
snd_kcontrol_t *eapd_switch; /* for amplifier hack */
struct snd_kcontrol *eapd_switch; /* for amplifier hack */
int accept_valid; /* accept mmap valid (for OSS) */
struct gameport *gameport;
@ -1714,29 +1713,31 @@ struct _snd_cs46xx {
#ifdef CONFIG_SND_CS46XX_NEW_DSP
struct semaphore spos_mutex;
dsp_spos_instance_t * dsp_spos_instance;
struct dsp_spos_instance * dsp_spos_instance;
snd_pcm_t *pcm_rear;
snd_pcm_t *pcm_center_lfe;
snd_pcm_t *pcm_iec958;
struct snd_pcm *pcm_rear;
struct snd_pcm *pcm_center_lfe;
struct snd_pcm *pcm_iec958;
#else /* for compatibility */
cs46xx_pcm_t *playback_pcm;
struct snd_cs46xx_pcm *playback_pcm;
unsigned int play_ctl;
#endif
};
int snd_cs46xx_create(snd_card_t *card,
int snd_cs46xx_create(struct snd_card *card,
struct pci_dev *pci,
int external_amp, int thinkpad,
cs46xx_t **rcodec);
struct snd_cs46xx **rcodec);
int snd_cs46xx_suspend(struct pci_dev *pci, pm_message_t state);
int snd_cs46xx_resume(struct pci_dev *pci);
int snd_cs46xx_pcm(cs46xx_t *chip, int device, snd_pcm_t **rpcm);
int snd_cs46xx_pcm_rear(cs46xx_t *chip, int device, snd_pcm_t **rpcm);
int snd_cs46xx_pcm_iec958(cs46xx_t *chip, int device, snd_pcm_t **rpcm);
int snd_cs46xx_pcm_center_lfe(cs46xx_t *chip, int device, snd_pcm_t **rpcm);
int snd_cs46xx_mixer(cs46xx_t *chip, int spdif_device);
int snd_cs46xx_midi(cs46xx_t *chip, int device, snd_rawmidi_t **rmidi);
int snd_cs46xx_start_dsp(cs46xx_t *chip);
int snd_cs46xx_gameport(cs46xx_t *chip);
int snd_cs46xx_pcm(struct snd_cs46xx *chip, int device, struct snd_pcm **rpcm);
int snd_cs46xx_pcm_rear(struct snd_cs46xx *chip, int device, struct snd_pcm **rpcm);
int snd_cs46xx_pcm_iec958(struct snd_cs46xx *chip, int device, struct snd_pcm **rpcm);
int snd_cs46xx_pcm_center_lfe(struct snd_cs46xx *chip, int device, struct snd_pcm **rpcm);
int snd_cs46xx_mixer(struct snd_cs46xx *chip, int spdif_device);
int snd_cs46xx_midi(struct snd_cs46xx *chip, int device, struct snd_rawmidi **rmidi);
int snd_cs46xx_start_dsp(struct snd_cs46xx *chip);
int snd_cs46xx_gameport(struct snd_cs46xx *chip);
#endif /* __SOUND_CS46XX_H */

View File

@ -41,7 +41,7 @@
/* This structs are used internally by the SP */
typedef struct _basic_dma_req_t {
struct dsp_basic_dma_req {
/* DMA Requestor Word 0 (DCW) fields:
31 [30-28]27 [26:24] 23 22 21 20 [19:18] [17:16] 15 14 13 12 11 10 9 8 7 6 [5:0]
@ -53,9 +53,9 @@ typedef struct _basic_dma_req_t {
u32 dmw; /* DMA Mode Word */
u32 saw; /* Source Address Word */
u32 daw; /* Destination Address Word */
} basic_dma_req_t;
};
typedef struct _scatter_gather_ext_t {
struct dsp_scatter_gather_ext {
u32 npaw; /* Next-Page Address Word */
/* DMA Requestor Word 5 (NPCW) fields:
@ -69,9 +69,9 @@ typedef struct _scatter_gather_ext_t {
u32 lbaw; /* Loop-Begin Address Word */
u32 nplbaw; /* Next-Page after Loop-Begin Address Word */
u32 sgaw; /* Scatter/Gather Address Word */
} scatter_gather_ext_t;
};
typedef struct _volume_control_t {
struct dsp_volume_control {
___DSP_DUAL_16BIT_ALLOC(
rightTarg, /* Target volume for left & right channels */
leftTarg
@ -80,10 +80,10 @@ typedef struct _volume_control_t {
rightVol, /* Current left & right channel volumes */
leftVol
)
} volume_control_t;
};
/* Generic stream control block (SCB) structure definition */
typedef struct _generic_scb_t {
struct dsp_generic_scb {
/* For streaming I/O, the DSP should never alter any words in the DMA
requestor or the scatter/gather extension. Only ad hoc DMA request
streams are free to alter the requestor (currently only occur in the
@ -99,13 +99,13 @@ typedef struct _generic_scb_t {
/* Initialized by the host, only modified by DMA
R/O for the DSP task */
basic_dma_req_t basic_req; /* Optional */
struct dsp_basic_dma_req basic_req; /* Optional */
/* Scatter/gather DMA requestor extension (5 ints)
Initialized by the host, only modified by DMA
DSP task never needs to even read these.
*/
scatter_gather_ext_t sg_ext; /* Optional */
struct dsp_scatter_gather_ext sg_ext; /* Optional */
/* Sublist pointer & next stream control block (SCB) link.
Initialized & modified by the host R/O for the DSP task
@ -179,11 +179,11 @@ typedef struct _generic_scb_t {
These two 32-bit words are redefined for wavetable & 3-D voices.
*/
volume_control_t vol_ctrl_t; /* Optional */
} generic_scb_t;
struct dsp_volume_control vol_ctrl_t; /* Optional */
};
typedef struct _spos_control_block_t {
struct dsp_spos_control_block {
/* WARNING: Certain items in this structure are modified by the host
Any dword that can be modified by the host, must not be
modified by the SP as the host can only do atomic dword
@ -273,10 +273,10 @@ typedef struct _spos_control_block_t {
u32 r32_save_for_spurious_int;
u32 r32_save_for_trap;
u32 r32_save_for_HFG;
} spos_control_block_t;
};
/* SPB for MIX_TO_OSTREAM algorithm family */
typedef struct _mix2_ostream_spb_t
struct dsp_mix2_ostream_spb
{
/* 16b.16b integer.frac approximation to the
number of 3 sample triplets to output each
@ -290,13 +290,13 @@ typedef struct _mix2_ostream_spb_t
output triplets since the start of group
*/
u32 accumOutTriplets;
} mix2_ostream_spb_t;
};
/* SCB for Timing master algorithm */
typedef struct _timing_master_scb_t {
struct dsp_timing_master_scb {
/* First 12 dwords from generic_scb_t */
basic_dma_req_t basic_req; /* Optional */
scatter_gather_ext_t sg_ext; /* Optional */
struct dsp_basic_dma_req basic_req; /* Optional */
struct dsp_scatter_gather_ext sg_ext; /* Optional */
___DSP_DUAL_16BIT_ALLOC(
next_scb, /* REQUIRED */
sub_list_ptr /* REQUIRED */
@ -358,13 +358,13 @@ typedef struct _timing_master_scb_t {
number of samples to output each frame.
(approximation must be floor, to insure */
u32 nsamp_per_frm_q15;
} timing_master_scb_t;
};
/* SCB for CODEC output algorithm */
typedef struct _codec_output_scb_t {
struct dsp_codec_output_scb {
/* First 13 dwords from generic_scb_t */
basic_dma_req_t basic_req; /* Optional */
scatter_gather_ext_t sg_ext; /* Optional */
struct dsp_basic_dma_req basic_req; /* Optional */
struct dsp_scatter_gather_ext sg_ext; /* Optional */
___DSP_DUAL_16BIT_ALLOC(
next_scb, /* REQUIRED */
sub_list_ptr /* REQUIRED */
@ -422,13 +422,13 @@ typedef struct _codec_output_scb_t {
reserved,
last_sub_ptr
)
} codec_output_scb_t;
};
/* SCB for CODEC input algorithm */
typedef struct _codec_input_scb_t {
struct dsp_codec_input_scb {
/* First 13 dwords from generic_scb_t */
basic_dma_req_t basic_req; /* Optional */
scatter_gather_ext_t sg_ext; /* Optional */
struct dsp_basic_dma_req basic_req; /* Optional */
struct dsp_scatter_gather_ext sg_ext; /* Optional */
___DSP_DUAL_16BIT_ALLOC(
next_scb, /* REQUIRED */
sub_list_ptr /* REQUIRED */
@ -479,13 +479,13 @@ typedef struct _codec_input_scb_t {
)
u32 reserved2;
} codec_input_scb_t;
};
typedef struct _pcm_serial_input_scb_t {
struct dsp_pcm_serial_input_scb {
/* First 13 dwords from generic_scb_t */
basic_dma_req_t basic_req; /* Optional */
scatter_gather_ext_t sg_ext; /* Optional */
struct dsp_basic_dma_req basic_req; /* Optional */
struct dsp_scatter_gather_ext sg_ext; /* Optional */
___DSP_DUAL_16BIT_ALLOC(
next_scb, /* REQUIRED */
sub_list_ptr /* REQUIRED */
@ -512,11 +512,11 @@ typedef struct _pcm_serial_input_scb_t {
)
/* Initialized by the host (host updates target volumes) */
volume_control_t psi_vol_ctrl;
struct dsp_volume_control psi_vol_ctrl;
} pcm_serial_input_scb_t;
};
typedef struct _src_task_scb_t {
struct dsp_src_task_scb {
___DSP_DUAL_16BIT_ALLOC(
frames_left_in_gof,
gofs_left_in_sec
@ -571,10 +571,10 @@ typedef struct _src_task_scb_t {
u32 phiIncr6int_26frac;
volume_control_t src_vol_ctrl;
} src_task_scb_t;
struct dsp_volume_control src_vol_ctrl;
};
typedef struct _decimate_by_pow2_scb_t {
struct dsp_decimate_by_pow2_scb {
/* decimationFactor = 2, 4, or 8 (larger factors waste too much memory
when compared to cascading decimators)
*/
@ -648,10 +648,10 @@ typedef struct _decimate_by_pow2_scb_t {
u32 dec2_reserved4;
volume_control_t dec2_vol_ctrl; /* Not used! */
} decimate_by_pow2_scb_t;
struct dsp_volume_control dec2_vol_ctrl; /* Not used! */
};
typedef struct _vari_decimate_scb_t {
struct dsp_vari_decimate_scb {
___DSP_DUAL_16BIT_ALLOC(
vdec_frames_left_in_gof,
vdec_gofs_left_in_sec
@ -711,15 +711,15 @@ typedef struct _vari_decimate_scb_t {
u32 vdec_phi_incr_6int_26frac;
volume_control_t vdec_vol_ctrl;
} vari_decimate_scb_t;
struct dsp_volume_control vdec_vol_ctrl;
};
/* SCB for MIX_TO_OSTREAM algorithm family */
typedef struct _mix2_ostream_scb_t {
struct dsp_mix2_ostream_scb {
/* First 13 dwords from generic_scb_t */
basic_dma_req_t basic_req; /* Optional */
scatter_gather_ext_t sg_ext; /* Optional */
struct dsp_basic_dma_req basic_req; /* Optional */
struct dsp_scatter_gather_ext sg_ext; /* Optional */
___DSP_DUAL_16BIT_ALLOC(
next_scb, /* REQUIRED */
sub_list_ptr /* REQUIRED */
@ -758,14 +758,14 @@ typedef struct _mix2_ostream_scb_t {
const_FFFF,
const_zero
)
} mix2_ostream_scb_t;
};
/* SCB for S16_MIX algorithm */
typedef struct _mix_only_scb_t {
struct dsp_mix_only_scb {
/* First 13 dwords from generic_scb_t */
basic_dma_req_t basic_req; /* Optional */
scatter_gather_ext_t sg_ext; /* Optional */
struct dsp_basic_dma_req basic_req; /* Optional */
struct dsp_scatter_gather_ext sg_ext; /* Optional */
___DSP_DUAL_16BIT_ALLOC(
next_scb, /* REQUIRED */
sub_list_ptr /* REQUIRED */
@ -780,11 +780,11 @@ typedef struct _mix_only_scb_t {
u32 strm_buf_ptr; /* REQUIRED */
u32 reserved;
volume_control_t vol_ctrl;
} mix_only_scb_t;
struct dsp_volume_control vol_ctrl;
};
/* SCB for the async. CODEC input algorithm */
typedef struct _async_codec_input_scb_t {
struct dsp_async_codec_input_scb {
u32 io_free2;
u32 io_current_total;
@ -837,11 +837,11 @@ typedef struct _async_codec_input_scb_t {
)
u32 i_free;
} async_codec_input_scb_t;
};
/* SCB for the SP/DIF CODEC input and output */
typedef struct _spdifiscb_t {
struct dsp_spdifiscb {
___DSP_DUAL_16BIT_ALLOC(
status_ptr,
status_start_ptr
@ -895,12 +895,11 @@ typedef struct _spdifiscb_t {
)
u32 free1;
} spdifiscb_t;
};
/* SCB for the SP/DIF CODEC input and output */
typedef struct _spdifoscb_t {
struct dsp_spdifoscb {
u32 free2;
@ -941,11 +940,10 @@ typedef struct _spdifoscb_t {
)
u32 free1;
} spdifoscb_t;
};
typedef struct _asynch_fg_rx_scb_t {
struct dsp_asynch_fg_rx_scb {
___DSP_DUAL_16BIT_ALLOC(
bot_buf_mask,
buf_Mask
@ -993,11 +991,10 @@ typedef struct _asynch_fg_rx_scb_t {
right_vol,
left_vol
)
} asynch_fg_rx_scb_t;
};
typedef struct _asynch_fg_tx_scb_t {
struct dsp_asynch_fg_tx_scb {
___DSP_DUAL_16BIT_ALLOC(
not_buf_mask,
buf_mask
@ -1052,13 +1049,13 @@ typedef struct _asynch_fg_tx_scb_t {
unused_right_vol,
unused_left_vol
)
} asynch_fg_tx_scb_t;
};
typedef struct _output_snoop_scb_t {
struct dsp_output_snoop_scb {
/* First 13 dwords from generic_scb_t */
basic_dma_req_t basic_req; /* Optional */
scatter_gather_ext_t sg_ext; /* Optional */
struct dsp_basic_dma_req basic_req; /* Optional */
struct dsp_scatter_gather_ext sg_ext; /* Optional */
___DSP_DUAL_16BIT_ALLOC(
next_scb, /* REQUIRED */
sub_list_ptr /* REQUIRED */
@ -1083,9 +1080,9 @@ typedef struct _output_snoop_scb_t {
reserved,
input_scb
)
} output_snoop_scb_t;
};
typedef struct _spio_write_scb_t {
struct dsp_spio_write_scb {
___DSP_DUAL_16BIT_ALLOC(
address1,
address2
@ -1122,9 +1119,9 @@ typedef struct _spio_write_scb_t {
)
u32 unused3[5];
} spio_write_scb_t;
};
typedef struct _magic_snoop_task_t {
struct dsp_magic_snoop_task {
u32 i0;
u32 i1;
@ -1155,11 +1152,11 @@ typedef struct _magic_snoop_task_t {
u32 i8;
volume_control_t vdec_vol_ctrl;
} magic_snoop_task_t;
struct dsp_volume_control vdec_vol_ctrl;
};
typedef struct _filter_scb_t {
struct dsp_filter_scb {
___DSP_DUAL_16BIT_ALLOC(
a0_right, /* 0x00 */
a0_left
@ -1212,5 +1209,5 @@ typedef struct _filter_scb_t {
b2_right, /* 0x0F */
b2_left
)
} filter_scb_t;
};
#endif /* __DSP_SCB_TYPES_H__ */

View File

@ -65,133 +65,130 @@
#define DSP_SPDIF_STATUS_HW_ENABLED 4
#define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED 8
struct _dsp_module_desc_t;
typedef struct _symbol_entry_t {
struct dsp_symbol_entry {
u32 address;
char symbol_name[DSP_MAX_SYMBOL_NAME];
int symbol_type;
/* initialized by driver */
struct _dsp_module_desc_t * module;
struct dsp_module_desc * module;
int deleted;
} symbol_entry_t;
};
typedef struct _symbol_desc_t {
struct dsp_symbol_desc {
int nsymbols;
symbol_entry_t * symbols;
struct dsp_symbol_entry *symbols;
/* initialized by driver */
int highest_frag_index;
} symbol_desc_t;
};
typedef struct _segment_desc_t {
struct dsp_segment_desc {
int segment_type;
u32 offset;
u32 size;
u32 * data;
} segment_desc_t;
};
typedef struct _dsp_module_desc_t {
struct dsp_module_desc {
char * module_name;
symbol_desc_t symbol_table;
struct dsp_symbol_desc symbol_table;
int nsegments;
segment_desc_t * segments;
struct dsp_segment_desc * segments;
/* initialized by driver */
u32 overlay_begin_address;
u32 load_address;
int nfixups;
} dsp_module_desc_t;
};
typedef struct _dsp_scb_descriptor_t {
struct dsp_scb_descriptor {
char scb_name[DSP_MAX_SCB_NAME];
u32 address;
int index;
struct _dsp_scb_descriptor_t * sub_list_ptr;
struct _dsp_scb_descriptor_t * next_scb_ptr;
struct _dsp_scb_descriptor_t * parent_scb_ptr;
struct dsp_scb_descriptor * sub_list_ptr;
struct dsp_scb_descriptor * next_scb_ptr;
struct dsp_scb_descriptor * parent_scb_ptr;
symbol_entry_t * task_entry;
symbol_entry_t * scb_symbol;
struct dsp_symbol_entry * task_entry;
struct dsp_symbol_entry * scb_symbol;
snd_info_entry_t *proc_info;
struct snd_info_entry *proc_info;
int ref_count;
spinlock_t lock;
int deleted;
} dsp_scb_descriptor_t;
};
typedef struct _dsp_task_descriptor_t {
struct dsp_task_descriptor {
char task_name[DSP_MAX_TASK_NAME];
int size;
u32 address;
int index;
} dsp_task_descriptor_t;
};
typedef struct _pcm_channel_descriptor_t {
struct dsp_pcm_channel_descriptor {
int active;
int src_slot;
int pcm_slot;
u32 sample_rate;
u32 unlinked;
dsp_scb_descriptor_t * pcm_reader_scb;
dsp_scb_descriptor_t * src_scb;
dsp_scb_descriptor_t * mixer_scb;
struct dsp_scb_descriptor * pcm_reader_scb;
struct dsp_scb_descriptor * src_scb;
struct dsp_scb_descriptor * mixer_scb;
void * private_data;
} pcm_channel_descriptor_t;
};
typedef struct _dsp_spos_instance_t {
symbol_desc_t symbol_table; /* currently availble loaded symbols in SP */
struct dsp_spos_instance {
struct dsp_symbol_desc symbol_table; /* currently availble loaded symbols in SP */
int nmodules;
dsp_module_desc_t * modules; /* modules loaded into SP */
struct dsp_module_desc * modules; /* modules loaded into SP */
segment_desc_t code;
struct dsp_segment_desc code;
/* Main PCM playback mixer */
dsp_scb_descriptor_t * master_mix_scb;
struct dsp_scb_descriptor * master_mix_scb;
u16 dac_volume_right;
u16 dac_volume_left;
/* Rear/surround PCM playback mixer */
dsp_scb_descriptor_t * rear_mix_scb;
struct dsp_scb_descriptor * rear_mix_scb;
/* Center/LFE mixer */
dsp_scb_descriptor_t * center_lfe_mix_scb;
struct dsp_scb_descriptor * center_lfe_mix_scb;
int npcm_channels;
int nsrc_scb;
pcm_channel_descriptor_t pcm_channels[DSP_MAX_PCM_CHANNELS];
struct dsp_pcm_channel_descriptor pcm_channels[DSP_MAX_PCM_CHANNELS];
int src_scb_slots[DSP_MAX_SRC_NR];
/* cache this symbols */
symbol_entry_t * null_algorithm; /* used by PCMreaderSCB's */
symbol_entry_t * s16_up; /* used by SRCtaskSCB's */
struct dsp_symbol_entry * null_algorithm; /* used by PCMreaderSCB's */
struct dsp_symbol_entry * s16_up; /* used by SRCtaskSCB's */
/* proc fs */
snd_card_t * snd_card;
snd_info_entry_t * proc_dsp_dir;
snd_info_entry_t * proc_sym_info_entry;
snd_info_entry_t * proc_modules_info_entry;
snd_info_entry_t * proc_parameter_dump_info_entry;
snd_info_entry_t * proc_sample_dump_info_entry;
struct snd_card *snd_card;
struct snd_info_entry * proc_dsp_dir;
struct snd_info_entry * proc_sym_info_entry;
struct snd_info_entry * proc_modules_info_entry;
struct snd_info_entry * proc_parameter_dump_info_entry;
struct snd_info_entry * proc_sample_dump_info_entry;
/* SCB's descriptors */
int nscb;
int scb_highest_frag_index;
dsp_scb_descriptor_t scbs[DSP_MAX_SCB_DESC];
snd_info_entry_t * proc_scb_info_entry;
dsp_scb_descriptor_t * the_null_scb;
struct dsp_scb_descriptor scbs[DSP_MAX_SCB_DESC];
struct snd_info_entry * proc_scb_info_entry;
struct dsp_scb_descriptor * the_null_scb;
/* Task's descriptors */
int ntask;
dsp_task_descriptor_t tasks[DSP_MAX_TASK_DESC];
snd_info_entry_t * proc_task_info_entry;
struct dsp_task_descriptor tasks[DSP_MAX_TASK_DESC];
struct snd_info_entry * proc_task_info_entry;
/* SPDIF status */
int spdif_status_out;
@ -204,30 +201,30 @@ typedef struct _dsp_spos_instance_t {
unsigned int spdif_csuv_stream;
/* SPDIF input sample rate converter */
dsp_scb_descriptor_t * spdif_in_src;
struct dsp_scb_descriptor * spdif_in_src;
/* SPDIF input asynch. receiver */
dsp_scb_descriptor_t * asynch_rx_scb;
struct dsp_scb_descriptor * asynch_rx_scb;
/* Capture record mixer SCB */
dsp_scb_descriptor_t * record_mixer_scb;
struct dsp_scb_descriptor * record_mixer_scb;
/* CODEC input SCB */
dsp_scb_descriptor_t * codec_in_scb;
struct dsp_scb_descriptor * codec_in_scb;
/* reference snooper */
dsp_scb_descriptor_t * ref_snoop_scb;
struct dsp_scb_descriptor * ref_snoop_scb;
/* SPDIF output PCM reference */
dsp_scb_descriptor_t * spdif_pcm_input_scb;
struct dsp_scb_descriptor * spdif_pcm_input_scb;
/* asynch TX task */
dsp_scb_descriptor_t * asynch_tx_scb;
struct dsp_scb_descriptor * asynch_tx_scb;
/* record sources */
dsp_scb_descriptor_t * pcm_input;
dsp_scb_descriptor_t * adc_input;
struct dsp_scb_descriptor * pcm_input;
struct dsp_scb_descriptor * adc_input;
int spdif_in_sample_rate;
} dsp_spos_instance_t;
};
#endif /* __DSP_SPOS_H__ */

View File

@ -71,7 +71,7 @@ Ptr____Call (c)
at the end of BG */
/* Minimal context save area for Hyper Forground */
typedef struct _hf_save_area_t {
struct dsp_hf_save_area {
u32 r10_save;
u32 r54_save;
u32 r98_save;
@ -96,11 +96,11 @@ typedef struct _hf_save_area_t {
rsa2Save
)
/* saved as part of HFG context */
} hf_save_area_t;
};
/* Task link data structure */
typedef struct _tree_link_t {
struct dsp_tree_link {
___DSP_DUAL_16BIT_ALLOC(
/* Pointer to sibling task control block */
next_scb,
@ -114,10 +114,10 @@ typedef struct _tree_link_t {
/* Pointer to local data */
this_spb
)
} tree_link_t;
};
typedef struct _task_tree_data_t {
struct dsp_task_tree_data {
___DSP_DUAL_16BIT_ALLOC(
/* Initial tock count; controls task tree execution rate */
tock_count_limit,
@ -155,11 +155,10 @@ typedef struct _task_tree_data_t {
data_stack_base_ptr
)
} task_tree_data_t;
};
typedef struct _interval_timer_data_t
struct dsp_interval_timer_data
{
/* These data items have the same relative locations to those */
___DSP_DUAL_16BIT_ALLOC(
@ -172,12 +171,12 @@ typedef struct _interval_timer_data_t
num_FG_ticks_this_interval,
num_intervals
)
} interval_timer_data_t;
};
/* This structure contains extra storage for the task tree
Currently, this additional data is related only to a full context save */
typedef struct _task_tree_context_block_t {
struct dsp_task_tree_context_block {
/* Up to 10 values are saved onto the stack. 8 for the task tree, 1 for
The access to the context switch (call or interrupt), and 1 spare that
users should never use. This last may be required by the system */
@ -238,16 +237,16 @@ typedef struct _task_tree_context_block_t {
u32 saveaux2xaux3x;
u32 savershouthl;
u32 savershoutxmacmode;
} task_tree_context_block_t;
};
typedef struct _task_tree_control_block_t {
hf_save_area_t context;
tree_link_t links;
task_tree_data_t data;
task_tree_context_block_t context_blk;
interval_timer_data_t int_timer;
} task_tree_control_block_t;
struct dsp_task_tree_control_block {
struct dsp_hf_save_area context;
struct dsp_tree_link links;
struct dsp_task_tree_data data;
struct dsp_task_tree_context_block context_blk;
struct dsp_interval_timer_data int_timer;
};
#endif /* __DSP_TASK_TYPES_H__ */

View File

@ -36,7 +36,7 @@
#endif
SND_CS8403_DECL void SND_CS8403_DECODE(snd_aes_iec958_t *diga, unsigned char bits)
SND_CS8403_DECL void SND_CS8403_DECODE(struct snd_aes_iec958 *diga, unsigned char bits)
{
if (bits & 0x01) { /* consumer */
if (!(bits & 0x02))
@ -79,7 +79,7 @@ SND_CS8403_DECL void SND_CS8403_DECODE(snd_aes_iec958_t *diga, unsigned char bit
}
}
SND_CS8403_DECL unsigned char SND_CS8403_ENCODE(snd_aes_iec958_t *diga)
SND_CS8403_DECL unsigned char SND_CS8403_ENCODE(struct snd_aes_iec958 *diga)
{
unsigned char bits;
@ -166,7 +166,7 @@ SND_CS8403_DECL unsigned char SND_CS8403_ENCODE(snd_aes_iec958_t *diga)
#endif
SND_CS8404_DECL void SND_CS8404_DECODE(snd_aes_iec958_t *diga, unsigned char bits)
SND_CS8404_DECL void SND_CS8404_DECODE(struct snd_aes_iec958 *diga, unsigned char bits)
{
if (bits & 0x10) { /* consumer */
if (!(bits & 0x20))
@ -205,7 +205,7 @@ SND_CS8404_DECL void SND_CS8404_DECODE(snd_aes_iec958_t *diga, unsigned char bit
}
}
SND_CS8404_DECL unsigned char SND_CS8404_ENCODE(snd_aes_iec958_t *diga)
SND_CS8404_DECL unsigned char SND_CS8404_ENCODE(struct snd_aes_iec958 *diga)
{
unsigned char bits;

View File

@ -186,11 +186,16 @@
#define CS8427_VERSHIFT 0
#define CS8427_VER8427A 0x71
int snd_cs8427_create(snd_i2c_bus_t *bus, unsigned char addr,
unsigned int reset_timeout, snd_i2c_device_t **r_cs8427);
int snd_cs8427_reg_write(snd_i2c_device_t *device, unsigned char reg, unsigned char val);
int snd_cs8427_iec958_build(snd_i2c_device_t *cs8427, snd_pcm_substream_t *playback_substream, snd_pcm_substream_t *capture_substream);
int snd_cs8427_iec958_active(snd_i2c_device_t *cs8427, int active);
int snd_cs8427_iec958_pcm(snd_i2c_device_t *cs8427, unsigned int rate);
struct snd_pcm_substream;
int snd_cs8427_create(struct snd_i2c_bus *bus, unsigned char addr,
unsigned int reset_timeout, struct snd_i2c_device **r_cs8427);
int snd_cs8427_reg_write(struct snd_i2c_device *device, unsigned char reg,
unsigned char val);
int snd_cs8427_iec958_build(struct snd_i2c_device *cs8427,
struct snd_pcm_substream *playback_substream,
struct snd_pcm_substream *capture_substream);
int snd_cs8427_iec958_active(struct snd_i2c_device *cs8427, int active);
int snd_cs8427_iec958_pcm(struct snd_i2c_device *cs8427, unsigned int rate);
#endif /* __SOUND_CS8427_H */

View File

@ -28,7 +28,12 @@
#include <linux/config.h>
#define SNDRV_CARDS 8 /* number of supported soundcards - don't change - minor numbers */
/* number of supported soundcards */
#ifdef CONFIG_SND_DYNAMIC_MINORS
#define SNDRV_CARDS 32
#else
#define SNDRV_CARDS 8 /* don't change - minor numbers */
#endif
#ifndef CONFIG_SND_MAJOR /* standard configuration */
#define CONFIG_SND_MAJOR 116

View File

@ -887,47 +887,45 @@
/* ------------------- STRUCTURES -------------------- */
typedef struct _snd_emu10k1 emu10k1_t;
typedef struct _snd_emu10k1_voice emu10k1_voice_t;
typedef struct _snd_emu10k1_pcm emu10k1_pcm_t;
typedef enum {
enum {
EMU10K1_EFX,
EMU10K1_PCM,
EMU10K1_SYNTH,
EMU10K1_MIDI
} emu10k1_voice_type_t;
};
struct _snd_emu10k1_voice {
emu10k1_t *emu;
struct snd_emu10k1;
struct snd_emu10k1_voice {
struct snd_emu10k1 *emu;
int number;
unsigned int use: 1,
pcm: 1,
efx: 1,
synth: 1,
midi: 1;
void (*interrupt)(emu10k1_t *emu, emu10k1_voice_t *pvoice);
void (*interrupt)(struct snd_emu10k1 *emu, struct snd_emu10k1_voice *pvoice);
emu10k1_pcm_t *epcm;
struct snd_emu10k1_pcm *epcm;
};
typedef enum {
enum {
PLAYBACK_EMUVOICE,
PLAYBACK_EFX,
CAPTURE_AC97ADC,
CAPTURE_AC97MIC,
CAPTURE_EFX
} snd_emu10k1_pcm_type_t;
};
struct _snd_emu10k1_pcm {
emu10k1_t *emu;
snd_emu10k1_pcm_type_t type;
snd_pcm_substream_t *substream;
emu10k1_voice_t *voices[NUM_EFX_PLAYBACK];
emu10k1_voice_t *extra;
struct snd_emu10k1_pcm {
struct snd_emu10k1 *emu;
int type;
struct snd_pcm_substream *substream;
struct snd_emu10k1_voice *voices[NUM_EFX_PLAYBACK];
struct snd_emu10k1_voice *extra;
unsigned short running;
unsigned short first_ptr;
snd_util_memblk_t *memblk;
struct snd_util_memblk *memblk;
unsigned int start_addr;
unsigned int ccca_start_addr;
unsigned int capture_ipr; /* interrupt acknowledge mask */
@ -941,13 +939,13 @@ struct _snd_emu10k1_pcm {
unsigned int capture_bufsize; /* buffer size in bytes */
};
typedef struct {
struct snd_emu10k1_pcm_mixer {
/* mono, left, right x 8 sends (4 on emu10k1) */
unsigned char send_routing[3][8];
unsigned char send_volume[3][8];
unsigned short attn[3];
emu10k1_pcm_t *epcm;
} emu10k1_pcm_mixer_t;
struct snd_emu10k1_pcm *epcm;
};
#define snd_emu10k1_compose_send_routing(route) \
((route[0] | (route[1] << 4) | (route[2] << 8) | (route[3] << 12)) << 16)
@ -958,20 +956,20 @@ typedef struct {
#define snd_emu10k1_compose_audigy_fxrt2(route) \
((unsigned int)route[4] | ((unsigned int)route[5] << 8) | ((unsigned int)route[6] << 16) | ((unsigned int)route[7] << 24))
typedef struct snd_emu10k1_memblk {
snd_util_memblk_t mem;
struct snd_emu10k1_memblk {
struct snd_util_memblk mem;
/* private part */
int first_page, last_page, pages, mapped_page;
unsigned int map_locked;
struct list_head mapped_link;
struct list_head mapped_order_link;
} emu10k1_memblk_t;
};
#define snd_emu10k1_memblk_offset(blk) (((blk)->mapped_page << PAGE_SHIFT) | ((blk)->mem.offset & (PAGE_SIZE - 1)))
#define EMU10K1_MAX_TRAM_BLOCKS_PER_CODE 16
typedef struct {
struct snd_emu10k1_fx8010_ctl {
struct list_head list; /* list link container */
unsigned int vcount;
unsigned int count; /* count of GPR (1..16) */
@ -980,19 +978,19 @@ typedef struct {
unsigned int min; /* minimum range */
unsigned int max; /* maximum range */
unsigned int translation; /* translation type (EMU10K1_GPR_TRANSLATION*) */
snd_kcontrol_t *kcontrol;
} snd_emu10k1_fx8010_ctl_t;
struct snd_kcontrol *kcontrol;
};
typedef void (snd_fx8010_irq_handler_t)(emu10k1_t *emu, void *private_data);
typedef void (snd_fx8010_irq_handler_t)(struct snd_emu10k1 *emu, void *private_data);
typedef struct _snd_emu10k1_fx8010_irq {
struct _snd_emu10k1_fx8010_irq *next;
struct snd_emu10k1_fx8010_irq {
struct snd_emu10k1_fx8010_irq *next;
snd_fx8010_irq_handler_t *handler;
unsigned short gpr_running;
void *private_data;
} snd_emu10k1_fx8010_irq_t;
};
typedef struct {
struct snd_emu10k1_fx8010_pcm {
unsigned int valid: 1,
opened: 1,
active: 1;
@ -1006,13 +1004,13 @@ typedef struct {
unsigned short gpr_trigger; /* GPR containing trigger (activate) information (host) */
unsigned short gpr_running; /* GPR containing info if PCM is running (FX8010) */
unsigned char etram[32]; /* external TRAM address & data */
snd_pcm_indirect_t pcm_rec;
struct snd_pcm_indirect pcm_rec;
unsigned int tram_pos;
unsigned int tram_shift;
snd_emu10k1_fx8010_irq_t *irq;
} snd_emu10k1_fx8010_pcm_t;
struct snd_emu10k1_fx8010_irq *irq;
};
typedef struct {
struct snd_emu10k1_fx8010 {
unsigned short fxbus_mask; /* used FX buses (bitmask) */
unsigned short extin_mask; /* used external inputs (bitmask) */
unsigned short extout_mask; /* used external outputs (bitmask) */
@ -1025,18 +1023,18 @@ typedef struct {
int gpr_count; /* count of used kcontrols */
struct list_head gpr_ctl; /* GPR controls */
struct semaphore lock;
snd_emu10k1_fx8010_pcm_t pcm[8];
struct snd_emu10k1_fx8010_pcm pcm[8];
spinlock_t irq_lock;
snd_emu10k1_fx8010_irq_t *irq_handlers;
} snd_emu10k1_fx8010_t;
struct snd_emu10k1_fx8010_irq *irq_handlers;
};
#define emu10k1_gpr_ctl(n) list_entry(n, snd_emu10k1_fx8010_ctl_t, list)
#define emu10k1_gpr_ctl(n) list_entry(n, struct snd_emu10k1_fx8010_ctl, list)
typedef struct {
struct _snd_emu10k1 *emu;
snd_rawmidi_t *rmidi;
snd_rawmidi_substream_t *substream_input;
snd_rawmidi_substream_t *substream_output;
struct snd_emu10k1_midi {
struct snd_emu10k1 *emu;
struct snd_rawmidi *rmidi;
struct snd_rawmidi_substream *substream_input;
struct snd_rawmidi_substream *substream_output;
unsigned int midi_mode;
spinlock_t input_lock;
spinlock_t output_lock;
@ -1044,10 +1042,10 @@ typedef struct {
int tx_enable, rx_enable;
int port;
int ipr_tx, ipr_rx;
void (*interrupt)(emu10k1_t *emu, unsigned int status);
} emu10k1_midi_t;
void (*interrupt)(struct snd_emu10k1 *emu, unsigned int status);
};
typedef struct {
struct snd_emu_chip_details {
u32 vendor;
u32 device;
u32 subsystem;
@ -1063,18 +1061,23 @@ typedef struct {
unsigned char spdif_bug; /* Has Spdif phasing bug */
unsigned char ac97_chip; /* Has an AC97 chip: 1 = mandatory, 2 = optional */
unsigned char ecard; /* APS EEPROM */
unsigned char emu1212m; /* EMU 1212m card */
unsigned char spi_dac; /* SPI interface for DAC */
unsigned char i2c_adc; /* I2C interface for ADC */
const char *driver;
const char *name;
const char *id; /* for backward compatibility - can be NULL if not needed */
} emu_chip_details_t;
};
struct _snd_emu10k1 {
struct snd_emu10k1 {
int irq;
unsigned long port; /* I/O port number */
unsigned int tos_link: 1, /* tos link detected */
rear_ac97: 1; /* rear channels are on AC'97 */
const emu_chip_details_t *card_capabilities; /* Contains profile of card capabilities */
rear_ac97: 1, /* rear channels are on AC'97 */
enable_ir: 1;
/* Contains profile of card capabilities */
const struct snd_emu_chip_details *card_capabilities;
unsigned int audigy; /* is Audigy? */
unsigned int revision; /* chip revision */
unsigned int serial; /* serial number */
@ -1088,8 +1091,8 @@ struct _snd_emu10k1 {
struct snd_dma_device p16v_dma_dev;
struct snd_dma_buffer p16v_buffer;
snd_util_memhdr_t *memhdr; /* page allocation list */
emu10k1_memblk_t *reserved_page; /* reserved page */
struct snd_util_memhdr *memhdr; /* page allocation list */
struct snd_emu10k1_memblk *reserved_page; /* reserved page */
struct list_head mapped_link_head;
struct list_head mapped_order_link_head;
@ -1099,142 +1102,169 @@ struct _snd_emu10k1 {
unsigned int spdif_bits[3]; /* s/pdif out setup */
snd_emu10k1_fx8010_t fx8010; /* FX8010 info */
struct snd_emu10k1_fx8010 fx8010; /* FX8010 info */
int gpr_base;
ac97_t *ac97;
struct snd_ac97 *ac97;
struct pci_dev *pci;
snd_card_t *card;
snd_pcm_t *pcm;
snd_pcm_t *pcm_mic;
snd_pcm_t *pcm_efx;
snd_pcm_t *pcm_p16v;
struct snd_card *card;
struct snd_pcm *pcm;
struct snd_pcm *pcm_mic;
struct snd_pcm *pcm_efx;
struct snd_pcm *pcm_multi;
struct snd_pcm *pcm_p16v;
spinlock_t synth_lock;
void *synth;
int (*get_synth_voice)(emu10k1_t *emu);
int (*get_synth_voice)(struct snd_emu10k1 *emu);
spinlock_t reg_lock;
spinlock_t emu_lock;
spinlock_t voice_lock;
struct semaphore ptb_lock;
emu10k1_voice_t voices[NUM_G];
emu10k1_voice_t p16v_voices[4];
emu10k1_voice_t p16v_capture_voice;
struct snd_emu10k1_voice voices[NUM_G];
struct snd_emu10k1_voice p16v_voices[4];
struct snd_emu10k1_voice p16v_capture_voice;
int p16v_device_offset;
u32 p16v_capture_source;
u32 p16v_capture_channel;
emu10k1_pcm_mixer_t pcm_mixer[32];
emu10k1_pcm_mixer_t efx_pcm_mixer[NUM_EFX_PLAYBACK];
snd_kcontrol_t *ctl_send_routing;
snd_kcontrol_t *ctl_send_volume;
snd_kcontrol_t *ctl_attn;
snd_kcontrol_t *ctl_efx_send_routing;
snd_kcontrol_t *ctl_efx_send_volume;
snd_kcontrol_t *ctl_efx_attn;
struct snd_emu10k1_pcm_mixer pcm_mixer[32];
struct snd_emu10k1_pcm_mixer efx_pcm_mixer[NUM_EFX_PLAYBACK];
struct snd_kcontrol *ctl_send_routing;
struct snd_kcontrol *ctl_send_volume;
struct snd_kcontrol *ctl_attn;
struct snd_kcontrol *ctl_efx_send_routing;
struct snd_kcontrol *ctl_efx_send_volume;
struct snd_kcontrol *ctl_efx_attn;
void (*hwvol_interrupt)(emu10k1_t *emu, unsigned int status);
void (*capture_interrupt)(emu10k1_t *emu, unsigned int status);
void (*capture_mic_interrupt)(emu10k1_t *emu, unsigned int status);
void (*capture_efx_interrupt)(emu10k1_t *emu, unsigned int status);
void (*spdif_interrupt)(emu10k1_t *emu, unsigned int status);
void (*dsp_interrupt)(emu10k1_t *emu);
void (*hwvol_interrupt)(struct snd_emu10k1 *emu, unsigned int status);
void (*capture_interrupt)(struct snd_emu10k1 *emu, unsigned int status);
void (*capture_mic_interrupt)(struct snd_emu10k1 *emu, unsigned int status);
void (*capture_efx_interrupt)(struct snd_emu10k1 *emu, unsigned int status);
void (*spdif_interrupt)(struct snd_emu10k1 *emu, unsigned int status);
void (*dsp_interrupt)(struct snd_emu10k1 *emu);
snd_pcm_substream_t *pcm_capture_substream;
snd_pcm_substream_t *pcm_capture_mic_substream;
snd_pcm_substream_t *pcm_capture_efx_substream;
snd_pcm_substream_t *pcm_playback_efx_substream;
struct snd_pcm_substream *pcm_capture_substream;
struct snd_pcm_substream *pcm_capture_mic_substream;
struct snd_pcm_substream *pcm_capture_efx_substream;
struct snd_pcm_substream *pcm_playback_efx_substream;
snd_timer_t *timer;
struct snd_timer *timer;
emu10k1_midi_t midi;
emu10k1_midi_t midi2; /* for audigy */
struct snd_emu10k1_midi midi;
struct snd_emu10k1_midi midi2; /* for audigy */
unsigned int efx_voices_mask[2];
unsigned int next_free_voice;
#ifdef CONFIG_PM
unsigned int *saved_ptr;
unsigned int *saved_gpr;
unsigned int *tram_val_saved;
unsigned int *tram_addr_saved;
unsigned int *saved_icode;
unsigned int *p16v_saved;
unsigned int saved_a_iocfg, saved_hcfg;
#endif
};
int snd_emu10k1_create(snd_card_t * card,
int snd_emu10k1_create(struct snd_card *card,
struct pci_dev *pci,
unsigned short extin_mask,
unsigned short extout_mask,
long max_cache_bytes,
int enable_ir,
uint subsystem,
emu10k1_t ** remu);
struct snd_emu10k1 ** remu);
int snd_emu10k1_pcm(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);
int snd_emu10k1_pcm_mic(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);
int snd_emu10k1_pcm_efx(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);
int snd_p16v_pcm(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);
int snd_p16v_free(emu10k1_t * emu);
int snd_p16v_mixer(emu10k1_t * emu);
int snd_emu10k1_pcm_multi(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);
int snd_emu10k1_fx8010_pcm(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);
int snd_emu10k1_mixer(emu10k1_t * emu, int pcm_device, int multi_device);
int snd_emu10k1_timer(emu10k1_t * emu, int device);
int snd_emu10k1_fx8010_new(emu10k1_t *emu, int device, snd_hwdep_t ** rhwdep);
int snd_emu10k1_pcm(struct snd_emu10k1 * emu, int device, struct snd_pcm ** rpcm);
int snd_emu10k1_pcm_mic(struct snd_emu10k1 * emu, int device, struct snd_pcm ** rpcm);
int snd_emu10k1_pcm_efx(struct snd_emu10k1 * emu, int device, struct snd_pcm ** rpcm);
int snd_p16v_pcm(struct snd_emu10k1 * emu, int device, struct snd_pcm ** rpcm);
int snd_p16v_free(struct snd_emu10k1 * emu);
int snd_p16v_mixer(struct snd_emu10k1 * emu);
int snd_emu10k1_pcm_multi(struct snd_emu10k1 * emu, int device, struct snd_pcm ** rpcm);
int snd_emu10k1_fx8010_pcm(struct snd_emu10k1 * emu, int device, struct snd_pcm ** rpcm);
int snd_emu10k1_mixer(struct snd_emu10k1 * emu, int pcm_device, int multi_device);
int snd_emu10k1_timer(struct snd_emu10k1 * emu, int device);
int snd_emu10k1_fx8010_new(struct snd_emu10k1 *emu, int device, struct snd_hwdep ** rhwdep);
irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs);
/* initialization */
void snd_emu10k1_voice_init(emu10k1_t * emu, int voice);
int snd_emu10k1_init_efx(emu10k1_t *emu);
void snd_emu10k1_free_efx(emu10k1_t *emu);
int snd_emu10k1_fx8010_tram_setup(emu10k1_t *emu, u32 size);
void snd_emu10k1_voice_init(struct snd_emu10k1 * emu, int voice);
int snd_emu10k1_init_efx(struct snd_emu10k1 *emu);
void snd_emu10k1_free_efx(struct snd_emu10k1 *emu);
int snd_emu10k1_fx8010_tram_setup(struct snd_emu10k1 *emu, u32 size);
int snd_emu10k1_done(struct snd_emu10k1 * emu);
/* I/O functions */
unsigned int snd_emu10k1_ptr_read(emu10k1_t * emu, unsigned int reg, unsigned int chn);
void snd_emu10k1_ptr_write(emu10k1_t *emu, unsigned int reg, unsigned int chn, unsigned int data);
unsigned int snd_emu10k1_ptr20_read(emu10k1_t * emu, unsigned int reg, unsigned int chn);
void snd_emu10k1_ptr20_write(emu10k1_t *emu, unsigned int reg, unsigned int chn, unsigned int data);
unsigned int snd_emu10k1_efx_read(emu10k1_t *emu, unsigned int pc);
void snd_emu10k1_intr_enable(emu10k1_t *emu, unsigned int intrenb);
void snd_emu10k1_intr_disable(emu10k1_t *emu, unsigned int intrenb);
void snd_emu10k1_voice_intr_enable(emu10k1_t *emu, unsigned int voicenum);
void snd_emu10k1_voice_intr_disable(emu10k1_t *emu, unsigned int voicenum);
void snd_emu10k1_voice_intr_ack(emu10k1_t *emu, unsigned int voicenum);
void snd_emu10k1_voice_half_loop_intr_enable(emu10k1_t *emu, unsigned int voicenum);
void snd_emu10k1_voice_half_loop_intr_disable(emu10k1_t *emu, unsigned int voicenum);
void snd_emu10k1_voice_half_loop_intr_ack(emu10k1_t *emu, unsigned int voicenum);
void snd_emu10k1_voice_set_loop_stop(emu10k1_t *emu, unsigned int voicenum);
void snd_emu10k1_voice_clear_loop_stop(emu10k1_t *emu, unsigned int voicenum);
void snd_emu10k1_wait(emu10k1_t *emu, unsigned int wait);
static inline unsigned int snd_emu10k1_wc(emu10k1_t *emu) { return (inl(emu->port + WC) >> 6) & 0xfffff; }
unsigned short snd_emu10k1_ac97_read(ac97_t *ac97, unsigned short reg);
void snd_emu10k1_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short data);
unsigned int snd_emu10k1_ptr_read(struct snd_emu10k1 * emu, unsigned int reg, unsigned int chn);
void snd_emu10k1_ptr_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned int chn, unsigned int data);
unsigned int snd_emu10k1_ptr20_read(struct snd_emu10k1 * emu, unsigned int reg, unsigned int chn);
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);
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_disable(struct snd_emu10k1 *emu, unsigned int intrenb);
void snd_emu10k1_voice_intr_enable(struct snd_emu10k1 *emu, unsigned int voicenum);
void snd_emu10k1_voice_intr_disable(struct snd_emu10k1 *emu, unsigned int voicenum);
void snd_emu10k1_voice_intr_ack(struct snd_emu10k1 *emu, unsigned int voicenum);
void snd_emu10k1_voice_half_loop_intr_enable(struct snd_emu10k1 *emu, unsigned int voicenum);
void snd_emu10k1_voice_half_loop_intr_disable(struct snd_emu10k1 *emu, unsigned int voicenum);
void snd_emu10k1_voice_half_loop_intr_ack(struct snd_emu10k1 *emu, unsigned int voicenum);
void snd_emu10k1_voice_set_loop_stop(struct snd_emu10k1 *emu, unsigned int voicenum);
void snd_emu10k1_voice_clear_loop_stop(struct snd_emu10k1 *emu, unsigned int voicenum);
void snd_emu10k1_wait(struct snd_emu10k1 *emu, unsigned int wait);
static inline unsigned int snd_emu10k1_wc(struct snd_emu10k1 *emu) { return (inl(emu->port + WC) >> 6) & 0xfffff; }
unsigned short snd_emu10k1_ac97_read(struct snd_ac97 *ac97, unsigned short reg);
void snd_emu10k1_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short data);
unsigned int snd_emu10k1_rate_to_pitch(unsigned int rate);
#ifdef CONFIG_PM
void snd_emu10k1_suspend_regs(struct snd_emu10k1 *emu);
void snd_emu10k1_resume_init(struct snd_emu10k1 *emu);
void snd_emu10k1_resume_regs(struct snd_emu10k1 *emu);
int snd_emu10k1_efx_alloc_pm_buffer(struct snd_emu10k1 *emu);
void snd_emu10k1_efx_free_pm_buffer(struct snd_emu10k1 *emu);
void snd_emu10k1_efx_suspend(struct snd_emu10k1 *emu);
void snd_emu10k1_efx_resume(struct snd_emu10k1 *emu);
int snd_p16v_alloc_pm_buffer(struct snd_emu10k1 *emu);
void snd_p16v_free_pm_buffer(struct snd_emu10k1 *emu);
void snd_p16v_suspend(struct snd_emu10k1 *emu);
void snd_p16v_resume(struct snd_emu10k1 *emu);
#endif
/* memory allocation */
snd_util_memblk_t *snd_emu10k1_alloc_pages(emu10k1_t *emu, snd_pcm_substream_t *substream);
int snd_emu10k1_free_pages(emu10k1_t *emu, snd_util_memblk_t *blk);
snd_util_memblk_t *snd_emu10k1_synth_alloc(emu10k1_t *emu, unsigned int size);
int snd_emu10k1_synth_free(emu10k1_t *emu, snd_util_memblk_t *blk);
int snd_emu10k1_synth_bzero(emu10k1_t *emu, snd_util_memblk_t *blk, int offset, int size);
int snd_emu10k1_synth_copy_from_user(emu10k1_t *emu, snd_util_memblk_t *blk, int offset, const char __user *data, int size);
int snd_emu10k1_memblk_map(emu10k1_t *emu, emu10k1_memblk_t *blk);
struct snd_util_memblk *snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *substream);
int snd_emu10k1_free_pages(struct snd_emu10k1 *emu, struct snd_util_memblk *blk);
struct snd_util_memblk *snd_emu10k1_synth_alloc(struct snd_emu10k1 *emu, unsigned int size);
int snd_emu10k1_synth_free(struct snd_emu10k1 *emu, struct snd_util_memblk *blk);
int snd_emu10k1_synth_bzero(struct snd_emu10k1 *emu, struct snd_util_memblk *blk, int offset, int size);
int snd_emu10k1_synth_copy_from_user(struct snd_emu10k1 *emu, struct snd_util_memblk *blk, int offset, const char __user *data, int size);
int snd_emu10k1_memblk_map(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk);
/* voice allocation */
int snd_emu10k1_voice_alloc(emu10k1_t *emu, emu10k1_voice_type_t type, int pair, emu10k1_voice_t **rvoice);
int snd_emu10k1_voice_free(emu10k1_t *emu, emu10k1_voice_t *pvoice);
int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int pair, struct snd_emu10k1_voice **rvoice);
int snd_emu10k1_voice_free(struct snd_emu10k1 *emu, struct snd_emu10k1_voice *pvoice);
/* MIDI uart */
int snd_emu10k1_midi(emu10k1_t * emu);
int snd_emu10k1_audigy_midi(emu10k1_t * emu);
int snd_emu10k1_midi(struct snd_emu10k1 * emu);
int snd_emu10k1_audigy_midi(struct snd_emu10k1 * emu);
/* proc interface */
int snd_emu10k1_proc_init(emu10k1_t * emu);
int snd_emu10k1_proc_init(struct snd_emu10k1 * emu);
/* fx8010 irq handler */
int snd_emu10k1_fx8010_register_irq_handler(emu10k1_t *emu,
int snd_emu10k1_fx8010_register_irq_handler(struct snd_emu10k1 *emu,
snd_fx8010_irq_handler_t *handler,
unsigned char gpr_running,
void *private_data,
snd_emu10k1_fx8010_irq_t **r_irq);
int snd_emu10k1_fx8010_unregister_irq_handler(emu10k1_t *emu,
snd_emu10k1_fx8010_irq_t *irq);
struct snd_emu10k1_fx8010_irq **r_irq);
int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu,
struct snd_emu10k1_fx8010_irq *irq);
#endif /* __KERNEL__ */
@ -1469,14 +1499,14 @@ int snd_emu10k1_fx8010_unregister_irq_handler(emu10k1_t *emu,
#define TANKMEMADDRREG_READ 0x00100000 /* Read from tank memory */
#endif
typedef struct {
struct snd_emu10k1_fx8010_info {
unsigned int internal_tram_size; /* in samples */
unsigned int external_tram_size; /* in samples */
char fxbus_names[16][32]; /* names of FXBUSes */
char extin_names[16][32]; /* names of external inputs */
char extout_names[32][32]; /* names of external outputs */
unsigned int gpr_controls; /* count of GPR controls */
} emu10k1_fx8010_info_t;
};
#define EMU10K1_GPR_TRANSLATION_NONE 0
#define EMU10K1_GPR_TRANSLATION_TABLE100 1
@ -1484,8 +1514,8 @@ typedef struct {
#define EMU10K1_GPR_TRANSLATION_TREBLE 3
#define EMU10K1_GPR_TRANSLATION_ONOFF 4
typedef struct {
snd_ctl_elem_id_t id; /* full control ID definition */
struct snd_emu10k1_fx8010_control_gpr {
struct snd_ctl_elem_id id; /* full control ID definition */
unsigned int vcount; /* visible count */
unsigned int count; /* count of GPR (1..16) */
unsigned short gpr[32]; /* GPR number(s) */
@ -1493,23 +1523,23 @@ typedef struct {
unsigned int min; /* minimum range */
unsigned int max; /* maximum range */
unsigned int translation; /* translation type (EMU10K1_GPR_TRANSLATION*) */
} emu10k1_fx8010_control_gpr_t;
};
typedef struct {
struct snd_emu10k1_fx8010_code {
char name[128];
DECLARE_BITMAP(gpr_valid, 0x200); /* bitmask of valid initializers */
u_int32_t __user *gpr_map; /* initializers */
unsigned int gpr_add_control_count; /* count of GPR controls to add/replace */
emu10k1_fx8010_control_gpr_t __user *gpr_add_controls; /* GPR controls to add/replace */
struct snd_emu10k1_fx8010_control_gpr __user *gpr_add_controls; /* GPR controls to add/replace */
unsigned int gpr_del_control_count; /* count of GPR controls to remove */
snd_ctl_elem_id_t __user *gpr_del_controls; /* IDs of GPR controls to remove */
struct snd_ctl_elem_id __user *gpr_del_controls; /* IDs of GPR controls to remove */
unsigned int gpr_list_control_count; /* count of GPR controls to list */
unsigned int gpr_list_control_total; /* total count of GPR controls */
emu10k1_fx8010_control_gpr_t __user *gpr_list_controls; /* listed GPR controls */
struct snd_emu10k1_fx8010_control_gpr __user *gpr_list_controls; /* listed GPR controls */
DECLARE_BITMAP(tram_valid, 0x100); /* bitmask of valid initializers */
u_int32_t __user *tram_data_map; /* data initializers */
@ -1517,16 +1547,16 @@ typedef struct {
DECLARE_BITMAP(code_valid, 1024); /* bitmask of valid instructions */
u_int32_t __user *code; /* one instruction - 64 bits */
} emu10k1_fx8010_code_t;
};
typedef struct {
struct snd_emu10k1_fx8010_tram {
unsigned int address; /* 31.bit == 1 -> external TRAM */
unsigned int size; /* size in samples (4 bytes) */
unsigned int *samples; /* pointer to samples (20-bit) */
/* NULL->clear memory */
} emu10k1_fx8010_tram_t;
};
typedef struct {
struct snd_emu10k1_fx8010_pcm_rec {
unsigned int substream; /* substream number */
unsigned int res1; /* reserved */
unsigned int channels; /* 16-bit channels count, zero = remove this substream */
@ -1541,20 +1571,27 @@ typedef struct {
unsigned char pad; /* reserved */
unsigned char etram[32]; /* external TRAM address & data (one per channel) */
unsigned int res2; /* reserved */
} emu10k1_fx8010_pcm_t;
};
#define SNDRV_EMU10K1_IOCTL_INFO _IOR ('H', 0x10, emu10k1_fx8010_info_t)
#define SNDRV_EMU10K1_IOCTL_CODE_POKE _IOW ('H', 0x11, emu10k1_fx8010_code_t)
#define SNDRV_EMU10K1_IOCTL_CODE_PEEK _IOWR('H', 0x12, emu10k1_fx8010_code_t)
#define SNDRV_EMU10K1_IOCTL_INFO _IOR ('H', 0x10, struct snd_emu10k1_fx8010_info)
#define SNDRV_EMU10K1_IOCTL_CODE_POKE _IOW ('H', 0x11, struct snd_emu10k1_fx8010_code)
#define SNDRV_EMU10K1_IOCTL_CODE_PEEK _IOWR('H', 0x12, struct snd_emu10k1_fx8010_code)
#define SNDRV_EMU10K1_IOCTL_TRAM_SETUP _IOW ('H', 0x20, int)
#define SNDRV_EMU10K1_IOCTL_TRAM_POKE _IOW ('H', 0x21, emu10k1_fx8010_tram_t)
#define SNDRV_EMU10K1_IOCTL_TRAM_PEEK _IOWR('H', 0x22, emu10k1_fx8010_tram_t)
#define SNDRV_EMU10K1_IOCTL_PCM_POKE _IOW ('H', 0x30, emu10k1_fx8010_pcm_t)
#define SNDRV_EMU10K1_IOCTL_PCM_PEEK _IOWR('H', 0x31, emu10k1_fx8010_pcm_t)
#define SNDRV_EMU10K1_IOCTL_TRAM_POKE _IOW ('H', 0x21, struct snd_emu10k1_fx8010_tram)
#define SNDRV_EMU10K1_IOCTL_TRAM_PEEK _IOWR('H', 0x22, struct snd_emu10k1_fx8010_tram)
#define SNDRV_EMU10K1_IOCTL_PCM_POKE _IOW ('H', 0x30, struct snd_emu10k1_fx8010_pcm_rec)
#define SNDRV_EMU10K1_IOCTL_PCM_PEEK _IOWR('H', 0x31, struct snd_emu10k1_fx8010_pcm_rec)
#define SNDRV_EMU10K1_IOCTL_STOP _IO ('H', 0x80)
#define SNDRV_EMU10K1_IOCTL_CONTINUE _IO ('H', 0x81)
#define SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER _IO ('H', 0x82)
#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP _IOW ('H', 0x83, int)
#define SNDRV_EMU10K1_IOCTL_DBG_READ _IOR ('H', 0x84, int)
/* typedefs for compatibility to user-space */
typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
#endif /* __SOUND_EMU10K1_H */

View File

@ -27,12 +27,12 @@
#define SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH "emu10k1-synth"
/* argument for snd_seq_device_new */
typedef struct snd_emu10k1_synth_arg {
emu10k1_t *hwptr; /* chip */
struct snd_emu10k1_synth_arg {
struct snd_emu10k1 *hwptr; /* chip */
int index; /* sequencer client index */
int seq_ports; /* number of sequencer ports to be created */
int max_voices; /* maximum number of voices for wavetable */
} snd_emu10k1_synth_arg_t;
};
#define EMU10K1_MAX_MEMSIZE (32 * 1024 * 1024) /* 32MB */

View File

@ -56,9 +56,9 @@ enum {
* some of the channels may be used for other things so max_channels is
* the number in use for wave voices.
*/
typedef struct snd_emu8000 {
struct snd_emu8000 {
snd_emux_t *emu;
struct snd_emux *emu;
int index; /* sequencer client index */
int seq_ports; /* number of sequencer ports */
@ -77,44 +77,45 @@ typedef struct snd_emu8000 {
int dram_checked;
snd_card_t *card; /* The card that this belongs to */
struct snd_card *card; /* The card that this belongs to */
int chorus_mode;
int reverb_mode;
int bass_level;
int treble_level;
snd_util_memhdr_t *memhdr;
struct snd_util_memhdr *memhdr;
spinlock_t control_lock;
snd_kcontrol_t *controls[EMU8000_NUM_CONTROLS];
struct snd_kcontrol *controls[EMU8000_NUM_CONTROLS];
snd_pcm_t *pcm; /* pcm on emu8000 wavetable */
struct snd_pcm *pcm; /* pcm on emu8000 wavetable */
} emu8000_t;
};
/* sequencer device id */
#define SNDRV_SEQ_DEV_ID_EMU8000 "emu8000-synth"
/* exported functions */
int snd_emu8000_new(snd_card_t *card, int device, long port, int seq_ports, snd_seq_device_t **ret);
void snd_emu8000_poke(emu8000_t *emu, unsigned int port, unsigned int reg,
int snd_emu8000_new(struct snd_card *card, int device, long port, int seq_ports,
struct snd_seq_device **ret);
void snd_emu8000_poke(struct snd_emu8000 *emu, unsigned int port, unsigned int reg,
unsigned int val);
unsigned short snd_emu8000_peek(emu8000_t *emu, unsigned int port,
unsigned short snd_emu8000_peek(struct snd_emu8000 *emu, unsigned int port,
unsigned int reg);
void snd_emu8000_poke_dw(emu8000_t *emu, unsigned int port, unsigned int reg,
void snd_emu8000_poke_dw(struct snd_emu8000 *emu, unsigned int port, unsigned int reg,
unsigned int val);
unsigned int snd_emu8000_peek_dw(emu8000_t *emu, unsigned int port,
unsigned int snd_emu8000_peek_dw(struct snd_emu8000 *emu, unsigned int port,
unsigned int reg);
void snd_emu8000_dma_chan(emu8000_t *emu, int ch, int mode);
void snd_emu8000_dma_chan(struct snd_emu8000 *emu, int ch, int mode);
void snd_emu8000_init_fm(emu8000_t *emu);
void snd_emu8000_init_fm(struct snd_emu8000 *emu);
void snd_emu8000_update_chorus_mode(emu8000_t *emu);
void snd_emu8000_update_reverb_mode(emu8000_t *emu);
void snd_emu8000_update_equalizer(emu8000_t *emu);
int snd_emu8000_load_chorus_fx(emu8000_t *emu, int mode, const void __user *buf, long len);
int snd_emu8000_load_reverb_fx(emu8000_t *emu, int mode, const void __user *buf, long len);
void snd_emu8000_update_chorus_mode(struct snd_emu8000 *emu);
void snd_emu8000_update_reverb_mode(struct snd_emu8000 *emu);
void snd_emu8000_update_equalizer(struct snd_emu8000 *emu);
int snd_emu8000_load_chorus_fx(struct snd_emu8000 *emu, int mode, const void __user *buf, long len);
int snd_emu8000_load_reverb_fx(struct snd_emu8000 *emu, int mode, const void __user *buf, long len);
#endif /* __SOUND_EMU8000_H */

View File

@ -36,39 +36,40 @@
*/
#define SNDRV_EMUX_USE_RAW_EFFECT
/*
* typedefs
*/
typedef struct snd_emux_effect_table snd_emux_effect_table_t;
typedef struct snd_emux_port snd_emux_port_t;
typedef struct snd_emux_voice snd_emux_voice_t;
typedef struct snd_emux snd_emux_t;
struct snd_emux;
struct snd_emux_port;
struct snd_emux_voice;
struct snd_emux_effect_table;
/*
* operators
*/
typedef struct snd_emux_operators {
struct snd_emux_operators {
struct module *owner;
snd_emux_voice_t *(*get_voice)(snd_emux_t *emu, snd_emux_port_t *port);
int (*prepare)(snd_emux_voice_t *vp);
void (*trigger)(snd_emux_voice_t *vp);
void (*release)(snd_emux_voice_t *vp);
void (*update)(snd_emux_voice_t *vp, int update);
void (*terminate)(snd_emux_voice_t *vp);
void (*free_voice)(snd_emux_voice_t *vp);
void (*reset)(snd_emux_t *emu, int ch);
/* the first parameters are snd_emux_t */
int (*sample_new)(snd_emux_t *emu, snd_sf_sample_t *sp, snd_util_memhdr_t *hdr, const void __user *data, long count);
int (*sample_free)(snd_emux_t *emu, snd_sf_sample_t *sp, snd_util_memhdr_t *hdr);
void (*sample_reset)(snd_emux_t *emu);
int (*load_fx)(snd_emux_t *emu, int type, int arg, const void __user *data, long count);
void (*sysex)(snd_emux_t *emu, char *buf, int len, int parsed, snd_midi_channel_set_t *chset);
struct snd_emux_voice *(*get_voice)(struct snd_emux *emu,
struct snd_emux_port *port);
int (*prepare)(struct snd_emux_voice *vp);
void (*trigger)(struct snd_emux_voice *vp);
void (*release)(struct snd_emux_voice *vp);
void (*update)(struct snd_emux_voice *vp, int update);
void (*terminate)(struct snd_emux_voice *vp);
void (*free_voice)(struct snd_emux_voice *vp);
void (*reset)(struct snd_emux *emu, int ch);
/* the first parameters are struct snd_emux */
int (*sample_new)(struct snd_emux *emu, struct snd_sf_sample *sp,
struct snd_util_memhdr *hdr,
const void __user *data, long count);
int (*sample_free)(struct snd_emux *emu, struct snd_sf_sample *sp,
struct snd_util_memhdr *hdr);
void (*sample_reset)(struct snd_emux *emu);
int (*load_fx)(struct snd_emux *emu, int type, int arg,
const void __user *data, long count);
void (*sysex)(struct snd_emux *emu, char *buf, int len, int parsed,
struct snd_midi_channel_set *chset);
#ifdef CONFIG_SND_SEQUENCER_OSS
int (*oss_ioctl)(snd_emux_t *emu, int cmd, int p1, int p2);
int (*oss_ioctl)(struct snd_emux *emu, int cmd, int p1, int p2);
#endif
} snd_emux_operators_t;
};
/*
@ -90,46 +91,46 @@ typedef struct snd_emux_operators {
*/
struct snd_emux {
snd_card_t *card; /* assigned card */
struct snd_card *card; /* assigned card */
/* following should be initialized before registration */
int max_voices; /* Number of voices */
int mem_size; /* memory size (in byte) */
int num_ports; /* number of ports to be created */
int pitch_shift; /* pitch shift value (for Emu10k1) */
snd_emux_operators_t ops; /* operators */
struct snd_emux_operators ops; /* operators */
void *hw; /* hardware */
unsigned long flags; /* other conditions */
int midi_ports; /* number of virtual midi devices */
int midi_devidx; /* device offset of virtual midi */
unsigned int linear_panning: 1; /* panning is linear (sbawe = 1, emu10k1 = 0) */
int hwdep_idx; /* hwdep device index */
snd_hwdep_t *hwdep; /* hwdep device */
struct snd_hwdep *hwdep; /* hwdep device */
/* private */
int num_voices; /* current number of voices */
snd_sf_list_t *sflist; /* root of SoundFont list */
snd_emux_voice_t *voices; /* Voices (EMU 'channel') */
struct snd_sf_list *sflist; /* root of SoundFont list */
struct snd_emux_voice *voices; /* Voices (EMU 'channel') */
int use_time; /* allocation counter */
spinlock_t voice_lock; /* Lock for voice access */
struct semaphore register_mutex;
int client; /* For the sequencer client */
int ports[SNDRV_EMUX_MAX_PORTS]; /* The ports for this device */
snd_emux_port_t *portptrs[SNDRV_EMUX_MAX_PORTS];
struct snd_emux_port *portptrs[SNDRV_EMUX_MAX_PORTS];
int used; /* use counter */
char *name; /* name of the device (internal) */
snd_rawmidi_t **vmidi;
struct snd_rawmidi **vmidi;
struct timer_list tlist; /* for pending note-offs */
int timer_active;
snd_util_memhdr_t *memhdr; /* memory chunk information */
struct snd_util_memhdr *memhdr; /* memory chunk information */
#ifdef CONFIG_PROC_FS
snd_info_entry_t *proc;
struct snd_info_entry *proc;
#endif
#ifdef CONFIG_SND_SEQUENCER_OSS
snd_seq_device_t *oss_synth;
struct snd_seq_device *oss_synth;
#endif
};
@ -139,18 +140,18 @@ struct snd_emux {
*/
struct snd_emux_port {
snd_midi_channel_set_t chset;
snd_emux_t *emu;
struct snd_midi_channel_set chset;
struct snd_emux *emu;
char port_mode; /* operation mode */
int volume_atten; /* emuX raw attenuation */
unsigned long drum_flags; /* drum bitmaps */
int ctrls[EMUX_MD_END]; /* control parameters */
#ifdef SNDRV_EMUX_USE_RAW_EFFECT
snd_emux_effect_table_t *effect;
struct snd_emux_effect_table *effect;
#endif
#ifdef CONFIG_SND_SEQUENCER_OSS
snd_seq_oss_arg_t *oss_arg;
struct snd_seq_oss_arg *oss_arg;
#endif
};
@ -179,16 +180,16 @@ struct snd_emux_voice {
unsigned char key;
unsigned char velocity; /* Velocity of current note */
snd_sf_zone_t *zone; /* Zone assigned to this note */
struct snd_sf_zone *zone; /* Zone assigned to this note */
void *block; /* sample block pointer (optional) */
snd_midi_channel_t *chan; /* Midi channel for this note */
snd_emux_port_t *port; /* associated port */
snd_emux_t *emu; /* assigned root info */
void *hw; /* hardware pointer (emu8000_t or emu10k1_t) */
struct snd_midi_channel *chan; /* Midi channel for this note */
struct snd_emux_port *port; /* associated port */
struct snd_emux *emu; /* assigned root info */
void *hw; /* hardware pointer (emu8000 or emu10k1) */
unsigned long ontime; /* jiffies at note triggered */
/* Emu8k/Emu10k1 registers */
soundfont_voice_info_t reg;
struct soundfont_voice_info reg;
/* additional registers */
int avol; /* volume attenuation */
@ -229,15 +230,15 @@ struct snd_emux_effect_table {
/*
* prototypes - interface to Emu10k1 and Emu8k routines
*/
int snd_emux_new(snd_emux_t **remu);
int snd_emux_register(snd_emux_t *emu, snd_card_t *card, int index, char *name);
int snd_emux_free(snd_emux_t *emu);
int snd_emux_new(struct snd_emux **remu);
int snd_emux_register(struct snd_emux *emu, struct snd_card *card, int index, char *name);
int snd_emux_free(struct snd_emux *emu);
/*
* exported functions
*/
void snd_emux_terminate_all(snd_emux_t *emu);
void snd_emux_lock_voice(snd_emux_t *emu, int voice);
void snd_emux_unlock_voice(snd_emux_t *emu, int voice);
void snd_emux_terminate_all(struct snd_emux *emu);
void snd_emux_lock_voice(struct snd_emux *emu, int voice);
void snd_emux_unlock_voice(struct snd_emux *emu, int voice);
#endif /* __SOUND_EMUX_SYNTH_H */

View File

@ -30,7 +30,7 @@
#define ES1688_HW_688 0x0001
#define ES1688_HW_1688 0x0002
struct _snd_es1688 {
struct snd_es1688 {
unsigned long port; /* port of ESS chip */
struct resource *res_port;
unsigned long mpu_port; /* MPU-401 port of ESS chip */
@ -44,17 +44,15 @@ struct _snd_es1688 {
unsigned char pad;
unsigned int dma_size;
snd_card_t *card;
snd_pcm_t *pcm;
snd_pcm_substream_t *playback_substream;
snd_pcm_substream_t *capture_substream;
struct snd_card *card;
struct snd_pcm *pcm;
struct snd_pcm_substream *playback_substream;
struct snd_pcm_substream *capture_substream;
spinlock_t reg_lock;
spinlock_t mixer_lock;
};
typedef struct _snd_es1688 es1688_t;
/* I/O ports */
#define ES1688P(codec, x) ((codec)->port + e_s_s_ESS1688##x)
@ -107,17 +105,17 @@ typedef struct _snd_es1688 es1688_t;
*/
void snd_es1688_mixer_write(es1688_t *chip, unsigned char reg, unsigned char data);
void snd_es1688_mixer_write(struct snd_es1688 *chip, unsigned char reg, unsigned char data);
int snd_es1688_create(snd_card_t * card,
int snd_es1688_create(struct snd_card *card,
unsigned long port,
unsigned long mpu_port,
int irq,
int mpu_irq,
int dma8,
unsigned short hardware,
es1688_t ** rchip);
int snd_es1688_pcm(es1688_t *chip, int device, snd_pcm_t ** rpcm);
int snd_es1688_mixer(es1688_t *chip);
struct snd_es1688 ** rchip);
int snd_es1688_pcm(struct snd_es1688 *chip, int device, struct snd_pcm ** rpcm);
int snd_es1688_mixer(struct snd_es1688 *chip);
#endif /* __SOUND_ES1688_H */

View File

@ -49,32 +49,32 @@
#define SNDRV_g_u_s_IRQSTAT (0x226-0x220)
#define SNDRV_g_u_s_TIMERCNTRL (0x228-0x220)
#define SNDRV_g_u_s_TIMERDATA (0x229-0x220)
#define SNDRV_g_u_s_DRAM (0x327-0x220)
#define SNDRV_g_u_s_DRAM (0x327-0x220)
#define SNDRV_g_u_s_MIXCNTRLREG (0x220-0x220)
#define SNDRV_g_u_s_IRQDMACNTRLREG (0x22b-0x220)
#define SNDRV_g_u_s_REGCNTRLS (0x22f-0x220)
#define SNDRV_g_u_s_BOARDVERSION (0x726-0x220)
#define SNDRV_g_u_s_MIXCNTRLPORT (0x726-0x220)
#define SNDRV_g_u_s_IVER (0x325-0x220)
#define SNDRV_g_u_s_BOARDVERSION (0x726-0x220)
#define SNDRV_g_u_s_MIXCNTRLPORT (0x726-0x220)
#define SNDRV_g_u_s_IVER (0x325-0x220)
#define SNDRV_g_u_s_MIXDATAPORT (0x326-0x220)
#define SNDRV_g_u_s_MAXCNTRLPORT (0x326-0x220)
#define SNDRV_g_u_s_MAXCNTRLPORT (0x326-0x220)
/* GF1 registers */
/* global registers */
#define SNDRV_GF1_GB_ACTIVE_VOICES 0x0e
#define SNDRV_GF1_GB_VOICES_IRQ 0x0f
#define SNDRV_GF1_GB_GLOBAL_MODE 0x19
#define SNDRV_GF1_GB_GLOBAL_MODE 0x19
#define SNDRV_GF1_GW_LFO_BASE 0x1a
#define SNDRV_GF1_GB_VOICES_IRQ_READ 0x1f
#define SNDRV_GF1_GB_DRAM_DMA_CONTROL 0x41
#define SNDRV_GF1_GW_DRAM_DMA_LOW 0x42
#define SNDRV_GF1_GW_DRAM_IO_LOW 0x43
#define SNDRV_GF1_GB_DRAM_IO_HIGH 0x44
#define SNDRV_GF1_GW_DRAM_DMA_LOW 0x42
#define SNDRV_GF1_GW_DRAM_IO_LOW 0x43
#define SNDRV_GF1_GB_DRAM_IO_HIGH 0x44
#define SNDRV_GF1_GB_SOUND_BLASTER_CONTROL 0x45
#define SNDRV_GF1_GB_ADLIB_TIMER_1 0x46
#define SNDRV_GF1_GB_ADLIB_TIMER_2 0x47
#define SNDRV_GF1_GB_RECORD_RATE 0x48
#define SNDRV_GF1_GB_RECORD_RATE 0x48
#define SNDRV_GF1_GB_REC_DMA_CONTROL 0x49
#define SNDRV_GF1_GB_JOYSTICK_DAC_LEVEL 0x4b
#define SNDRV_GF1_GB_RESET 0x4c
@ -83,7 +83,7 @@
#define SNDRV_GF1_GW_MEMORY_CONFIG 0x52
#define SNDRV_GF1_GB_MEMORY_CONTROL 0x53
#define SNDRV_GF1_GW_FIFO_RECORD_BASE_ADDR 0x54
#define SNDRV_GF1_GW_FIFO_PLAY_BASE_ADDR 0x55
#define SNDRV_GF1_GW_FIFO_PLAY_BASE_ADDR 0x55
#define SNDRV_GF1_GW_FIFO_SIZE 0x56
#define SNDRV_GF1_GW_INTERLEAVE 0x57
#define SNDRV_GF1_GB_COMPATIBILITY 0x59
@ -100,39 +100,39 @@
#define SNDRV_GF1_VA_START SNDRV_GF1_VW_START_HIGH
#define SNDRV_GF1_VW_END_HIGH 0x04
#define SNDRV_GF1_VW_END_LOW 0x05
#define SNDRV_GF1_VA_END SNDRV_GF1_VW_END_HIGH
#define SNDRV_GF1_VB_VOLUME_RATE 0x06
#define SNDRV_GF1_VB_VOLUME_START 0x07
#define SNDRV_GF1_VA_END SNDRV_GF1_VW_END_HIGH
#define SNDRV_GF1_VB_VOLUME_RATE 0x06
#define SNDRV_GF1_VB_VOLUME_START 0x07
#define SNDRV_GF1_VB_VOLUME_END 0x08
#define SNDRV_GF1_VW_VOLUME 0x09
#define SNDRV_GF1_VW_CURRENT_HIGH 0x0a
#define SNDRV_GF1_VW_CURRENT_LOW 0x0b
#define SNDRV_GF1_VW_CURRENT_HIGH 0x0a
#define SNDRV_GF1_VW_CURRENT_LOW 0x0b
#define SNDRV_GF1_VA_CURRENT SNDRV_GF1_VW_CURRENT_HIGH
#define SNDRV_GF1_VB_PAN 0x0c
#define SNDRV_GF1_VW_OFFSET_RIGHT 0x0c
#define SNDRV_GF1_VB_PAN 0x0c
#define SNDRV_GF1_VW_OFFSET_RIGHT 0x0c
#define SNDRV_GF1_VB_VOLUME_CONTROL 0x0d
#define SNDRV_GF1_VB_UPPER_ADDRESS 0x10
#define SNDRV_GF1_VW_EFFECT_HIGH 0x11
#define SNDRV_GF1_VW_EFFECT_HIGH 0x11
#define SNDRV_GF1_VW_EFFECT_LOW 0x12
#define SNDRV_GF1_VA_EFFECT SNDRV_GF1_VW_EFFECT_HIGH
#define SNDRV_GF1_VW_OFFSET_LEFT 0x13
#define SNDRV_GF1_VB_ACCUMULATOR 0x14
#define SNDRV_GF1_VB_MODE 0x15
#define SNDRV_GF1_VW_OFFSET_LEFT 0x13
#define SNDRV_GF1_VB_ACCUMULATOR 0x14
#define SNDRV_GF1_VB_MODE 0x15
#define SNDRV_GF1_VW_EFFECT_VOLUME 0x16
#define SNDRV_GF1_VB_FREQUENCY_LFO 0x17
#define SNDRV_GF1_VB_VOLUME_LFO 0x18
#define SNDRV_GF1_VW_OFFSET_RIGHT_FINAL 0x1b
#define SNDRV_GF1_VW_OFFSET_LEFT_FINAL 0x1c
#define SNDRV_GF1_VW_EFFECT_VOLUME_FINAL 0x1d
#define SNDRV_GF1_VW_EFFECT_VOLUME_FINAL 0x1d
/* ICS registers */
#define SNDRV_ICS_MIC_DEV 0
#define SNDRV_ICS_LINE_DEV 1
#define SNDRV_ICS_LINE_DEV 1
#define SNDRV_ICS_CD_DEV 2
#define SNDRV_ICS_GF1_DEV 3
#define SNDRV_ICS_NONE_DEV 4
#define SNDRV_ICS_MASTER_DEV 5
#define SNDRV_ICS_NONE_DEV 4
#define SNDRV_ICS_MASTER_DEV 5
/* LFO */
@ -143,7 +143,7 @@
#define SNDRV_GF1_DMA_UNSIGNED 0x80
#define SNDRV_GF1_DMA_16BIT 0x40
#define SNDRV_GF1_DMA_IRQ 0x20
#define SNDRV_GF1_DMA_IRQ 0x20
#define SNDRV_GF1_DMA_WIDTH16 0x04
#define SNDRV_GF1_DMA_READ 0x02 /* read from GUS's DRAM */
#define SNDRV_GF1_DMA_ENABLE 0x01
@ -159,7 +159,7 @@
/* defines for memory manager */
#define SNDRV_GF1_MEM_BLOCK_16BIT 0x0001
#define SNDRV_GF1_MEM_BLOCK_16BIT 0x0001
#define SNDRV_GF1_MEM_OWNER_DRIVER 0x0001
#define SNDRV_GF1_MEM_OWNER_WAVE_SIMPLE 0x0002
@ -169,9 +169,9 @@
/* constants for interrupt handlers */
#define SNDRV_GF1_HANDLER_MIDI_OUT 0x00010000
#define SNDRV_GF1_HANDLER_MIDI_IN 0x00020000
#define SNDRV_GF1_HANDLER_TIMER1 0x00040000
#define SNDRV_GF1_HANDLER_TIMER2 0x00080000
#define SNDRV_GF1_HANDLER_MIDI_IN 0x00020000
#define SNDRV_GF1_HANDLER_TIMER1 0x00040000
#define SNDRV_GF1_HANDLER_TIMER2 0x00080000
#define SNDRV_GF1_HANDLER_VOICE 0x00100000
#define SNDRV_GF1_HANDLER_DMA_WRITE 0x00200000
#define SNDRV_GF1_HANDLER_DMA_READ 0x00400000
@ -183,17 +183,16 @@
/* --- */
struct _snd_gus_card;
typedef struct _snd_gus_card snd_gus_card_t;
struct snd_gus_card;
/* GF1 specific structure */
typedef struct _snd_gf1_bank_info {
struct snd_gf1_bank_info {
unsigned int address;
unsigned int size;
} snd_gf1_bank_info_t;
};
typedef struct _snd_gf1_mem_block {
struct snd_gf1_mem_block {
unsigned short flags; /* flags - SNDRV_GF1_MEM_BLOCK_XXXX */
unsigned short owner; /* owner - SNDRV_GF1_MEM_OWNER_XXXX */
unsigned int share; /* share count */
@ -201,68 +200,68 @@ typedef struct _snd_gf1_mem_block {
unsigned int ptr;
unsigned int size;
char *name;
struct _snd_gf1_mem_block *next;
struct _snd_gf1_mem_block *prev;
} snd_gf1_mem_block_t;
struct snd_gf1_mem_block *next;
struct snd_gf1_mem_block *prev;
};
typedef struct _snd_gf1_mem {
snd_gf1_bank_info_t banks_8[4];
snd_gf1_bank_info_t banks_16[4];
snd_gf1_mem_block_t *first;
snd_gf1_mem_block_t *last;
struct snd_gf1_mem {
struct snd_gf1_bank_info banks_8[4];
struct snd_gf1_bank_info banks_16[4];
struct snd_gf1_mem_block *first;
struct snd_gf1_mem_block *last;
struct semaphore memory_mutex;
} snd_gf1_mem_t;
};
typedef struct snd_gf1_dma_block {
struct snd_gf1_dma_block {
void *buffer; /* buffer in computer's RAM */
unsigned long buf_addr; /* buffer address */
unsigned int addr; /* address in onboard memory */
unsigned int count; /* count in bytes */
unsigned int cmd; /* DMA command (format) */
void (*ack)(snd_gus_card_t * gus, void *private_data);
void (*ack)(struct snd_gus_card * gus, void *private_data);
void *private_data;
struct snd_gf1_dma_block *next;
} snd_gf1_dma_block_t;
};
typedef struct {
snd_midi_channel_set_t * chset;
snd_gus_card_t * gus;
struct snd_gus_port {
struct snd_midi_channel_set * chset;
struct snd_gus_card * gus;
int mode; /* operation mode */
int client; /* sequencer client number */
int port; /* sequencer port number */
unsigned int midi_has_voices: 1;
} snd_gus_port_t;
};
typedef struct _snd_gus_voice snd_gus_voice_t;
struct snd_gus_voice;
typedef struct {
void (*sample_start)(snd_gus_card_t *gus, snd_gus_voice_t *voice, snd_seq_position_t position);
void (*sample_stop)(snd_gus_card_t *gus, snd_gus_voice_t *voice, snd_seq_stop_mode_t mode);
void (*sample_freq)(snd_gus_card_t *gus, snd_gus_voice_t *voice, snd_seq_frequency_t freq);
void (*sample_volume)(snd_gus_card_t *gus, snd_gus_voice_t *voice, snd_seq_ev_volume_t *volume);
void (*sample_loop)(snd_gus_card_t *card, snd_gus_voice_t *voice, snd_seq_ev_loop_t *loop);
void (*sample_pos)(snd_gus_card_t *card, snd_gus_voice_t *voice, snd_seq_position_t position);
void (*sample_private1)(snd_gus_card_t *card, snd_gus_voice_t *voice, unsigned char *data);
} snd_gus_sample_ops_t;
struct snd_gus_sample_ops {
void (*sample_start)(struct snd_gus_card *gus, struct snd_gus_voice *voice, snd_seq_position_t position);
void (*sample_stop)(struct snd_gus_card *gus, struct snd_gus_voice *voice, int mode);
void (*sample_freq)(struct snd_gus_card *gus, struct snd_gus_voice *voice, snd_seq_frequency_t freq);
void (*sample_volume)(struct snd_gus_card *gus, struct snd_gus_voice *voice, struct snd_seq_ev_volume *volume);
void (*sample_loop)(struct snd_gus_card *card, struct snd_gus_voice *voice, struct snd_seq_ev_loop *loop);
void (*sample_pos)(struct snd_gus_card *card, struct snd_gus_voice *voice, snd_seq_position_t position);
void (*sample_private1)(struct snd_gus_card *card, struct snd_gus_voice *voice, unsigned char *data);
};
#define SNDRV_GF1_VOICE_TYPE_PCM 0
#define SNDRV_GF1_VOICE_TYPE_PCM 0
#define SNDRV_GF1_VOICE_TYPE_SYNTH 1
#define SNDRV_GF1_VOICE_TYPE_MIDI 2
#define SNDRV_GF1_VOICE_TYPE_MIDI 2
#define SNDRV_GF1_VFLG_RUNNING (1<<0)
#define SNDRV_GF1_VFLG_EFFECT_TIMER1 (1<<1)
#define SNDRV_GF1_VFLG_PAN (1<<2)
typedef enum {
enum snd_gus_volume_state {
VENV_BEFORE,
VENV_ATTACK,
VENV_SUSTAIN,
VENV_RELEASE,
VENV_DONE,
VENV_VOLUME
} snd_gus_volume_state_t;
};
struct _snd_gus_voice {
struct snd_gus_voice {
int number;
unsigned int use: 1,
pcm: 1,
@ -278,18 +277,18 @@ struct _snd_gus_voice {
unsigned int interrupt_stat_wave;
unsigned int interrupt_stat_volume;
#endif
void (*handler_wave) (snd_gus_card_t * gus, snd_gus_voice_t * voice);
void (*handler_volume) (snd_gus_card_t * gus, snd_gus_voice_t * voice);
void (*handler_effect) (snd_gus_card_t * gus, snd_gus_voice_t * voice);
void (*volume_change) (snd_gus_card_t * gus);
void (*handler_wave) (struct snd_gus_card * gus, struct snd_gus_voice * voice);
void (*handler_volume) (struct snd_gus_card * gus, struct snd_gus_voice * voice);
void (*handler_effect) (struct snd_gus_card * gus, struct snd_gus_voice * voice);
void (*volume_change) (struct snd_gus_card * gus);
snd_gus_sample_ops_t *sample_ops;
struct snd_gus_sample_ops *sample_ops;
snd_seq_instr_t instr;
struct snd_seq_instr instr;
/* running status / registers */
snd_seq_ev_volume_t sample_volume;
struct snd_seq_ev_volume sample_volume;
unsigned short fc_register;
unsigned short fc_lfo;
@ -300,8 +299,8 @@ struct _snd_gus_voice {
unsigned char effect_accumulator;
unsigned char volume_control;
unsigned char venv_value_next;
snd_gus_volume_state_t venv_state;
snd_gus_volume_state_t venv_state_prev;
enum snd_gus_volume_state venv_state;
enum snd_gus_volume_state venv_state_prev;
unsigned short vlo;
unsigned short vro;
unsigned short gf1_effect_volume;
@ -309,10 +308,10 @@ struct _snd_gus_voice {
/* --- */
void *private_data;
void (*private_free)(snd_gus_voice_t *voice);
void (*private_free)(struct snd_gus_voice *voice);
};
struct _snd_gf1 {
struct snd_gf1 {
unsigned int enh_mode:1, /* enhanced mode (GFA1) */
hw_lfo:1, /* use hardware LFO */
@ -330,7 +329,7 @@ struct _snd_gf1 {
unsigned int rom_present; /* bitmask */
unsigned int rom_banks; /* GUS's ROM banks */
snd_gf1_mem_t mem_alloc;
struct snd_gf1_mem mem_alloc;
/* registers */
unsigned short reg_page;
@ -347,7 +346,7 @@ struct _snd_gf1 {
unsigned char active_voices; /* active voices */
unsigned char active_voice; /* selected voice (GF1PAGE register) */
snd_gus_voice_t voices[32]; /* GF1 voices */
struct snd_gus_voice voices[32]; /* GF1 voices */
unsigned int default_voice_address;
@ -362,12 +361,12 @@ struct _snd_gf1 {
/* interrupt handlers */
void (*interrupt_handler_midi_out) (snd_gus_card_t * gus);
void (*interrupt_handler_midi_in) (snd_gus_card_t * gus);
void (*interrupt_handler_timer1) (snd_gus_card_t * gus);
void (*interrupt_handler_timer2) (snd_gus_card_t * gus);
void (*interrupt_handler_dma_write) (snd_gus_card_t * gus);
void (*interrupt_handler_dma_read) (snd_gus_card_t * gus);
void (*interrupt_handler_midi_out) (struct snd_gus_card * gus);
void (*interrupt_handler_midi_in) (struct snd_gus_card * gus);
void (*interrupt_handler_timer1) (struct snd_gus_card * gus);
void (*interrupt_handler_timer2) (struct snd_gus_card * gus);
void (*interrupt_handler_dma_write) (struct snd_gus_card * gus);
void (*interrupt_handler_dma_read) (struct snd_gus_card * gus);
#ifdef CONFIG_SND_DEBUG
unsigned int interrupt_stat_midi_out;
@ -382,17 +381,17 @@ struct _snd_gf1 {
/* synthesizer */
int seq_client;
snd_gus_port_t seq_ports[4];
snd_seq_kinstr_list_t *ilist;
snd_iwffff_ops_t iwffff_ops;
snd_gf1_ops_t gf1_ops;
snd_simple_ops_t simple_ops;
struct snd_gus_port seq_ports[4];
struct snd_seq_kinstr_list *ilist;
struct snd_iwffff_ops iwffff_ops;
struct snd_gf1_ops gf1_ops;
struct snd_simple_ops simple_ops;
/* timer */
unsigned short timer_enabled;
snd_timer_t *timer1;
snd_timer_t *timer2;
struct snd_timer *timer1;
struct snd_timer *timer2;
/* midi */
@ -404,11 +403,11 @@ struct _snd_gf1 {
unsigned int dma_flags;
unsigned int dma_shared;
snd_gf1_dma_block_t *dma_data_pcm;
snd_gf1_dma_block_t *dma_data_pcm_last;
snd_gf1_dma_block_t *dma_data_synth;
snd_gf1_dma_block_t *dma_data_synth_last;
void (*dma_ack)(snd_gus_card_t * gus, void *private_data);
struct snd_gf1_dma_block *dma_data_pcm;
struct snd_gf1_dma_block *dma_data_pcm_last;
struct snd_gf1_dma_block *dma_data_synth;
struct snd_gf1_dma_block *dma_data_synth_last;
void (*dma_ack)(struct snd_gus_card * gus, void *private_data);
void *dma_private_data;
/* pcm */
@ -425,8 +424,8 @@ struct _snd_gf1 {
/* main structure for GUS card */
struct _snd_gus_card {
snd_card_t *card;
struct snd_gus_card {
struct snd_card *card;
unsigned int
initialized: 1, /* resources were initialized */
@ -448,18 +447,18 @@ struct _snd_gus_card {
unsigned short joystick_dac; /* joystick DAC level */
int timer_dev; /* timer device */
struct _snd_gf1 gf1; /* gf1 specific variables */
snd_pcm_t *pcm;
snd_pcm_substream_t *pcm_cap_substream;
struct snd_gf1 gf1; /* gf1 specific variables */
struct snd_pcm *pcm;
struct snd_pcm_substream *pcm_cap_substream;
unsigned int c_dma_size;
unsigned int c_period_size;
unsigned int c_pos;
snd_rawmidi_t *midi_uart;
snd_rawmidi_substream_t *midi_substream_output;
snd_rawmidi_substream_t *midi_substream_input;
struct snd_rawmidi *midi_uart;
struct snd_rawmidi_substream *midi_substream_output;
struct snd_rawmidi_substream *midi_substream_input;
snd_seq_device_t *seq_dev;
struct snd_seq_device *seq_dev;
spinlock_t reg_lock;
spinlock_t voice_alloc;
@ -474,7 +473,7 @@ struct _snd_gus_card {
/* I/O functions for GF1/InterWave chip - gus_io.c */
static inline void snd_gf1_select_voice(snd_gus_card_t * gus, int voice)
static inline void snd_gf1_select_voice(struct snd_gus_card * gus, int voice)
{
unsigned long flags;
@ -486,63 +485,63 @@ static inline void snd_gf1_select_voice(snd_gus_card_t * gus, int voice)
spin_unlock_irqrestore(&gus->active_voice_lock, flags);
}
static inline void snd_gf1_uart_cmd(snd_gus_card_t * gus, unsigned char b)
static inline void snd_gf1_uart_cmd(struct snd_gus_card * gus, unsigned char b)
{
outb(gus->gf1.uart_cmd = b, GUSP(gus, MIDICTRL));
}
static inline unsigned char snd_gf1_uart_stat(snd_gus_card_t * gus)
static inline unsigned char snd_gf1_uart_stat(struct snd_gus_card * gus)
{
return inb(GUSP(gus, MIDISTAT));
}
static inline void snd_gf1_uart_put(snd_gus_card_t * gus, unsigned char b)
static inline void snd_gf1_uart_put(struct snd_gus_card * gus, unsigned char b)
{
outb(b, GUSP(gus, MIDIDATA));
}
static inline unsigned char snd_gf1_uart_get(snd_gus_card_t * gus)
static inline unsigned char snd_gf1_uart_get(struct snd_gus_card * gus)
{
return inb(GUSP(gus, MIDIDATA));
}
extern void snd_gf1_delay(snd_gus_card_t * gus);
extern void snd_gf1_delay(struct snd_gus_card * gus);
extern void snd_gf1_ctrl_stop(snd_gus_card_t * gus, unsigned char reg);
extern void snd_gf1_ctrl_stop(struct snd_gus_card * gus, unsigned char reg);
extern void snd_gf1_write8(snd_gus_card_t * gus, unsigned char reg, unsigned char data);
extern unsigned char snd_gf1_look8(snd_gus_card_t * gus, unsigned char reg);
static inline unsigned char snd_gf1_read8(snd_gus_card_t * gus, unsigned char reg)
extern void snd_gf1_write8(struct snd_gus_card * gus, unsigned char reg, unsigned char data);
extern unsigned char snd_gf1_look8(struct snd_gus_card * gus, unsigned char reg);
static inline unsigned char snd_gf1_read8(struct snd_gus_card * gus, unsigned char reg)
{
return snd_gf1_look8(gus, reg | 0x80);
}
extern void snd_gf1_write16(snd_gus_card_t * gus, unsigned char reg, unsigned int data);
extern unsigned short snd_gf1_look16(snd_gus_card_t * gus, unsigned char reg);
static inline unsigned short snd_gf1_read16(snd_gus_card_t * gus, unsigned char reg)
extern void snd_gf1_write16(struct snd_gus_card * gus, unsigned char reg, unsigned int data);
extern unsigned short snd_gf1_look16(struct snd_gus_card * gus, unsigned char reg);
static inline unsigned short snd_gf1_read16(struct snd_gus_card * gus, unsigned char reg)
{
return snd_gf1_look16(gus, reg | 0x80);
}
extern void snd_gf1_adlib_write(snd_gus_card_t * gus, unsigned char reg, unsigned char data);
extern void snd_gf1_dram_addr(snd_gus_card_t * gus, unsigned int addr);
extern void snd_gf1_poke(snd_gus_card_t * gus, unsigned int addr, unsigned char data);
extern unsigned char snd_gf1_peek(snd_gus_card_t * gus, unsigned int addr);
extern void snd_gf1_write_addr(snd_gus_card_t * gus, unsigned char reg, unsigned int addr, short w_16bit);
extern unsigned int snd_gf1_read_addr(snd_gus_card_t * gus, unsigned char reg, short w_16bit);
extern void snd_gf1_i_ctrl_stop(snd_gus_card_t * gus, unsigned char reg);
extern void snd_gf1_i_write8(snd_gus_card_t * gus, unsigned char reg, unsigned char data);
extern unsigned char snd_gf1_i_look8(snd_gus_card_t * gus, unsigned char reg);
extern void snd_gf1_i_write16(snd_gus_card_t * gus, unsigned char reg, unsigned int data);
static inline unsigned char snd_gf1_i_read8(snd_gus_card_t * gus, unsigned char reg)
extern void snd_gf1_adlib_write(struct snd_gus_card * gus, unsigned char reg, unsigned char data);
extern void snd_gf1_dram_addr(struct snd_gus_card * gus, unsigned int addr);
extern void snd_gf1_poke(struct snd_gus_card * gus, unsigned int addr, unsigned char data);
extern unsigned char snd_gf1_peek(struct snd_gus_card * gus, unsigned int addr);
extern void snd_gf1_write_addr(struct snd_gus_card * gus, unsigned char reg, unsigned int addr, short w_16bit);
extern unsigned int snd_gf1_read_addr(struct snd_gus_card * gus, unsigned char reg, short w_16bit);
extern void snd_gf1_i_ctrl_stop(struct snd_gus_card * gus, unsigned char reg);
extern void snd_gf1_i_write8(struct snd_gus_card * gus, unsigned char reg, unsigned char data);
extern unsigned char snd_gf1_i_look8(struct snd_gus_card * gus, unsigned char reg);
extern void snd_gf1_i_write16(struct snd_gus_card * gus, unsigned char reg, unsigned int data);
static inline unsigned char snd_gf1_i_read8(struct snd_gus_card * gus, unsigned char reg)
{
return snd_gf1_i_look8(gus, reg | 0x80);
}
extern unsigned short snd_gf1_i_look16(snd_gus_card_t * gus, unsigned char reg);
static inline unsigned short snd_gf1_i_read16(snd_gus_card_t * gus, unsigned char reg)
extern unsigned short snd_gf1_i_look16(struct snd_gus_card * gus, unsigned char reg);
static inline unsigned short snd_gf1_i_read16(struct snd_gus_card * gus, unsigned char reg)
{
return snd_gf1_i_look16(gus, reg | 0x80);
}
extern void snd_gf1_select_active_voices(snd_gus_card_t * gus);
extern void snd_gf1_select_active_voices(struct snd_gus_card * gus);
/* gus_lfo.c */
@ -555,98 +554,98 @@ struct _SND_IW_LFO_PROGRAM {
};
#if 0
extern irqreturn_t snd_gf1_lfo_effect_interrupt(snd_gus_card_t * gus, snd_gf1_voice_t * voice);
extern irqreturn_t snd_gf1_lfo_effect_interrupt(struct snd_gus_card * gus, snd_gf1_voice_t * voice);
#endif
extern void snd_gf1_lfo_init(snd_gus_card_t * gus);
extern void snd_gf1_lfo_done(snd_gus_card_t * gus);
extern void snd_gf1_lfo_program(snd_gus_card_t * gus, int voice, int lfo_type, struct _SND_IW_LFO_PROGRAM *program);
extern void snd_gf1_lfo_enable(snd_gus_card_t * gus, int voice, int lfo_type);
extern void snd_gf1_lfo_disable(snd_gus_card_t * gus, int voice, int lfo_type);
extern void snd_gf1_lfo_change_freq(snd_gus_card_t * gus, int voice, int lfo_type, int freq);
extern void snd_gf1_lfo_change_depth(snd_gus_card_t * gus, int voice, int lfo_type, int depth);
extern void snd_gf1_lfo_setup(snd_gus_card_t * gus, int voice, int lfo_type, int freq, int current_depth, int depth, int sweep, int shape);
extern void snd_gf1_lfo_shutdown(snd_gus_card_t * gus, int voice, int lfo_type);
extern void snd_gf1_lfo_init(struct snd_gus_card * gus);
extern void snd_gf1_lfo_done(struct snd_gus_card * gus);
extern void snd_gf1_lfo_program(struct snd_gus_card * gus, int voice, int lfo_type, struct _SND_IW_LFO_PROGRAM *program);
extern void snd_gf1_lfo_enable(struct snd_gus_card * gus, int voice, int lfo_type);
extern void snd_gf1_lfo_disable(struct snd_gus_card * gus, int voice, int lfo_type);
extern void snd_gf1_lfo_change_freq(struct snd_gus_card * gus, int voice, int lfo_type, int freq);
extern void snd_gf1_lfo_change_depth(struct snd_gus_card * gus, int voice, int lfo_type, int depth);
extern void snd_gf1_lfo_setup(struct snd_gus_card * gus, int voice, int lfo_type, int freq, int current_depth, int depth, int sweep, int shape);
extern void snd_gf1_lfo_shutdown(struct snd_gus_card * gus, int voice, int lfo_type);
#if 0
extern void snd_gf1_lfo_command(snd_gus_card_t * gus, int voice, unsigned char *command);
extern void snd_gf1_lfo_command(struct snd_gus_card * gus, int voice, unsigned char *command);
#endif
/* gus_mem.c */
void snd_gf1_mem_lock(snd_gf1_mem_t * alloc, int xup);
int snd_gf1_mem_xfree(snd_gf1_mem_t * alloc, snd_gf1_mem_block_t * block);
snd_gf1_mem_block_t *snd_gf1_mem_alloc(snd_gf1_mem_t * alloc, int owner,
void snd_gf1_mem_lock(struct snd_gf1_mem * alloc, int xup);
int snd_gf1_mem_xfree(struct snd_gf1_mem * alloc, struct snd_gf1_mem_block * block);
struct snd_gf1_mem_block *snd_gf1_mem_alloc(struct snd_gf1_mem * alloc, int owner,
char *name, int size, int w_16,
int align, unsigned int *share_id);
int snd_gf1_mem_free(snd_gf1_mem_t * alloc, unsigned int address);
int snd_gf1_mem_free_owner(snd_gf1_mem_t * alloc, int owner);
int snd_gf1_mem_init(snd_gus_card_t * gus);
int snd_gf1_mem_done(snd_gus_card_t * gus);
int snd_gf1_mem_free(struct snd_gf1_mem * alloc, unsigned int address);
int snd_gf1_mem_free_owner(struct snd_gf1_mem * alloc, int owner);
int snd_gf1_mem_init(struct snd_gus_card * gus);
int snd_gf1_mem_done(struct snd_gus_card * gus);
/* gus_mem_proc.c */
int snd_gf1_mem_proc_init(snd_gus_card_t * gus);
int snd_gf1_mem_proc_init(struct snd_gus_card * gus);
/* gus_dma.c */
int snd_gf1_dma_init(snd_gus_card_t * gus);
int snd_gf1_dma_done(snd_gus_card_t * gus);
int snd_gf1_dma_transfer_block(snd_gus_card_t * gus,
snd_gf1_dma_block_t * block,
int snd_gf1_dma_init(struct snd_gus_card * gus);
int snd_gf1_dma_done(struct snd_gus_card * gus);
int snd_gf1_dma_transfer_block(struct snd_gus_card * gus,
struct snd_gf1_dma_block * block,
int atomic,
int synth);
/* gus_volume.c */
unsigned short snd_gf1_lvol_to_gvol_raw(unsigned int vol);
unsigned short snd_gf1_translate_freq(snd_gus_card_t * gus, unsigned int freq2);
unsigned short snd_gf1_translate_freq(struct snd_gus_card * gus, unsigned int freq2);
/* gus_reset.c */
void snd_gf1_set_default_handlers(snd_gus_card_t * gus, unsigned int what);
void snd_gf1_smart_stop_voice(snd_gus_card_t * gus, unsigned short voice);
void snd_gf1_stop_voice(snd_gus_card_t * gus, unsigned short voice);
void snd_gf1_stop_voices(snd_gus_card_t * gus, unsigned short v_min, unsigned short v_max);
snd_gus_voice_t *snd_gf1_alloc_voice(snd_gus_card_t * gus, int type, int client, int port);
void snd_gf1_free_voice(snd_gus_card_t * gus, snd_gus_voice_t *voice);
int snd_gf1_start(snd_gus_card_t * gus);
int snd_gf1_stop(snd_gus_card_t * gus);
void snd_gf1_set_default_handlers(struct snd_gus_card * gus, unsigned int what);
void snd_gf1_smart_stop_voice(struct snd_gus_card * gus, unsigned short voice);
void snd_gf1_stop_voice(struct snd_gus_card * gus, unsigned short voice);
void snd_gf1_stop_voices(struct snd_gus_card * gus, unsigned short v_min, unsigned short v_max);
struct snd_gus_voice *snd_gf1_alloc_voice(struct snd_gus_card * gus, int type, int client, int port);
void snd_gf1_free_voice(struct snd_gus_card * gus, struct snd_gus_voice *voice);
int snd_gf1_start(struct snd_gus_card * gus);
int snd_gf1_stop(struct snd_gus_card * gus);
/* gus_mixer.c */
int snd_gf1_new_mixer(snd_gus_card_t * gus);
int snd_gf1_new_mixer(struct snd_gus_card * gus);
/* gus_pcm.c */
int snd_gf1_pcm_new(snd_gus_card_t * gus, int pcm_dev, int control_index, snd_pcm_t ** rpcm);
int snd_gf1_pcm_new(struct snd_gus_card * gus, int pcm_dev, int control_index, struct snd_pcm ** rpcm);
#ifdef CONFIG_SND_DEBUG
extern void snd_gf1_print_voice_registers(snd_gus_card_t * gus);
extern void snd_gf1_print_voice_registers(struct snd_gus_card * gus);
#endif
/* gus.c */
int snd_gus_use_inc(snd_gus_card_t * gus);
void snd_gus_use_dec(snd_gus_card_t * gus);
int snd_gus_create(snd_card_t * card,
int snd_gus_use_inc(struct snd_gus_card * gus);
void snd_gus_use_dec(struct snd_gus_card * gus);
int snd_gus_create(struct snd_card *card,
unsigned long port,
int irq, int dma1, int dma2,
int timer_dev,
int voices,
int pcm_channels,
int effect,
snd_gus_card_t ** rgus);
int snd_gus_initialize(snd_gus_card_t * gus);
struct snd_gus_card ** rgus);
int snd_gus_initialize(struct snd_gus_card * gus);
/* gus_irq.c */
irqreturn_t snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs);
#ifdef CONFIG_SND_DEBUG
void snd_gus_irq_profile_init(snd_gus_card_t *gus);
void snd_gus_irq_profile_init(struct snd_gus_card *gus);
#endif
/* gus_uart.c */
int snd_gf1_rawmidi_new(snd_gus_card_t * gus, int device, snd_rawmidi_t **rrawmidi);
int snd_gf1_rawmidi_new(struct snd_gus_card * gus, int device, struct snd_rawmidi **rrawmidi);
#if 0
extern void snd_engine_instrument_register(unsigned short mode,
@ -657,37 +656,37 @@ extern int snd_engine_instrument_register_ask(unsigned short mode);
#endif
/* gus_dram.c */
int snd_gus_dram_write(snd_gus_card_t *gus, char __user *ptr,
int snd_gus_dram_write(struct snd_gus_card *gus, char __user *ptr,
unsigned int addr, unsigned int size);
int snd_gus_dram_read(snd_gus_card_t *gus, char __user *ptr,
int snd_gus_dram_read(struct snd_gus_card *gus, char __user *ptr,
unsigned int addr, unsigned int size, int rom);
#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
/* gus_sample.c */
void snd_gus_sample_event(snd_seq_event_t *ev, snd_gus_port_t *p);
void snd_gus_sample_event(struct snd_seq_event *ev, struct snd_gus_port *p);
/* gus_simple.c */
void snd_gf1_simple_init(snd_gus_voice_t *voice);
void snd_gf1_simple_init(struct snd_gus_voice *voice);
/* gus_instr.c */
int snd_gus_iwffff_put_sample(void *private_data, iwffff_wave_t *wave,
int snd_gus_iwffff_put_sample(void *private_data, struct iwffff_wave *wave,
char __user *data, long len, int atomic);
int snd_gus_iwffff_get_sample(void *private_data, iwffff_wave_t *wave,
int snd_gus_iwffff_get_sample(void *private_data, struct iwffff_wave *wave,
char __user *data, long len, int atomic);
int snd_gus_iwffff_remove_sample(void *private_data, iwffff_wave_t *wave,
int snd_gus_iwffff_remove_sample(void *private_data, struct iwffff_wave *wave,
int atomic);
int snd_gus_gf1_put_sample(void *private_data, gf1_wave_t *wave,
int snd_gus_gf1_put_sample(void *private_data, struct gf1_wave *wave,
char __user *data, long len, int atomic);
int snd_gus_gf1_get_sample(void *private_data, gf1_wave_t *wave,
int snd_gus_gf1_get_sample(void *private_data, struct gf1_wave *wave,
char __user *data, long len, int atomic);
int snd_gus_gf1_remove_sample(void *private_data, gf1_wave_t *wave,
int snd_gus_gf1_remove_sample(void *private_data, struct gf1_wave *wave,
int atomic);
int snd_gus_simple_put_sample(void *private_data, simple_instrument_t *instr,
int snd_gus_simple_put_sample(void *private_data, struct simple_instrument *instr,
char __user *data, long len, int atomic);
int snd_gus_simple_get_sample(void *private_data, simple_instrument_t *instr,
int snd_gus_simple_get_sample(void *private_data, struct simple_instrument *instr,
char __user *data, long len, int atomic);
int snd_gus_simple_remove_sample(void *private_data, simple_instrument_t *instr,
int snd_gus_simple_remove_sample(void *private_data, struct simple_instrument *instr,
int atomic);
#endif /* CONFIG_SND_SEQUENCER */

View File

@ -21,17 +21,15 @@
#define HDSP_MATRIX_MIXER_SIZE 2048
typedef enum {
enum HDSP_IO_Type {
Digiface,
Multiface,
H9652,
H9632,
Undefined,
} HDSP_IO_Type;
};
typedef struct _snd_hdsp_peak_rms hdsp_peak_rms_t;
struct _snd_hdsp_peak_rms {
struct hdsp_peak_rms {
u32 input_peaks[26];
u32 playback_peaks[26];
u32 output_peaks[28];
@ -41,11 +39,9 @@ struct _snd_hdsp_peak_rms {
u64 output_rms[26];
};
#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, hdsp_peak_rms_t)
#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdsp_peak_rms)
typedef struct _snd_hdsp_config_info hdsp_config_info_t;
struct _snd_hdsp_config_info {
struct hdsp_config_info {
unsigned char pref_sync_ref;
unsigned char wordclock_sync_check;
unsigned char spdif_sync_check;
@ -71,40 +67,41 @@ struct _snd_hdsp_config_info {
unsigned char analog_extension_board;
};
#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, hdsp_config_info_t)
#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdsp_config_info)
typedef struct _snd_hdsp_firmware hdsp_firmware_t;
struct _snd_hdsp_firmware {
struct hdsp_firmware {
void __user *firmware_data; /* 24413 x 4 bytes */
};
#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, hdsp_firmware_t)
#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, struct hdsp_firmware)
typedef struct _snd_hdsp_version hdsp_version_t;
struct _snd_hdsp_version {
HDSP_IO_Type io_type;
struct hdsp_version {
enum HDSP_IO_Type io_type;
unsigned short firmware_rev;
};
#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, hdsp_version_t)
#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdsp_version)
typedef struct _snd_hdsp_mixer hdsp_mixer_t;
struct _snd_hdsp_mixer {
struct hdsp_mixer {
unsigned short matrix[HDSP_MATRIX_MIXER_SIZE];
};
#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, hdsp_mixer_t)
#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdsp_mixer)
typedef struct _snd_hdsp_9632_aeb hdsp_9632_aeb_t;
struct _snd_hdsp_9632_aeb {
struct hdsp_9632_aeb {
int aebi;
int aebo;
};
#define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, hdsp_9632_aeb_t)
#define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb)
/* typedefs for compatibility to user-space */
typedef enum HDSP_IO_Type HDSP_IO_Type;
typedef struct hdsp_peak_rms hdsp_peak_rms_t;
typedef struct hdsp_config_info hdsp_config_info_t;
typedef struct hdsp_firmware hdsp_firmware_t;
typedef struct hdsp_version hdsp_version_t;
typedef struct hdsp_mixer hdsp_mixer_t;
typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
#endif /* __SOUND_HDSP_H */

View File

@ -25,8 +25,6 @@
/* -------------------- IOCTL Peak/RMS Meters -------------------- */
typedef struct _snd_hdspm_peak_rms hdspm_peak_rms_t;
/* peam rms level structure like we get from hardware
maybe in future we can memory map it so I just copy it
@ -36,7 +34,7 @@ typedef struct _snd_hdspm_peak_rms hdspm_peak_rms_t;
(i asume so from the code)
*/
struct _snd_hdspm_peak_rms {
struct hdspm_peak_rms {
unsigned int level_offset[1024];
@ -58,18 +56,16 @@ struct _snd_hdspm_peak_rms {
unsigned int xxx_rms_h[64]; /* not used */
};
struct sndrv_hdspm_peak_rms_ioctl {
hdspm_peak_rms_t *peak;
struct hdspm_peak_rms_ioctl {
struct hdspm_peak_rms *peak;
};
/* use indirect access due to the limit of ioctl bit size */
#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct sndrv_hdspm_peak_rms_ioctl)
#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdspm_peak_rms_ioctl)
/* ------------ CONFIG block IOCTL ---------------------- */
typedef struct _snd_hdspm_config_info hdspm_config_info_t;
struct _snd_hdspm_config_info {
struct hdspm_config_info {
unsigned char pref_sync_ref;
unsigned char wordclock_sync_check;
unsigned char madi_sync_check;
@ -83,18 +79,16 @@ struct _snd_hdspm_config_info {
unsigned int analog_out;
};
#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, hdspm_config_info_t)
#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdspm_config_info)
/* get Soundcard Version */
typedef struct _snd_hdspm_version hdspm_version_t;
struct _snd_hdspm_version {
struct hdspm_version {
unsigned short firmware_rev;
};
#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x43, hdspm_version_t)
#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdspm_version)
/* ------------- get Matrix Mixer IOCTL --------------- */
@ -108,24 +102,27 @@ struct _snd_hdspm_version {
#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
typedef struct _snd_hdspm_channelfader snd_hdspm_channelfader_t;
struct _snd_hdspm_channelfader {
struct hdspm_channelfader {
unsigned int in[HDSPM_MIXER_CHANNELS];
unsigned int pb[HDSPM_MIXER_CHANNELS];
};
typedef struct _snd_hdspm_mixer hdspm_mixer_t;
struct _snd_hdspm_mixer {
snd_hdspm_channelfader_t ch[HDSPM_MIXER_CHANNELS];
struct hdspm_mixer {
struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS];
};
struct sndrv_hdspm_mixer_ioctl {
hdspm_mixer_t *mixer;
struct hdspm_mixer_ioctl {
struct hdspm_mixer *mixer;
};
/* use indirect access due to the limit of ioctl bit size */
#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct sndrv_hdspm_mixer_ioctl)
#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
/* typedefs for compatibility to user-space */
typedef struct hdspm_peak_rms hdspm_peak_rms_t;
typedef struct hdspm_config_info hdspm_config_info_t;
typedef struct hdspm_version hdspm_version_t;
typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
typedef struct hdspm_mixer hdspm_mixer_t;
#endif /* __SOUND_HDSPM_H */

View File

@ -25,27 +25,25 @@
#include <sound/asound.h>
#include <linux/poll.h>
typedef enum sndrv_hwdep_iface snd_hwdep_iface_t;
typedef struct sndrv_hwdep_info snd_hwdep_info_t;
typedef struct sndrv_hwdep_dsp_status snd_hwdep_dsp_status_t;
typedef struct sndrv_hwdep_dsp_image snd_hwdep_dsp_image_t;
struct snd_hwdep;
typedef struct _snd_hwdep_ops {
long long (*llseek) (snd_hwdep_t *hw, struct file * file, long long offset, int orig);
long (*read) (snd_hwdep_t * hw, char __user *buf, long count, loff_t *offset);
long (*write) (snd_hwdep_t * hw, const char __user *buf, long count, loff_t *offset);
int (*open) (snd_hwdep_t * hw, struct file * file);
int (*release) (snd_hwdep_t * hw, struct file * file);
unsigned int (*poll) (snd_hwdep_t * hw, struct file * file, poll_table * wait);
int (*ioctl) (snd_hwdep_t * hw, struct file * file, unsigned int cmd, unsigned long arg);
int (*ioctl_compat) (snd_hwdep_t * hw, struct file * file, unsigned int cmd, unsigned long arg);
int (*mmap) (snd_hwdep_t * hw, struct file * file, struct vm_area_struct * vma);
int (*dsp_status) (snd_hwdep_t * hw, snd_hwdep_dsp_status_t * status);
int (*dsp_load) (snd_hwdep_t * hw, snd_hwdep_dsp_image_t * image);
} snd_hwdep_ops_t;
struct snd_hwdep_ops {
long long (*llseek) (struct snd_hwdep *hw, struct file * file, long long offset, int orig);
long (*read) (struct snd_hwdep *hw, char __user *buf, long count, loff_t *offset);
long (*write) (struct snd_hwdep *hw, const char __user *buf, long count, loff_t *offset);
int (*open) (struct snd_hwdep * hw, struct file * file);
int (*release) (struct snd_hwdep *hw, struct file * file);
unsigned int (*poll) (struct snd_hwdep *hw, struct file * file, poll_table * wait);
int (*ioctl) (struct snd_hwdep *hw, struct file * file, unsigned int cmd, unsigned long arg);
int (*ioctl_compat) (struct snd_hwdep *hw, struct file * file, unsigned int cmd, unsigned long arg);
int (*mmap) (struct snd_hwdep *hw, struct file * file, struct vm_area_struct * vma);
int (*dsp_status) (struct snd_hwdep *hw, struct snd_hwdep_dsp_status *status);
int (*dsp_load) (struct snd_hwdep *hw, struct snd_hwdep_dsp_image *image);
};
struct _snd_hwdep {
snd_card_t *card;
struct snd_hwdep {
struct snd_card *card;
struct list_head list;
int device;
char id[32];
char name[80];
@ -57,10 +55,10 @@ struct _snd_hwdep {
int ossreg;
#endif
snd_hwdep_ops_t ops;
struct snd_hwdep_ops ops;
wait_queue_head_t open_wait;
void *private_data;
void (*private_free) (snd_hwdep_t *hwdep);
void (*private_free) (struct snd_hwdep *hwdep);
struct semaphore open_mutex;
int used;
@ -68,6 +66,7 @@ struct _snd_hwdep {
unsigned int exclusive: 1;
};
extern int snd_hwdep_new(snd_card_t * card, char *id, int device, snd_hwdep_t ** rhwdep);
extern int snd_hwdep_new(struct snd_card *card, char *id, int device,
struct snd_hwdep **rhwdep);
#endif /* __SOUND_HWDEP_H */

View File

@ -21,82 +21,84 @@
*
*/
typedef struct _snd_i2c_device snd_i2c_device_t;
typedef struct _snd_i2c_bus snd_i2c_bus_t;
#define SND_I2C_DEVICE_ADDRTEN (1<<0) /* 10-bit I2C address */
struct _snd_i2c_device {
struct snd_i2c_device {
struct list_head list;
snd_i2c_bus_t *bus; /* I2C bus */
struct snd_i2c_bus *bus; /* I2C bus */
char name[32]; /* some useful device name */
unsigned short flags; /* device flags */
unsigned short addr; /* device address (might be 10-bit) */
unsigned long private_value;
void *private_data;
void (*private_free)(snd_i2c_device_t *device);
void (*private_free)(struct snd_i2c_device *device);
};
#define snd_i2c_device(n) list_entry(n, snd_i2c_device_t, list)
#define snd_i2c_device(n) list_entry(n, struct snd_i2c_device, list)
typedef struct _snd_i2c_bit_ops {
void (*start)(snd_i2c_bus_t *bus); /* transfer start */
void (*stop)(snd_i2c_bus_t *bus); /* transfer stop */
void (*direction)(snd_i2c_bus_t *bus, int clock, int data); /* set line direction (0 = write, 1 = read) */
void (*setlines)(snd_i2c_bus_t *bus, int clock, int data);
int (*getclock)(snd_i2c_bus_t *bus);
int (*getdata)(snd_i2c_bus_t *bus, int ack);
} snd_i2c_bit_ops_t;
struct snd_i2c_bit_ops {
void (*start)(struct snd_i2c_bus *bus); /* transfer start */
void (*stop)(struct snd_i2c_bus *bus); /* transfer stop */
void (*direction)(struct snd_i2c_bus *bus, int clock, int data); /* set line direction (0 = write, 1 = read) */
void (*setlines)(struct snd_i2c_bus *bus, int clock, int data);
int (*getclock)(struct snd_i2c_bus *bus);
int (*getdata)(struct snd_i2c_bus *bus, int ack);
};
typedef struct _snd_i2c_ops {
int (*sendbytes)(snd_i2c_device_t *device, unsigned char *bytes, int count);
int (*readbytes)(snd_i2c_device_t *device, unsigned char *bytes, int count);
int (*probeaddr)(snd_i2c_bus_t *bus, unsigned short addr);
} snd_i2c_ops_t;
struct snd_i2c_ops {
int (*sendbytes)(struct snd_i2c_device *device, unsigned char *bytes, int count);
int (*readbytes)(struct snd_i2c_device *device, unsigned char *bytes, int count);
int (*probeaddr)(struct snd_i2c_bus *bus, unsigned short addr);
};
struct _snd_i2c_bus {
snd_card_t *card; /* card which I2C belongs to */
struct snd_i2c_bus {
struct snd_card *card; /* card which I2C belongs to */
char name[32]; /* some useful label */
struct semaphore lock_mutex;
snd_i2c_bus_t *master; /* master bus when SCK/SCL is shared */
struct snd_i2c_bus *master; /* master bus when SCK/SCL is shared */
struct list_head buses; /* master: slave buses sharing SCK/SCL, slave: link list */
struct list_head devices; /* attached devices to this bus */
union {
snd_i2c_bit_ops_t *bit;
struct snd_i2c_bit_ops *bit;
void *ops;
} hw_ops; /* lowlevel operations */
snd_i2c_ops_t *ops; /* midlevel operations */
struct snd_i2c_ops *ops; /* midlevel operations */
unsigned long private_value;
void *private_data;
void (*private_free)(snd_i2c_bus_t *bus);
void (*private_free)(struct snd_i2c_bus *bus);
};
#define snd_i2c_slave_bus(n) list_entry(n, snd_i2c_bus_t, buses)
#define snd_i2c_slave_bus(n) list_entry(n, struct snd_i2c_bus, buses)
int snd_i2c_bus_create(snd_card_t *card, const char *name, snd_i2c_bus_t *master, snd_i2c_bus_t **ri2c);
int snd_i2c_device_create(snd_i2c_bus_t *bus, const char *name, unsigned char addr, snd_i2c_device_t **rdevice);
int snd_i2c_device_free(snd_i2c_device_t *device);
int snd_i2c_bus_create(struct snd_card *card, const char *name,
struct snd_i2c_bus *master, struct snd_i2c_bus **ri2c);
int snd_i2c_device_create(struct snd_i2c_bus *bus, const char *name,
unsigned char addr, struct snd_i2c_device **rdevice);
int snd_i2c_device_free(struct snd_i2c_device *device);
static inline void snd_i2c_lock(snd_i2c_bus_t *bus) {
static inline void snd_i2c_lock(struct snd_i2c_bus *bus)
{
if (bus->master)
down(&bus->master->lock_mutex);
else
down(&bus->lock_mutex);
}
static inline void snd_i2c_unlock(snd_i2c_bus_t *bus) {
static inline void snd_i2c_unlock(struct snd_i2c_bus *bus)
{
if (bus->master)
up(&bus->master->lock_mutex);
else
up(&bus->lock_mutex);
}
int snd_i2c_sendbytes(snd_i2c_device_t *device, unsigned char *bytes, int count);
int snd_i2c_readbytes(snd_i2c_device_t *device, unsigned char *bytes, int count);
int snd_i2c_probeaddr(snd_i2c_bus_t *bus, unsigned short addr);
int snd_i2c_sendbytes(struct snd_i2c_device *device, unsigned char *bytes, int count);
int snd_i2c_readbytes(struct snd_i2c_device *device, unsigned char *bytes, int count);
int snd_i2c_probeaddr(struct snd_i2c_bus *bus, unsigned short addr);
#endif /* __SOUND_I2C_H */

View File

@ -34,8 +34,6 @@ struct snd_info_buffer {
int error; /* error code */
};
typedef struct snd_info_buffer snd_info_buffer_t;
#define SNDRV_INFO_CONTENT_TEXT 0
#define SNDRV_INFO_CONTENT_DATA 1
@ -44,28 +42,28 @@ struct snd_info_entry;
struct snd_info_entry_text {
unsigned long read_size;
unsigned long write_size;
void (*read) (snd_info_entry_t *entry, snd_info_buffer_t * buffer);
void (*write) (snd_info_entry_t *entry, snd_info_buffer_t * buffer);
void (*read) (struct snd_info_entry *entry, struct snd_info_buffer *buffer);
void (*write) (struct snd_info_entry *entry, struct snd_info_buffer *buffer);
};
struct snd_info_entry_ops {
int (*open) (snd_info_entry_t *entry,
int (*open) (struct snd_info_entry *entry,
unsigned short mode, void **file_private_data);
int (*release) (snd_info_entry_t * entry,
int (*release) (struct snd_info_entry * entry,
unsigned short mode, void *file_private_data);
long (*read) (snd_info_entry_t *entry, void *file_private_data,
long (*read) (struct snd_info_entry *entry, void *file_private_data,
struct file * file, char __user *buf,
unsigned long count, unsigned long pos);
long (*write) (snd_info_entry_t *entry, void *file_private_data,
long (*write) (struct snd_info_entry *entry, void *file_private_data,
struct file * file, const char __user *buf,
unsigned long count, unsigned long pos);
long long (*llseek) (snd_info_entry_t *entry, void *file_private_data,
long long (*llseek) (struct snd_info_entry *entry, void *file_private_data,
struct file * file, long long offset, int orig);
unsigned int (*poll) (snd_info_entry_t *entry, void *file_private_data,
unsigned int (*poll) (struct snd_info_entry *entry, void *file_private_data,
struct file * file, poll_table * wait);
int (*ioctl) (snd_info_entry_t *entry, void *file_private_data,
int (*ioctl) (struct snd_info_entry *entry, void *file_private_data,
struct file * file, unsigned int cmd, unsigned long arg);
int (*mmap) (snd_info_entry_t *entry, void *file_private_data,
int (*mmap) (struct snd_info_entry *entry, void *file_private_data,
struct inode * inode, struct file * file,
struct vm_area_struct * vma);
};
@ -80,20 +78,18 @@ struct snd_info_entry {
struct snd_info_entry_text text;
struct snd_info_entry_ops *ops;
} c;
snd_info_entry_t *parent;
snd_card_t *card;
struct snd_info_entry *parent;
struct snd_card *card;
struct module *module;
void *private_data;
void (*private_free)(snd_info_entry_t *entry);
void (*private_free)(struct snd_info_entry *entry);
struct proc_dir_entry *p;
struct semaphore access;
};
extern int snd_info_check_reserved_words(const char *str);
#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_PROC_FS)
extern int snd_info_minor_register(void);
extern int snd_info_minor_unregister(void);
int snd_info_minor_register(void);
int snd_info_minor_unregister(void);
#else
#define snd_info_minor_register() /* NOP */
#define snd_info_minor_unregister() /* NOP */
@ -102,72 +98,79 @@ extern int snd_info_minor_unregister(void);
#ifdef CONFIG_PROC_FS
extern snd_info_entry_t *snd_seq_root;
extern struct snd_info_entry *snd_seq_root;
#ifdef CONFIG_SND_OSSEMUL
extern snd_info_entry_t *snd_oss_root;
extern struct snd_info_entry *snd_oss_root;
#else
#define snd_oss_root NULL
#endif
int snd_iprintf(snd_info_buffer_t * buffer, char *fmt,...) __attribute__ ((format (printf, 2, 3)));
int snd_iprintf(struct snd_info_buffer * buffer, char *fmt,...) __attribute__ ((format (printf, 2, 3)));
int snd_info_init(void);
int snd_info_done(void);
int snd_info_get_line(snd_info_buffer_t * buffer, char *line, int len);
int snd_info_get_line(struct snd_info_buffer * buffer, char *line, int len);
char *snd_info_get_str(char *dest, char *src, int len);
snd_info_entry_t *snd_info_create_module_entry(struct module * module,
struct snd_info_entry *snd_info_create_module_entry(struct module * module,
const char *name,
snd_info_entry_t * parent);
snd_info_entry_t *snd_info_create_card_entry(snd_card_t * card,
struct snd_info_entry * parent);
struct snd_info_entry *snd_info_create_card_entry(struct snd_card * card,
const char *name,
snd_info_entry_t * parent);
void snd_info_free_entry(snd_info_entry_t * entry);
int snd_info_store_text(snd_info_entry_t * entry);
int snd_info_restore_text(snd_info_entry_t * entry);
struct snd_info_entry * parent);
void snd_info_free_entry(struct snd_info_entry * entry);
int snd_info_store_text(struct snd_info_entry * entry);
int snd_info_restore_text(struct snd_info_entry * entry);
int snd_info_card_create(snd_card_t * card);
int snd_info_card_register(snd_card_t * card);
int snd_info_card_free(snd_card_t * card);
int snd_info_register(snd_info_entry_t * entry);
int snd_info_unregister(snd_info_entry_t * entry);
int snd_info_card_create(struct snd_card * card);
int snd_info_card_register(struct snd_card * card);
int snd_info_card_free(struct snd_card * card);
int snd_info_register(struct snd_info_entry * entry);
int snd_info_unregister(struct snd_info_entry * entry);
/* for card drivers */
int snd_card_proc_new(snd_card_t *card, const char *name, snd_info_entry_t **entryp);
int snd_card_proc_new(struct snd_card *card, const char *name, struct snd_info_entry **entryp);
static inline void snd_info_set_text_ops(snd_info_entry_t *entry,
static inline void snd_info_set_text_ops(struct snd_info_entry *entry,
void *private_data,
long read_size,
void (*read)(snd_info_entry_t *, snd_info_buffer_t *))
void (*read)(struct snd_info_entry *, struct snd_info_buffer *))
{
entry->private_data = private_data;
entry->c.text.read_size = read_size;
entry->c.text.read = read;
}
int snd_info_check_reserved_words(const char *str);
#else
#define snd_seq_root NULL
#define snd_oss_root NULL
static inline int snd_iprintf(snd_info_buffer_t * buffer, char *fmt,...) { return 0; }
static inline int snd_iprintf(struct snd_info_buffer * buffer, char *fmt,...) { return 0; }
static inline int snd_info_init(void) { return 0; }
static inline int snd_info_done(void) { return 0; }
static inline int snd_info_get_line(snd_info_buffer_t * buffer, char *line, int len) { return 0; }
static inline int snd_info_get_line(struct snd_info_buffer * buffer, char *line, int len) { return 0; }
static inline char *snd_info_get_str(char *dest, char *src, int len) { return NULL; }
static inline snd_info_entry_t *snd_info_create_module_entry(struct module * module, const char *name, snd_info_entry_t * parent) { return NULL; }
static inline snd_info_entry_t *snd_info_create_card_entry(snd_card_t * card, const char *name, snd_info_entry_t * parent) { return NULL; }
static inline void snd_info_free_entry(snd_info_entry_t * entry) { ; }
static inline struct snd_info_entry *snd_info_create_module_entry(struct module * module, const char *name, struct snd_info_entry * parent) { return NULL; }
static inline struct snd_info_entry *snd_info_create_card_entry(struct snd_card * card, const char *name, struct snd_info_entry * parent) { return NULL; }
static inline void snd_info_free_entry(struct snd_info_entry * entry) { ; }
static inline int snd_info_card_create(snd_card_t * card) { return 0; }
static inline int snd_info_card_register(snd_card_t * card) { return 0; }
static inline int snd_info_card_free(snd_card_t * card) { return 0; }
static inline int snd_info_register(snd_info_entry_t * entry) { return 0; }
static inline int snd_info_unregister(snd_info_entry_t * entry) { return 0; }
static inline int snd_info_card_create(struct snd_card * card) { return 0; }
static inline int snd_info_card_register(struct snd_card * card) { return 0; }
static inline int snd_info_card_free(struct snd_card * card) { return 0; }
static inline int snd_info_register(struct snd_info_entry * entry) { return 0; }
static inline int snd_info_unregister(struct snd_info_entry * entry) { return 0; }
#define snd_card_proc_new(card,name,entryp) 0 /* always success */
#define snd_info_set_text_ops(entry,private_data,read_size,read) /*NOP*/
static inline int snd_card_proc_new(struct snd_card *card, const char *name,
struct snd_info_entry **entryp) { return -EINVAL; }
static inline void snd_info_set_text_ops(struct snd_info_entry *entry __attribute__((unused)),
void *private_data,
long read_size,
void (*read)(struct snd_info_entry *, struct snd_info_buffer *)) {}
static inline int snd_info_check_reserved_words(const char *str) { return 1; }
#endif
@ -185,7 +188,7 @@ static inline int snd_info_unregister(snd_info_entry_t * entry) { return 0; }
#define SNDRV_OSS_INFO_DEV_COUNT 6
extern int snd_oss_info_register(int dev, int num, char *string);
int snd_oss_info_register(int dev, int num, char *string);
#define snd_oss_info_unregister(dev, num) snd_oss_info_register(dev, num, NULL)
#endif /* CONFIG_SND_OSSEMUL && CONFIG_PROC_FS */

View File

@ -50,20 +50,6 @@
#define SNDRV_DEFAULT_DMA_SIZE { [0 ... (SNDRV_CARDS-1)] = SNDRV_AUTO_DMA_SIZE }
#define SNDRV_DEFAULT_PTR SNDRV_DEFAULT_STR
#ifdef SNDRV_LEGACY_AUTO_PROBE
static int snd_legacy_auto_probe(unsigned long *ports, int (*probe)(unsigned long port))
{
int result = 0; /* number of detected cards */
while ((signed long)*ports != -1) {
if (probe(*ports) >= 0)
result++;
ports++;
}
return result;
}
#endif
#ifdef SNDRV_LEGACY_FIND_FREE_IRQ
#include <linux/interrupt.h>

View File

@ -26,18 +26,20 @@
#define SNDRV_MINOR_DEVICE(minor) ((minor) & 0x001f)
#define SNDRV_MINOR(card, dev) (((card) << 5) | (dev))
#define SNDRV_MINOR_CONTROL 0 /* 0 - 0 */
/* these minors can still be used for autoloading devices (/dev/aload*) */
#define SNDRV_MINOR_CONTROL 0 /* 0 */
#define SNDRV_MINOR_GLOBAL 1 /* 1 */
#define SNDRV_MINOR_SEQUENCER (SNDRV_MINOR_GLOBAL + 0 * 32)
#define SNDRV_MINOR_TIMER (SNDRV_MINOR_GLOBAL + 1 * 32)
#ifndef CONFIG_SND_DYNAMIC_MINORS
/* 2 - 3 (reserved) */
#define SNDRV_MINOR_HWDEP 4 /* 4 - 7 */
#define SNDRV_MINOR_HWDEPS 4
#define SNDRV_MINOR_RAWMIDI 8 /* 8 - 15 */
#define SNDRV_MINOR_RAWMIDIS 8
#define SNDRV_MINOR_PCM_PLAYBACK 16 /* 16 - 23 */
#define SNDRV_MINOR_PCM_CAPTURE 24 /* 24 - 31 */
#define SNDRV_MINOR_PCMS 8
/* same as first respective minor number to make minor allocation easier */
#define SNDRV_DEVICE_TYPE_CONTROL SNDRV_MINOR_CONTROL
#define SNDRV_DEVICE_TYPE_HWDEP SNDRV_MINOR_HWDEP
#define SNDRV_DEVICE_TYPE_RAWMIDI SNDRV_MINOR_RAWMIDI
@ -46,6 +48,25 @@
#define SNDRV_DEVICE_TYPE_SEQUENCER SNDRV_MINOR_SEQUENCER
#define SNDRV_DEVICE_TYPE_TIMER SNDRV_MINOR_TIMER
#else /* CONFIG_SND_DYNAMIC_MINORS */
enum {
SNDRV_DEVICE_TYPE_CONTROL,
SNDRV_DEVICE_TYPE_SEQUENCER,
SNDRV_DEVICE_TYPE_TIMER,
SNDRV_DEVICE_TYPE_HWDEP,
SNDRV_DEVICE_TYPE_RAWMIDI,
SNDRV_DEVICE_TYPE_PCM_PLAYBACK,
SNDRV_DEVICE_TYPE_PCM_CAPTURE,
};
#endif /* CONFIG_SND_DYNAMIC_MINORS */
#define SNDRV_MINOR_HWDEPS 4
#define SNDRV_MINOR_RAWMIDIS 8
#define SNDRV_MINOR_PCMS 8
#ifdef CONFIG_SND_OSSEMUL
#define SNDRV_MINOR_OSS_DEVICES 16

View File

@ -24,51 +24,53 @@
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
typedef struct _snd_oss_mixer_slot snd_mixer_oss_slot_t;
typedef struct _snd_oss_file snd_mixer_oss_file_t;
typedef int (*snd_mixer_oss_get_volume_t)(snd_mixer_oss_file_t *fmixer, snd_mixer_oss_slot_t *chn, int *left, int *right);
typedef int (*snd_mixer_oss_put_volume_t)(snd_mixer_oss_file_t *fmixer, snd_mixer_oss_slot_t *chn, int left, int right);
typedef int (*snd_mixer_oss_get_recsrc_t)(snd_mixer_oss_file_t *fmixer, snd_mixer_oss_slot_t *chn, int *active);
typedef int (*snd_mixer_oss_put_recsrc_t)(snd_mixer_oss_file_t *fmixer, snd_mixer_oss_slot_t *chn, int active);
typedef int (*snd_mixer_oss_get_recsrce_t)(snd_mixer_oss_file_t *fmixer, unsigned int *active_index);
typedef int (*snd_mixer_oss_put_recsrce_t)(snd_mixer_oss_file_t *fmixer, unsigned int active_index);
#define SNDRV_OSS_MAX_MIXERS 32
struct _snd_oss_mixer_slot {
struct snd_mixer_oss_file;
struct snd_mixer_oss_slot {
int number;
unsigned int stereo: 1;
snd_mixer_oss_get_volume_t get_volume;
snd_mixer_oss_put_volume_t put_volume;
snd_mixer_oss_get_recsrc_t get_recsrc;
snd_mixer_oss_put_recsrc_t put_recsrc;
int (*get_volume)(struct snd_mixer_oss_file *fmixer,
struct snd_mixer_oss_slot *chn,
int *left, int *right);
int (*put_volume)(struct snd_mixer_oss_file *fmixer,
struct snd_mixer_oss_slot *chn,
int left, int right);
int (*get_recsrc)(struct snd_mixer_oss_file *fmixer,
struct snd_mixer_oss_slot *chn,
int *active);
int (*put_recsrc)(struct snd_mixer_oss_file *fmixer,
struct snd_mixer_oss_slot *chn,
int active);
unsigned long private_value;
void *private_data;
void (*private_free)(snd_mixer_oss_slot_t *slot);
void (*private_free)(struct snd_mixer_oss_slot *slot);
int volume[2];
};
struct _snd_oss_mixer {
snd_card_t *card;
struct snd_mixer_oss {
struct snd_card *card;
char id[16];
char name[32];
snd_mixer_oss_slot_t slots[SNDRV_OSS_MAX_MIXERS]; /* OSS mixer slots */
struct snd_mixer_oss_slot slots[SNDRV_OSS_MAX_MIXERS]; /* OSS mixer slots */
unsigned int mask_recsrc; /* exclusive recsrc mask */
snd_mixer_oss_get_recsrce_t get_recsrc;
snd_mixer_oss_put_recsrce_t put_recsrc;
int (*get_recsrc)(struct snd_mixer_oss_file *fmixer,
unsigned int *active_index);
int (*put_recsrc)(struct snd_mixer_oss_file *fmixer,
unsigned int active_index);
void *private_data_recsrc;
void (*private_free_recsrc)(snd_mixer_oss_t *mixer);
void (*private_free_recsrc)(struct snd_mixer_oss *mixer);
struct semaphore reg_mutex;
snd_info_entry_t *proc_entry;
struct snd_info_entry *proc_entry;
int oss_dev_alloc;
/* --- */
int oss_recsrc;
};
struct _snd_oss_file {
snd_card_t *card;
snd_mixer_oss_t *mixer;
struct snd_mixer_oss_file {
struct snd_card *card;
struct snd_mixer_oss *mixer;
};
#endif /* CONFIG_SND_MIXER_OSS */

View File

@ -58,10 +58,8 @@
#define MPU401_MODE_INPUT_TIMER (1<<0)
#define MPU401_MODE_OUTPUT_TIMER (1<<1)
typedef struct _snd_mpu401 mpu401_t;
struct _snd_mpu401 {
snd_rawmidi_t *rmidi;
struct snd_mpu401 {
struct snd_rawmidi *rmidi;
unsigned short hardware; /* MPU401_HW_XXXX */
unsigned long port; /* base port of MPU-401 chip */
@ -73,14 +71,14 @@ struct _snd_mpu401 {
unsigned long mode; /* MPU401_MODE_XXXX */
int timer_invoked;
int (*open_input) (mpu401_t * mpu);
void (*close_input) (mpu401_t * mpu);
int (*open_output) (mpu401_t * mpu);
void (*close_output) (mpu401_t * mpu);
int (*open_input) (struct snd_mpu401 * mpu);
void (*close_input) (struct snd_mpu401 * mpu);
int (*open_output) (struct snd_mpu401 * mpu);
void (*close_output) (struct snd_mpu401 * mpu);
void *private_data;
snd_rawmidi_substream_t *substream_input;
snd_rawmidi_substream_t *substream_output;
struct snd_rawmidi_substream *substream_input;
struct snd_rawmidi_substream *substream_output;
spinlock_t input_lock;
spinlock_t output_lock;
@ -88,8 +86,8 @@ struct _snd_mpu401 {
struct timer_list timer;
void (*write) (mpu401_t * mpu, unsigned char data, unsigned long addr);
unsigned char (*read) (mpu401_t * mpu, unsigned long addr);
void (*write) (struct snd_mpu401 * mpu, unsigned char data, unsigned long addr);
unsigned char (*read) (struct snd_mpu401 *mpu, unsigned long addr);
};
/* I/O ports */
@ -103,13 +101,13 @@ struct _snd_mpu401 {
irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id, struct pt_regs *regs);
int snd_mpu401_uart_new(snd_card_t * card,
int snd_mpu401_uart_new(struct snd_card *card,
int device,
unsigned short hardware,
unsigned long port,
int integrated,
int irq,
int irq_flags,
snd_rawmidi_t ** rrawmidi);
struct snd_rawmidi ** rrawmidi);
#endif /* __SOUND_MPU401_H */

View File

@ -237,12 +237,12 @@
#define MAX_OPL2_VOICES 9
#define MAX_OPL3_VOICES 18
typedef struct snd_opl3 opl3_t;
struct snd_opl3;
/*
* A structure to keep track of each hardware voice
*/
typedef struct snd_opl3_voice {
struct snd_opl3_voice {
int state; /* status */
#define SNDRV_OPL3_ST_OFF 0 /* Not playing */
#define SNDRV_OPL3_ST_ON_2OP 1 /* 2op voice is allocated */
@ -257,8 +257,8 @@ typedef struct snd_opl3_voice {
unsigned char keyon_reg; /* KON register shadow */
snd_midi_channel_t *chan; /* Midi channel for this note */
} snd_opl3_voice_t;
struct snd_midi_channel *chan; /* Midi channel for this note */
};
struct snd_opl3 {
unsigned long l_port;
@ -267,18 +267,18 @@ struct snd_opl3 {
struct resource *res_r_port;
unsigned short hardware;
/* hardware access */
void (*command) (opl3_t * opl3, unsigned short cmd, unsigned char val);
void (*command) (struct snd_opl3 * opl3, unsigned short cmd, unsigned char val);
unsigned short timer_enable;
int seq_dev_num; /* sequencer device number */
snd_timer_t *timer1;
snd_timer_t *timer2;
struct snd_timer *timer1;
struct snd_timer *timer2;
spinlock_t timer_lock;
void *private_data;
void (*private_free)(opl3_t *);
void (*private_free)(struct snd_opl3 *);
spinlock_t reg_lock;
snd_card_t *card; /* The card that this belongs to */
struct snd_card *card; /* The card that this belongs to */
int used; /* usage flag - exclusive */
unsigned char fm_mode; /* OPL mode, see SNDRV_DM_FM_MODE_XXX */
unsigned char rhythm; /* percussion mode flag */
@ -289,18 +289,18 @@ struct snd_opl3 {
int synth_mode; /* synth mode */
int seq_client;
snd_seq_device_t *seq_dev; /* sequencer device */
snd_midi_channel_set_t * chset;
struct snd_seq_device *seq_dev; /* sequencer device */
struct snd_midi_channel_set * chset;
#ifdef CONFIG_SND_SEQUENCER_OSS
snd_seq_device_t *oss_seq_dev; /* OSS sequencer device */
snd_midi_channel_set_t * oss_chset;
struct snd_seq_device *oss_seq_dev; /* OSS sequencer device */
struct snd_midi_channel_set * oss_chset;
#endif
snd_seq_kinstr_ops_t fm_ops;
snd_seq_kinstr_list_t *ilist;
struct snd_seq_kinstr_ops fm_ops;
struct snd_seq_kinstr_list *ilist;
snd_opl3_voice_t voices[MAX_OPL3_VOICES]; /* Voices (OPL3 'channel') */
struct snd_opl3_voice voices[MAX_OPL3_VOICES]; /* Voices (OPL3 'channel') */
int use_time; /* allocation counter */
unsigned short connection_reg; /* connection reg shadow */
@ -316,24 +316,25 @@ struct snd_opl3 {
};
/* opl3.c */
void snd_opl3_interrupt(snd_hwdep_t * hw);
int snd_opl3_new(snd_card_t *card, unsigned short hardware, opl3_t **ropl3);
int snd_opl3_init(opl3_t *opl3);
int snd_opl3_create(snd_card_t * card,
void snd_opl3_interrupt(struct snd_hwdep * hw);
int snd_opl3_new(struct snd_card *card, unsigned short hardware,
struct snd_opl3 **ropl3);
int snd_opl3_init(struct snd_opl3 *opl3);
int snd_opl3_create(struct snd_card *card,
unsigned long l_port, unsigned long r_port,
unsigned short hardware,
int integrated,
opl3_t ** opl3);
int snd_opl3_timer_new(opl3_t * opl3, int timer1_dev, int timer2_dev);
int snd_opl3_hwdep_new(opl3_t * opl3, int device, int seq_device,
snd_hwdep_t ** rhwdep);
struct snd_opl3 ** opl3);
int snd_opl3_timer_new(struct snd_opl3 * opl3, int timer1_dev, int timer2_dev);
int snd_opl3_hwdep_new(struct snd_opl3 * opl3, int device, int seq_device,
struct snd_hwdep ** rhwdep);
/* opl3_synth */
int snd_opl3_open(snd_hwdep_t * hw, struct file *file);
int snd_opl3_ioctl(snd_hwdep_t * hw, struct file *file,
int snd_opl3_open(struct snd_hwdep * hw, struct file *file);
int snd_opl3_ioctl(struct snd_hwdep * hw, struct file *file,
unsigned int cmd, unsigned long arg);
int snd_opl3_release(snd_hwdep_t * hw, struct file *file);
int snd_opl3_release(struct snd_hwdep * hw, struct file *file);
void snd_opl3_reset(opl3_t * opl3);
void snd_opl3_reset(struct snd_opl3 * opl3);
#endif /* __SOUND_OPL3_H */

View File

@ -22,11 +22,11 @@
#include <sound/opl3.h>
typedef struct opl4 opl4_t;
struct snd_opl4;
extern int snd_opl4_create(snd_card_t *card,
extern int snd_opl4_create(struct snd_card *card,
unsigned long fm_port, unsigned long pcm_port,
int seq_device,
opl3_t **opl3, opl4_t **opl4);
struct snd_opl3 **opl3, struct snd_opl4 **opl4);
#endif /* __SOUND_OPL4_H */

View File

@ -24,7 +24,7 @@
#include <sound/pcm.h>
typedef struct sndrv_pcm_indirect {
struct snd_pcm_indirect {
unsigned int hw_buffer_size; /* Byte size of hardware buffer */
unsigned int hw_queue_size; /* Max queue size of hw buffer (0 = buffer size) */
unsigned int hw_data; /* Offset to next dst (or src) in hw ring buffer */
@ -35,20 +35,20 @@ typedef struct sndrv_pcm_indirect {
unsigned int sw_io; /* Current software pointer in bytes */
int sw_ready; /* Bytes ready to be transferred to/from hw */
snd_pcm_uframes_t appl_ptr; /* Last seen appl_ptr */
} snd_pcm_indirect_t;
};
typedef void (*snd_pcm_indirect_copy_t)(snd_pcm_substream_t *substream,
snd_pcm_indirect_t *rec, size_t bytes);
typedef void (*snd_pcm_indirect_copy_t)(struct snd_pcm_substream *substream,
struct snd_pcm_indirect *rec, size_t bytes);
/*
* helper function for playback ack callback
*/
static inline void
snd_pcm_indirect_playback_transfer(snd_pcm_substream_t *substream,
snd_pcm_indirect_t *rec,
snd_pcm_indirect_playback_transfer(struct snd_pcm_substream *substream,
struct snd_pcm_indirect *rec,
snd_pcm_indirect_copy_t copy)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
snd_pcm_uframes_t appl_ptr = runtime->control->appl_ptr;
snd_pcm_sframes_t diff = appl_ptr - rec->appl_ptr;
int qsize;
@ -89,8 +89,8 @@ snd_pcm_indirect_playback_transfer(snd_pcm_substream_t *substream,
* ptr = current byte pointer
*/
static inline snd_pcm_uframes_t
snd_pcm_indirect_playback_pointer(snd_pcm_substream_t *substream,
snd_pcm_indirect_t *rec, unsigned int ptr)
snd_pcm_indirect_playback_pointer(struct snd_pcm_substream *substream,
struct snd_pcm_indirect *rec, unsigned int ptr)
{
int bytes = ptr - rec->hw_io;
if (bytes < 0)
@ -110,11 +110,11 @@ snd_pcm_indirect_playback_pointer(snd_pcm_substream_t *substream,
* helper function for capture ack callback
*/
static inline void
snd_pcm_indirect_capture_transfer(snd_pcm_substream_t *substream,
snd_pcm_indirect_t *rec,
snd_pcm_indirect_capture_transfer(struct snd_pcm_substream *substream,
struct snd_pcm_indirect *rec,
snd_pcm_indirect_copy_t copy)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
snd_pcm_uframes_t appl_ptr = runtime->control->appl_ptr;
snd_pcm_sframes_t diff = appl_ptr - rec->appl_ptr;
@ -154,8 +154,8 @@ snd_pcm_indirect_capture_transfer(snd_pcm_substream_t *substream,
* ptr = current byte pointer
*/
static inline snd_pcm_uframes_t
snd_pcm_indirect_capture_pointer(snd_pcm_substream_t *substream,
snd_pcm_indirect_t *rec, unsigned int ptr)
snd_pcm_indirect_capture_pointer(struct snd_pcm_substream *substream,
struct snd_pcm_indirect *rec, unsigned int ptr)
{
int qsize;
int bytes = ptr - rec->hw_io;

View File

@ -28,36 +28,9 @@
#include <linux/poll.h>
#include <linux/bitops.h>
typedef sndrv_pcm_uframes_t snd_pcm_uframes_t;
typedef sndrv_pcm_sframes_t snd_pcm_sframes_t;
typedef enum sndrv_pcm_class snd_pcm_class_t;
typedef enum sndrv_pcm_subclass snd_pcm_subclass_t;
typedef enum sndrv_pcm_stream snd_pcm_stream_t;
typedef enum sndrv_pcm_access snd_pcm_access_t;
typedef enum sndrv_pcm_format snd_pcm_format_t;
typedef enum sndrv_pcm_subformat snd_pcm_subformat_t;
typedef enum sndrv_pcm_state snd_pcm_state_t;
typedef union sndrv_pcm_sync_id snd_pcm_sync_id_t;
typedef struct sndrv_pcm_info snd_pcm_info_t;
typedef enum sndrv_pcm_hw_param snd_pcm_hw_param_t;
typedef struct sndrv_pcm_hw_params snd_pcm_hw_params_t;
typedef enum sndrv_pcm_start snd_pcm_start_t;
typedef enum sndrv_pcm_xrun snd_pcm_xrun_t;
typedef enum sndrv_pcm_tstamp snd_pcm_tstamp_t;
typedef struct sndrv_pcm_sw_params snd_pcm_sw_params_t;
typedef struct sndrv_pcm_channel_info snd_pcm_channel_info_t;
typedef struct sndrv_pcm_status snd_pcm_status_t;
typedef struct sndrv_pcm_mmap_status snd_pcm_mmap_status_t;
typedef struct sndrv_pcm_mmap_control snd_pcm_mmap_control_t;
typedef struct sndrv_mask snd_mask_t;
typedef struct snd_sg_buf snd_pcm_sgbuf_t;
#define snd_pcm_substream_chip(substream) ((substream)->private_data)
#define snd_pcm_chip(pcm) ((pcm)->private_data)
typedef struct _snd_pcm_file snd_pcm_file_t;
typedef struct _snd_pcm_runtime snd_pcm_runtime_t;
#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
#include "pcm_oss.h"
#endif
@ -66,7 +39,7 @@ typedef struct _snd_pcm_runtime snd_pcm_runtime_t;
* Hardware (lowlevel) section
*/
typedef struct _snd_pcm_hardware {
struct snd_pcm_hardware {
unsigned int info; /* SNDRV_PCM_INFO_* */
u64 formats; /* SNDRV_PCM_FMTBIT_* */
unsigned int rates; /* SNDRV_PCM_RATE_* */
@ -80,26 +53,29 @@ typedef struct _snd_pcm_hardware {
unsigned int periods_min; /* min # of periods */
unsigned int periods_max; /* max # of periods */
size_t fifo_size; /* fifo size in bytes */
} snd_pcm_hardware_t;
};
typedef struct _snd_pcm_ops {
int (*open)(snd_pcm_substream_t *substream);
int (*close)(snd_pcm_substream_t *substream);
int (*ioctl)(snd_pcm_substream_t * substream,
struct snd_pcm_ops {
int (*open)(struct snd_pcm_substream *substream);
int (*close)(struct snd_pcm_substream *substream);
int (*ioctl)(struct snd_pcm_substream * substream,
unsigned int cmd, void *arg);
int (*hw_params)(snd_pcm_substream_t * substream, snd_pcm_hw_params_t * params);
int (*hw_free)(snd_pcm_substream_t *substream);
int (*prepare)(snd_pcm_substream_t * substream);
int (*trigger)(snd_pcm_substream_t * substream, int cmd);
snd_pcm_uframes_t (*pointer)(snd_pcm_substream_t * substream);
int (*copy)(snd_pcm_substream_t *substream, int channel, snd_pcm_uframes_t pos,
int (*hw_params)(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params);
int (*hw_free)(struct snd_pcm_substream *substream);
int (*prepare)(struct snd_pcm_substream *substream);
int (*trigger)(struct snd_pcm_substream *substream, int cmd);
snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
int (*copy)(struct snd_pcm_substream *substream, int channel,
snd_pcm_uframes_t pos,
void __user *buf, snd_pcm_uframes_t count);
int (*silence)(snd_pcm_substream_t *substream, int channel,
int (*silence)(struct snd_pcm_substream *substream, int channel,
snd_pcm_uframes_t pos, snd_pcm_uframes_t count);
struct page *(*page)(snd_pcm_substream_t *substream, unsigned long offset);
int (*mmap)(snd_pcm_substream_t *substream, struct vm_area_struct *vma);
int (*ack)(snd_pcm_substream_t *substream);
} snd_pcm_ops_t;
struct page *(*page)(struct snd_pcm_substream *substream,
unsigned long offset);
int (*mmap)(struct snd_pcm_substream *substream, struct vm_area_struct *vma);
int (*ack)(struct snd_pcm_substream *substream);
};
/*
*
@ -212,17 +188,16 @@ typedef struct _snd_pcm_ops {
#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
#endif
struct _snd_pcm_file {
snd_pcm_substream_t * substream;
struct _snd_pcm_file * next;
struct snd_pcm_file {
struct snd_pcm_substream *substream;
struct snd_pcm_file *next;
};
typedef struct _snd_pcm_hw_rule snd_pcm_hw_rule_t;
struct snd_pcm_hw_rule;
typedef int (*snd_pcm_hw_rule_func_t)(struct snd_pcm_hw_params *params,
struct snd_pcm_hw_rule *rule);
typedef int (*snd_pcm_hw_rule_func_t)(snd_pcm_hw_params_t *params,
snd_pcm_hw_rule_t *rule);
struct _snd_pcm_hw_rule {
struct snd_pcm_hw_rule {
unsigned int cond;
snd_pcm_hw_rule_func_t func;
int var;
@ -230,57 +205,57 @@ struct _snd_pcm_hw_rule {
void *private;
};
typedef struct _snd_pcm_hw_constraints {
snd_mask_t masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
struct snd_pcm_hw_constraints {
struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
snd_interval_t intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
unsigned int rules_num;
unsigned int rules_all;
snd_pcm_hw_rule_t *rules;
} snd_pcm_hw_constraints_t;
struct snd_pcm_hw_rule *rules;
};
static inline snd_mask_t *constrs_mask(snd_pcm_hw_constraints_t *constrs,
snd_pcm_hw_param_t var)
static inline struct snd_mask *constrs_mask(struct snd_pcm_hw_constraints *constrs,
snd_pcm_hw_param_t var)
{
return &constrs->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
}
static inline snd_interval_t *constrs_interval(snd_pcm_hw_constraints_t *constrs,
snd_pcm_hw_param_t var)
static inline struct snd_interval *constrs_interval(struct snd_pcm_hw_constraints *constrs,
snd_pcm_hw_param_t var)
{
return &constrs->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
}
typedef struct {
struct snd_ratnum {
unsigned int num;
unsigned int den_min, den_max, den_step;
} ratnum_t;
};
typedef struct {
struct snd_ratden {
unsigned int num_min, num_max, num_step;
unsigned int den;
} ratden_t;
};
typedef struct {
struct snd_pcm_hw_constraint_ratnums {
int nrats;
ratnum_t *rats;
} snd_pcm_hw_constraint_ratnums_t;
struct snd_ratnum *rats;
};
typedef struct {
struct snd_pcm_hw_constraint_ratdens {
int nrats;
ratden_t *rats;
} snd_pcm_hw_constraint_ratdens_t;
struct snd_ratden *rats;
};
typedef struct {
struct snd_pcm_hw_constraint_list {
unsigned int count;
unsigned int *list;
unsigned int mask;
} snd_pcm_hw_constraint_list_t;
};
struct _snd_pcm_runtime {
struct snd_pcm_runtime {
/* -- Status -- */
snd_pcm_substream_t *trigger_master;
struct snd_pcm_substream *trigger_master;
struct timespec trigger_tstamp; /* trigger timestamp */
int overrange;
snd_pcm_uframes_t avail_max;
@ -306,7 +281,7 @@ struct _snd_pcm_runtime {
unsigned int rate_den;
/* -- SW params -- */
snd_pcm_tstamp_t tstamp_mode; /* mmap timestamp is updated */
int tstamp_mode; /* mmap timestamp is updated */
unsigned int period_step;
unsigned int sleep_min; /* min ticks to sleep */
snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */
@ -320,11 +295,11 @@ struct _snd_pcm_runtime {
snd_pcm_uframes_t silence_start; /* starting pointer to silence area */
snd_pcm_uframes_t silence_filled; /* size filled with silence */
snd_pcm_sync_id_t sync; /* hardware synchronization ID */
union snd_pcm_sync_id sync; /* hardware synchronization ID */
/* -- mmap -- */
volatile snd_pcm_mmap_status_t *status;
volatile snd_pcm_mmap_control_t *control;
volatile struct snd_pcm_mmap_status *status;
volatile struct snd_pcm_mmap_control *control;
atomic_t mmap_count;
/* -- locking / scheduling -- */
@ -334,15 +309,15 @@ struct _snd_pcm_runtime {
/* -- private section -- */
void *private_data;
void (*private_free)(snd_pcm_runtime_t *runtime);
void (*private_free)(struct snd_pcm_runtime *runtime);
/* -- hardware description -- */
snd_pcm_hardware_t hw;
snd_pcm_hw_constraints_t hw_constraints;
struct snd_pcm_hardware hw;
struct snd_pcm_hw_constraints hw_constraints;
/* -- interrupt callbacks -- */
void (*transfer_ack_begin)(snd_pcm_substream_t *substream);
void (*transfer_ack_end)(snd_pcm_substream_t *substream);
void (*transfer_ack_begin)(struct snd_pcm_substream *substream);
void (*transfer_ack_end)(struct snd_pcm_substream *substream);
/* -- timer -- */
unsigned int timer_resolution; /* timer resolution */
@ -356,19 +331,19 @@ struct _snd_pcm_runtime {
#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
/* -- OSS things -- */
snd_pcm_oss_runtime_t oss;
struct snd_pcm_oss_runtime oss;
#endif
};
typedef struct _snd_pcm_group { /* keep linked substreams */
struct snd_pcm_group { /* keep linked substreams */
spinlock_t lock;
struct list_head substreams;
int count;
} snd_pcm_group_t;
};
struct _snd_pcm_substream {
snd_pcm_t *pcm;
snd_pcm_str_t *pstr;
struct snd_pcm_substream {
struct snd_pcm *pcm;
struct snd_pcm_str *pstr;
void *private_data; /* copied from pcm->private_data */
int number;
char name[32]; /* substream name */
@ -378,32 +353,32 @@ struct _snd_pcm_substream {
unsigned int dma_buf_id;
size_t dma_max;
/* -- hardware operations -- */
snd_pcm_ops_t *ops;
struct snd_pcm_ops *ops;
/* -- runtime information -- */
snd_pcm_runtime_t *runtime;
struct snd_pcm_runtime *runtime;
/* -- timer section -- */
snd_timer_t *timer; /* timer */
struct snd_timer *timer; /* timer */
unsigned timer_running: 1; /* time is running */
spinlock_t timer_lock;
/* -- next substream -- */
snd_pcm_substream_t *next;
struct snd_pcm_substream *next;
/* -- linked substreams -- */
struct list_head link_list; /* linked list member */
snd_pcm_group_t self_group; /* fake group for non linked substream (with substream lock inside) */
snd_pcm_group_t *group; /* pointer to current group */
struct snd_pcm_group self_group; /* fake group for non linked substream (with substream lock inside) */
struct snd_pcm_group *group; /* pointer to current group */
/* -- assigned files -- */
snd_pcm_file_t *file;
struct snd_pcm_file *file;
struct file *ffile;
#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
/* -- OSS things -- */
snd_pcm_oss_substream_t oss;
struct snd_pcm_oss_substream oss;
#endif
snd_info_entry_t *proc_root;
snd_info_entry_t *proc_info_entry;
snd_info_entry_t *proc_hw_params_entry;
snd_info_entry_t *proc_sw_params_entry;
snd_info_entry_t *proc_status_entry;
snd_info_entry_t *proc_prealloc_entry;
struct snd_info_entry *proc_root;
struct snd_info_entry *proc_info_entry;
struct snd_info_entry *proc_hw_params_entry;
struct snd_info_entry *proc_sw_params_entry;
struct snd_info_entry *proc_status_entry;
struct snd_info_entry *proc_prealloc_entry;
/* misc flags */
unsigned int no_mmap_ctrl: 1;
};
@ -415,65 +390,64 @@ struct _snd_pcm_substream {
#endif
struct _snd_pcm_str {
struct snd_pcm_str {
int stream; /* stream (direction) */
snd_pcm_t *pcm;
struct snd_pcm *pcm;
/* -- substreams -- */
unsigned int substream_count;
unsigned int substream_opened;
snd_pcm_substream_t *substream;
struct snd_pcm_substream *substream;
#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
/* -- OSS things -- */
snd_pcm_oss_stream_t oss;
struct snd_pcm_oss_stream oss;
#endif
snd_pcm_file_t *files;
snd_minor_t *reg;
snd_info_entry_t *proc_root;
snd_info_entry_t *proc_info_entry;
struct snd_pcm_file *files;
struct snd_info_entry *proc_root;
struct snd_info_entry *proc_info_entry;
#ifdef CONFIG_SND_DEBUG
unsigned int xrun_debug; /* 0 = disabled, 1 = verbose, 2 = stacktrace */
snd_info_entry_t *proc_xrun_debug_entry;
struct snd_info_entry *proc_xrun_debug_entry;
#endif
};
struct _snd_pcm {
snd_card_t *card;
struct snd_pcm {
struct snd_card *card;
struct list_head list;
unsigned int device; /* device number */
unsigned int info_flags;
unsigned short dev_class;
unsigned short dev_subclass;
char id[64];
char name[80];
snd_pcm_str_t streams[2];
struct snd_pcm_str streams[2];
struct semaphore open_mutex;
wait_queue_head_t open_wait;
void *private_data;
void (*private_free) (snd_pcm_t *pcm);
void (*private_free) (struct snd_pcm *pcm);
#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
snd_pcm_oss_t oss;
struct snd_pcm_oss oss;
#endif
};
typedef struct _snd_pcm_notify {
int (*n_register) (snd_pcm_t * pcm);
int (*n_disconnect) (snd_pcm_t * pcm);
int (*n_unregister) (snd_pcm_t * pcm);
struct snd_pcm_notify {
int (*n_register) (struct snd_pcm * pcm);
int (*n_disconnect) (struct snd_pcm * pcm);
int (*n_unregister) (struct snd_pcm * pcm);
struct list_head list;
} snd_pcm_notify_t;
};
/*
* Registering
*/
extern snd_pcm_t *snd_pcm_devices[];
extern snd_minor_t snd_pcm_reg[2];
extern struct file_operations snd_pcm_f_ops[2];
int snd_pcm_new(snd_card_t * card, char *id, int device,
int snd_pcm_new(struct snd_card *card, char *id, int device,
int playback_count, int capture_count,
snd_pcm_t **rpcm);
int snd_pcm_new_stream(snd_pcm_t *pcm, int stream, int substream_count);
struct snd_pcm **rpcm);
int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count);
int snd_pcm_notify(snd_pcm_notify_t *notify, int nfree);
int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree);
/*
* Native I/O
@ -481,24 +455,26 @@ int snd_pcm_notify(snd_pcm_notify_t *notify, int nfree);
extern rwlock_t snd_pcm_link_rwlock;
int snd_pcm_info(snd_pcm_substream_t * substream, snd_pcm_info_t *info);
int snd_pcm_info_user(snd_pcm_substream_t * substream, snd_pcm_info_t __user *info);
int snd_pcm_status(snd_pcm_substream_t * substream, snd_pcm_status_t *status);
int snd_pcm_prepare(snd_pcm_substream_t *substream);
int snd_pcm_start(snd_pcm_substream_t *substream);
int snd_pcm_stop(snd_pcm_substream_t *substream, int status);
int snd_pcm_drain_done(snd_pcm_substream_t *substream);
int snd_pcm_info(struct snd_pcm_substream *substream, struct snd_pcm_info *info);
int snd_pcm_info_user(struct snd_pcm_substream *substream,
struct snd_pcm_info __user *info);
int snd_pcm_status(struct snd_pcm_substream *substream,
struct snd_pcm_status *status);
int snd_pcm_prepare(struct snd_pcm_substream *substream);
int snd_pcm_start(struct snd_pcm_substream *substream);
int snd_pcm_stop(struct snd_pcm_substream *substream, int status);
int snd_pcm_drain_done(struct snd_pcm_substream *substream);
#ifdef CONFIG_PM
int snd_pcm_suspend(snd_pcm_substream_t *substream);
int snd_pcm_suspend_all(snd_pcm_t *pcm);
int snd_pcm_suspend(struct snd_pcm_substream *substream);
int snd_pcm_suspend_all(struct snd_pcm *pcm);
#endif
int snd_pcm_kernel_playback_ioctl(snd_pcm_substream_t *substream, unsigned int cmd, void *arg);
int snd_pcm_kernel_capture_ioctl(snd_pcm_substream_t *substream, unsigned int cmd, void *arg);
int snd_pcm_kernel_ioctl(snd_pcm_substream_t *substream, unsigned int cmd, void *arg);
int snd_pcm_open_substream(snd_pcm_t *pcm, int stream, snd_pcm_substream_t **rsubstream);
void snd_pcm_release_substream(snd_pcm_substream_t *substream);
int snd_pcm_kernel_playback_ioctl(struct snd_pcm_substream *substream, unsigned int cmd, void *arg);
int snd_pcm_kernel_capture_ioctl(struct snd_pcm_substream *substream, unsigned int cmd, void *arg);
int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, unsigned int cmd, void *arg);
int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, struct snd_pcm_substream **rsubstream);
void snd_pcm_release_substream(struct snd_pcm_substream *substream);
void snd_pcm_vma_notify_data(void *client, void *data);
int snd_pcm_mmap_data(snd_pcm_substream_t *substream, struct file *file, struct vm_area_struct *area);
int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area);
#if BITS_PER_LONG >= 64
@ -578,30 +554,30 @@ static inline void div64_32(u_int64_t *n, u_int32_t div, u_int32_t *rem)
* PCM library
*/
static inline int snd_pcm_stream_linked(snd_pcm_substream_t *substream)
static inline int snd_pcm_stream_linked(struct snd_pcm_substream *substream)
{
return substream->group != &substream->self_group;
}
static inline void snd_pcm_stream_lock(snd_pcm_substream_t *substream)
static inline void snd_pcm_stream_lock(struct snd_pcm_substream *substream)
{
read_lock(&snd_pcm_link_rwlock);
spin_lock(&substream->self_group.lock);
}
static inline void snd_pcm_stream_unlock(snd_pcm_substream_t *substream)
static inline void snd_pcm_stream_unlock(struct snd_pcm_substream *substream)
{
spin_unlock(&substream->self_group.lock);
read_unlock(&snd_pcm_link_rwlock);
}
static inline void snd_pcm_stream_lock_irq(snd_pcm_substream_t *substream)
static inline void snd_pcm_stream_lock_irq(struct snd_pcm_substream *substream)
{
read_lock_irq(&snd_pcm_link_rwlock);
spin_lock(&substream->self_group.lock);
}
static inline void snd_pcm_stream_unlock_irq(snd_pcm_substream_t *substream)
static inline void snd_pcm_stream_unlock_irq(struct snd_pcm_substream *substream)
{
spin_unlock(&substream->self_group.lock);
read_unlock_irq(&snd_pcm_link_rwlock);
@ -623,56 +599,56 @@ do { \
list_for_each(pos, &substream->group->substreams)
#define snd_pcm_group_substream_entry(pos) \
list_entry(pos, snd_pcm_substream_t, link_list)
list_entry(pos, struct snd_pcm_substream, link_list)
static inline int snd_pcm_running(snd_pcm_substream_t *substream)
static inline int snd_pcm_running(struct snd_pcm_substream *substream)
{
return (substream->runtime->status->state == SNDRV_PCM_STATE_RUNNING ||
(substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING &&
substream->stream == SNDRV_PCM_STREAM_PLAYBACK));
}
static inline ssize_t bytes_to_samples(snd_pcm_runtime_t *runtime, ssize_t size)
static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t size)
{
return size * 8 / runtime->sample_bits;
}
static inline snd_pcm_sframes_t bytes_to_frames(snd_pcm_runtime_t *runtime, ssize_t size)
static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
{
return size * 8 / runtime->frame_bits;
}
static inline ssize_t samples_to_bytes(snd_pcm_runtime_t *runtime, ssize_t size)
static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t size)
{
return size * runtime->sample_bits / 8;
}
static inline ssize_t frames_to_bytes(snd_pcm_runtime_t *runtime, snd_pcm_sframes_t size)
static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
{
return size * runtime->frame_bits / 8;
}
static inline int frame_aligned(snd_pcm_runtime_t *runtime, ssize_t bytes)
static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
{
return bytes % runtime->byte_align == 0;
}
static inline size_t snd_pcm_lib_buffer_bytes(snd_pcm_substream_t *substream)
static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
return frames_to_bytes(runtime, runtime->buffer_size);
}
static inline size_t snd_pcm_lib_period_bytes(snd_pcm_substream_t *substream)
static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
return frames_to_bytes(runtime, runtime->period_size);
}
/*
* result is: 0 ... (boundary - 1)
*/
static inline snd_pcm_uframes_t snd_pcm_playback_avail(snd_pcm_runtime_t *runtime)
static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
{
snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
if (avail < 0)
@ -685,7 +661,7 @@ static inline snd_pcm_uframes_t snd_pcm_playback_avail(snd_pcm_runtime_t *runtim
/*
* result is: 0 ... (boundary - 1)
*/
static inline snd_pcm_uframes_t snd_pcm_capture_avail(snd_pcm_runtime_t *runtime)
static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
{
snd_pcm_sframes_t avail = runtime->status->hw_ptr - runtime->control->appl_ptr;
if (avail < 0)
@ -693,12 +669,12 @@ static inline snd_pcm_uframes_t snd_pcm_capture_avail(snd_pcm_runtime_t *runtime
return avail;
}
static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(snd_pcm_runtime_t *runtime)
static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
{
return runtime->buffer_size - snd_pcm_playback_avail(runtime);
}
static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(snd_pcm_runtime_t *runtime)
static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
{
return runtime->buffer_size - snd_pcm_capture_avail(runtime);
}
@ -711,9 +687,9 @@ static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(snd_pcm_runtime_t *runt
*
* Returns non-zero if available, or zero if not.
*/
static inline int snd_pcm_playback_ready(snd_pcm_substream_t *substream)
static inline int snd_pcm_playback_ready(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
return snd_pcm_playback_avail(runtime) >= runtime->control->avail_min;
}
@ -725,9 +701,9 @@ static inline int snd_pcm_playback_ready(snd_pcm_substream_t *substream)
*
* Returns non-zero if available, or zero if not.
*/
static inline int snd_pcm_capture_ready(snd_pcm_substream_t *substream)
static inline int snd_pcm_capture_ready(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
return snd_pcm_capture_avail(runtime) >= runtime->control->avail_min;
}
@ -740,9 +716,9 @@ static inline int snd_pcm_capture_ready(snd_pcm_substream_t *substream)
*
* Returns non-zero if exists, or zero if not.
*/
static inline int snd_pcm_playback_data(snd_pcm_substream_t *substream)
static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
if (runtime->stop_threshold >= runtime->boundary)
return 1;
@ -757,9 +733,9 @@ static inline int snd_pcm_playback_data(snd_pcm_substream_t *substream)
*
* Returns non-zero if empty, or zero if not.
*/
static inline int snd_pcm_playback_empty(snd_pcm_substream_t *substream)
static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
return snd_pcm_playback_avail(runtime) >= runtime->buffer_size;
}
@ -771,14 +747,14 @@ static inline int snd_pcm_playback_empty(snd_pcm_substream_t *substream)
*
* Returns non-zero if empty, or zero if not.
*/
static inline int snd_pcm_capture_empty(snd_pcm_substream_t *substream)
static inline int snd_pcm_capture_empty(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
return snd_pcm_capture_avail(runtime) == 0;
}
static inline void snd_pcm_trigger_done(snd_pcm_substream_t *substream,
snd_pcm_substream_t *master)
static inline void snd_pcm_trigger_done(struct snd_pcm_substream *substream,
struct snd_pcm_substream *master)
{
substream->runtime->trigger_master = master;
}
@ -795,28 +771,28 @@ static inline int hw_is_interval(int var)
var <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL;
}
static inline snd_mask_t *hw_param_mask(snd_pcm_hw_params_t *params,
static inline struct snd_mask *hw_param_mask(struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var)
{
return &params->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
}
static inline snd_interval_t *hw_param_interval(snd_pcm_hw_params_t *params,
static inline struct snd_interval *hw_param_interval(struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var)
{
return &params->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
}
static inline const snd_mask_t *hw_param_mask_c(const snd_pcm_hw_params_t *params,
static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var)
{
return (const snd_mask_t *)hw_param_mask((snd_pcm_hw_params_t*) params, var);
return (const struct snd_mask *)hw_param_mask((struct snd_pcm_hw_params*) params, var);
}
static inline const snd_interval_t *hw_param_interval_c(const snd_pcm_hw_params_t *params,
static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var)
{
return (const snd_interval_t *)hw_param_interval((snd_pcm_hw_params_t*) params, var);
return (const struct snd_interval *)hw_param_interval((struct snd_pcm_hw_params*) params, var);
}
#define params_access(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_ACCESS))
@ -832,66 +808,66 @@ static inline const snd_interval_t *hw_param_interval_c(const snd_pcm_hw_params_
#define params_tick_time(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_TICK_TIME)->min
int snd_interval_refine(snd_interval_t *i, const snd_interval_t *v);
void snd_interval_mul(const snd_interval_t *a, const snd_interval_t *b, snd_interval_t *c);
void snd_interval_div(const snd_interval_t *a, const snd_interval_t *b, snd_interval_t *c);
void snd_interval_muldivk(const snd_interval_t *a, const snd_interval_t *b,
unsigned int k, snd_interval_t *c);
void snd_interval_mulkdiv(const snd_interval_t *a, unsigned int k,
const snd_interval_t *b, snd_interval_t *c);
int snd_interval_list(snd_interval_t *i, unsigned int count, unsigned int *list, unsigned int mask);
int snd_interval_ratnum(snd_interval_t *i,
unsigned int rats_count, ratnum_t *rats,
int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v);
void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c);
void snd_interval_div(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c);
void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interval *b,
unsigned int k, struct snd_interval *c);
void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
const struct snd_interval *b, struct snd_interval *c);
int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask);
int snd_interval_ratnum(struct snd_interval *i,
unsigned int rats_count, struct snd_ratnum *rats,
unsigned int *nump, unsigned int *denp);
void _snd_pcm_hw_params_any(snd_pcm_hw_params_t *params);
void _snd_pcm_hw_param_setempty(snd_pcm_hw_params_t *params, snd_pcm_hw_param_t var);
int snd_pcm_hw_param_near(snd_pcm_substream_t *substream,
snd_pcm_hw_params_t *params,
void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params);
void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var);
int snd_pcm_hw_param_near(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var,
unsigned int val, int *dir);
int snd_pcm_hw_param_set(snd_pcm_substream_t *pcm,
snd_pcm_hw_params_t *params,
int snd_pcm_hw_param_set(struct snd_pcm_substream *pcm,
struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var,
unsigned int val, int dir);
int snd_pcm_hw_params_choose(snd_pcm_substream_t *substream, snd_pcm_hw_params_t *params);
int snd_pcm_hw_params_choose(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
int snd_pcm_hw_refine(snd_pcm_substream_t *substream, snd_pcm_hw_params_t *params);
int snd_pcm_hw_refine(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
int snd_pcm_hw_constraints_init(snd_pcm_substream_t *substream);
int snd_pcm_hw_constraints_complete(snd_pcm_substream_t *substream);
int snd_pcm_hw_constraints_init(struct snd_pcm_substream *substream);
int snd_pcm_hw_constraints_complete(struct snd_pcm_substream *substream);
int snd_pcm_hw_constraint_mask(snd_pcm_runtime_t *runtime, snd_pcm_hw_param_t var,
int snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
u_int32_t mask);
int snd_pcm_hw_constraint_mask64(snd_pcm_runtime_t *runtime, snd_pcm_hw_param_t var,
int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
u_int64_t mask);
int snd_pcm_hw_constraint_minmax(snd_pcm_runtime_t *runtime, snd_pcm_hw_param_t var,
int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
unsigned int min, unsigned int max);
int snd_pcm_hw_constraint_integer(snd_pcm_runtime_t *runtime, snd_pcm_hw_param_t var);
int snd_pcm_hw_constraint_list(snd_pcm_runtime_t *runtime,
int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var);
int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
unsigned int cond,
snd_pcm_hw_param_t var,
snd_pcm_hw_constraint_list_t *l);
int snd_pcm_hw_constraint_ratnums(snd_pcm_runtime_t *runtime,
struct snd_pcm_hw_constraint_list *l);
int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime,
unsigned int cond,
snd_pcm_hw_param_t var,
snd_pcm_hw_constraint_ratnums_t *r);
int snd_pcm_hw_constraint_ratdens(snd_pcm_runtime_t *runtime,
struct snd_pcm_hw_constraint_ratnums *r);
int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime,
unsigned int cond,
snd_pcm_hw_param_t var,
snd_pcm_hw_constraint_ratdens_t *r);
int snd_pcm_hw_constraint_msbits(snd_pcm_runtime_t *runtime,
struct snd_pcm_hw_constraint_ratdens *r);
int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime,
unsigned int cond,
unsigned int width,
unsigned int msbits);
int snd_pcm_hw_constraint_step(snd_pcm_runtime_t *runtime,
int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
unsigned int cond,
snd_pcm_hw_param_t var,
unsigned long step);
int snd_pcm_hw_constraint_pow2(snd_pcm_runtime_t *runtime,
int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
unsigned int cond,
snd_pcm_hw_param_t var);
int snd_pcm_hw_rule_add(snd_pcm_runtime_t *runtime,
int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime,
unsigned int cond,
int var,
snd_pcm_hw_rule_func_t func, void *private,
@ -925,37 +901,37 @@ int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int
snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsignd, int big_endian);
const char *snd_pcm_format_name(snd_pcm_format_t format);
void snd_pcm_set_ops(snd_pcm_t * pcm, int direction, snd_pcm_ops_t *ops);
void snd_pcm_set_sync(snd_pcm_substream_t * substream);
int snd_pcm_lib_interleave_len(snd_pcm_substream_t *substream);
int snd_pcm_lib_ioctl(snd_pcm_substream_t *substream,
void snd_pcm_set_ops(struct snd_pcm * pcm, int direction, struct snd_pcm_ops *ops);
void snd_pcm_set_sync(struct snd_pcm_substream *substream);
int snd_pcm_lib_interleave_len(struct snd_pcm_substream *substream);
int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
unsigned int cmd, void *arg);
int snd_pcm_update_hw_ptr(snd_pcm_substream_t *substream);
int snd_pcm_playback_xrun_check(snd_pcm_substream_t *substream);
int snd_pcm_capture_xrun_check(snd_pcm_substream_t *substream);
int snd_pcm_playback_xrun_asap(snd_pcm_substream_t *substream);
int snd_pcm_capture_xrun_asap(snd_pcm_substream_t *substream);
void snd_pcm_playback_silence(snd_pcm_substream_t *substream, snd_pcm_uframes_t new_hw_ptr);
void snd_pcm_tick_prepare(snd_pcm_substream_t *substream);
void snd_pcm_tick_set(snd_pcm_substream_t *substream, unsigned long ticks);
void snd_pcm_tick_elapsed(snd_pcm_substream_t *substream);
void snd_pcm_period_elapsed(snd_pcm_substream_t *substream);
snd_pcm_sframes_t snd_pcm_lib_write(snd_pcm_substream_t *substream,
int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream);
int snd_pcm_playback_xrun_check(struct snd_pcm_substream *substream);
int snd_pcm_capture_xrun_check(struct snd_pcm_substream *substream);
int snd_pcm_playback_xrun_asap(struct snd_pcm_substream *substream);
int snd_pcm_capture_xrun_asap(struct snd_pcm_substream *substream);
void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_uframes_t new_hw_ptr);
void snd_pcm_tick_prepare(struct snd_pcm_substream *substream);
void snd_pcm_tick_set(struct snd_pcm_substream *substream, unsigned long ticks);
void snd_pcm_tick_elapsed(struct snd_pcm_substream *substream);
void snd_pcm_period_elapsed(struct snd_pcm_substream *substream);
snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream,
const void __user *buf,
snd_pcm_uframes_t frames);
snd_pcm_sframes_t snd_pcm_lib_read(snd_pcm_substream_t *substream,
snd_pcm_sframes_t snd_pcm_lib_read(struct snd_pcm_substream *substream,
void __user *buf, snd_pcm_uframes_t frames);
snd_pcm_sframes_t snd_pcm_lib_writev(snd_pcm_substream_t *substream,
snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream,
void __user **bufs, snd_pcm_uframes_t frames);
snd_pcm_sframes_t snd_pcm_lib_readv(snd_pcm_substream_t *substream,
snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream,
void __user **bufs, snd_pcm_uframes_t frames);
int snd_pcm_limit_hw_rates(snd_pcm_runtime_t *runtime);
int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime);
static inline void snd_pcm_set_runtime_buffer(snd_pcm_substream_t *substream,
static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
struct snd_dma_buffer *bufp)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
if (bufp) {
runtime->dma_buffer_p = bufp;
runtime->dma_area = bufp->area;
@ -973,47 +949,47 @@ static inline void snd_pcm_set_runtime_buffer(snd_pcm_substream_t *substream,
* Timer interface
*/
void snd_pcm_timer_resolution_change(snd_pcm_substream_t *substream);
void snd_pcm_timer_init(snd_pcm_substream_t * substream);
void snd_pcm_timer_done(snd_pcm_substream_t * substream);
void snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream);
void snd_pcm_timer_init(struct snd_pcm_substream *substream);
void snd_pcm_timer_done(struct snd_pcm_substream *substream);
/*
* Memory
*/
int snd_pcm_lib_preallocate_free(snd_pcm_substream_t *substream);
int snd_pcm_lib_preallocate_free_for_all(snd_pcm_t *pcm);
int snd_pcm_lib_preallocate_pages(snd_pcm_substream_t *substream,
int snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream);
int snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm);
int snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream,
int type, struct device *data,
size_t size, size_t max);
int snd_pcm_lib_preallocate_pages_for_all(snd_pcm_t *pcm,
int snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm,
int type, void *data,
size_t size, size_t max);
int snd_pcm_lib_malloc_pages(snd_pcm_substream_t *substream, size_t size);
int snd_pcm_lib_free_pages(snd_pcm_substream_t *substream);
int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size);
int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream);
#define snd_pcm_substream_sgbuf(substream) ((substream)->runtime->dma_buffer_p->private_data)
#define snd_pcm_sgbuf_pages(size) snd_sgbuf_aligned_pages(size)
#define snd_pcm_sgbuf_get_addr(sgbuf,ofs) snd_sgbuf_get_addr(sgbuf,ofs)
struct page *snd_pcm_sgbuf_ops_page(snd_pcm_substream_t *substream, unsigned long offset);
struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigned long offset);
/* handle mmap counter - PCM mmap callback should handle this counter properly */
static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area)
{
snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
atomic_inc(&substream->runtime->mmap_count);
}
static inline void snd_pcm_mmap_data_close(struct vm_area_struct *area)
{
snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
atomic_dec(&substream->runtime->mmap_count);
}
/* mmap for io-memory area */
#if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_ALPHA)
#define SNDRV_PCM_INFO_MMAP_IOMEM SNDRV_PCM_INFO_MMAP
int snd_pcm_lib_mmap_iomem(snd_pcm_substream_t *substream, struct vm_area_struct *area);
int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_struct *area);
#else
#define SNDRV_PCM_INFO_MMAP_IOMEM 0
#define snd_pcm_lib_mmap_iomem NULL

View File

@ -22,10 +22,7 @@
*
*/
typedef struct _snd_pcm_plugin snd_pcm_plugin_t;
typedef struct _snd_pcm_oss_setup snd_pcm_oss_setup_t;
struct _snd_pcm_oss_setup {
struct snd_pcm_oss_setup {
char *task_name;
unsigned int disable:1,
direct:1,
@ -36,10 +33,10 @@ struct _snd_pcm_oss_setup {
buggyptr:1;
unsigned int periods;
unsigned int period_size;
snd_pcm_oss_setup_t *next;
struct snd_pcm_oss_setup *next;
};
typedef struct _snd_pcm_oss_runtime {
struct snd_pcm_oss_runtime {
unsigned params: 1, /* format/parameter change */
prepare: 1, /* need to prepare the operation */
trigger: 1, /* trigger flag */
@ -59,30 +56,30 @@ typedef struct _snd_pcm_oss_runtime {
size_t mmap_bytes;
char *buffer; /* vmallocated period */
size_t buffer_used; /* used length from period buffer */
snd_pcm_plugin_t *plugin_first;
snd_pcm_plugin_t *plugin_last;
struct snd_pcm_plugin *plugin_first;
struct snd_pcm_plugin *plugin_last;
unsigned int prev_hw_ptr_interrupt;
} snd_pcm_oss_runtime_t;
};
typedef struct _snd_pcm_oss_file {
snd_pcm_substream_t *streams[2];
} snd_pcm_oss_file_t;
struct snd_pcm_oss_file {
struct snd_pcm_substream *streams[2];
};
typedef struct _snd_pcm_oss_substream {
struct snd_pcm_oss_substream {
unsigned oss: 1; /* oss mode */
snd_pcm_oss_setup_t *setup; /* active setup */
snd_pcm_oss_file_t *file;
} snd_pcm_oss_substream_t;
struct snd_pcm_oss_setup *setup; /* active setup */
struct snd_pcm_oss_file *file;
};
typedef struct _snd_pcm_oss_stream {
snd_pcm_oss_setup_t *setup_list; /* setup list */
struct snd_pcm_oss_stream {
struct snd_pcm_oss_setup *setup_list; /* setup list */
struct semaphore setup_mutex;
snd_info_entry_t *proc_entry;
} snd_pcm_oss_stream_t;
struct snd_info_entry *proc_entry;
};
typedef struct _snd_pcm_oss {
struct snd_pcm_oss {
int reg;
unsigned int reg_mask;
} snd_pcm_oss_t;
};
#endif /* __SOUND_PCM_OSS_H */

View File

@ -22,17 +22,17 @@
*
*/
extern int snd_pcm_hw_param_mask(snd_pcm_substream_t *pcm, snd_pcm_hw_params_t *params,
snd_pcm_hw_param_t var, const snd_mask_t *val);
extern unsigned int snd_pcm_hw_param_value_min(const snd_pcm_hw_params_t *params,
extern int snd_pcm_hw_param_mask(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var, const struct snd_mask *val);
extern unsigned int snd_pcm_hw_param_value_min(const struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var, int *dir);
extern unsigned int snd_pcm_hw_param_value_max(const snd_pcm_hw_params_t *params,
extern unsigned int snd_pcm_hw_param_value_max(const struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var, int *dir);
extern int _snd_pcm_hw_param_min(snd_pcm_hw_params_t *params,
extern int _snd_pcm_hw_param_min(struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var, unsigned int val, int dir);
extern int _snd_pcm_hw_param_setinteger(snd_pcm_hw_params_t *params,
extern int _snd_pcm_hw_param_setinteger(struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var);
extern int _snd_pcm_hw_param_set(snd_pcm_hw_params_t *params,
extern int _snd_pcm_hw_param_set(struct snd_pcm_hw_params *params,
snd_pcm_hw_param_t var, unsigned int val, int dir);
/* To share the same code we have alsa-lib */
@ -71,20 +71,20 @@ INLINE unsigned int ld2(u_int32_t v)
INLINE size_t snd_mask_sizeof(void)
{
return sizeof(snd_mask_t);
return sizeof(struct snd_mask);
}
INLINE void snd_mask_none(snd_mask_t *mask)
INLINE void snd_mask_none(struct snd_mask *mask)
{
memset(mask, 0, sizeof(*mask));
}
INLINE void snd_mask_any(snd_mask_t *mask)
INLINE void snd_mask_any(struct snd_mask *mask)
{
memset(mask, 0xff, SNDRV_MASK_SIZE * sizeof(u_int32_t));
}
INLINE int snd_mask_empty(const snd_mask_t *mask)
INLINE int snd_mask_empty(const struct snd_mask *mask)
{
int i;
for (i = 0; i < SNDRV_MASK_SIZE; i++)
@ -93,7 +93,7 @@ INLINE int snd_mask_empty(const snd_mask_t *mask)
return 1;
}
INLINE unsigned int snd_mask_min(const snd_mask_t *mask)
INLINE unsigned int snd_mask_min(const struct snd_mask *mask)
{
int i;
assert(!snd_mask_empty(mask));
@ -104,7 +104,7 @@ INLINE unsigned int snd_mask_min(const snd_mask_t *mask)
return 0;
}
INLINE unsigned int snd_mask_max(const snd_mask_t *mask)
INLINE unsigned int snd_mask_max(const struct snd_mask *mask)
{
int i;
assert(!snd_mask_empty(mask));
@ -115,19 +115,19 @@ INLINE unsigned int snd_mask_max(const snd_mask_t *mask)
return 0;
}
INLINE void snd_mask_set(snd_mask_t *mask, unsigned int val)
INLINE void snd_mask_set(struct snd_mask *mask, unsigned int val)
{
assert(val <= SNDRV_MASK_BITS);
mask->bits[MASK_OFS(val)] |= MASK_BIT(val);
}
INLINE void snd_mask_reset(snd_mask_t *mask, unsigned int val)
INLINE void snd_mask_reset(struct snd_mask *mask, unsigned int val)
{
assert(val <= SNDRV_MASK_BITS);
mask->bits[MASK_OFS(val)] &= ~MASK_BIT(val);
}
INLINE void snd_mask_set_range(snd_mask_t *mask, unsigned int from, unsigned int to)
INLINE void snd_mask_set_range(struct snd_mask *mask, unsigned int from, unsigned int to)
{
unsigned int i;
assert(to <= SNDRV_MASK_BITS && from <= to);
@ -135,7 +135,7 @@ INLINE void snd_mask_set_range(snd_mask_t *mask, unsigned int from, unsigned int
mask->bits[MASK_OFS(i)] |= MASK_BIT(i);
}
INLINE void snd_mask_reset_range(snd_mask_t *mask, unsigned int from, unsigned int to)
INLINE void snd_mask_reset_range(struct snd_mask *mask, unsigned int from, unsigned int to)
{
unsigned int i;
assert(to <= SNDRV_MASK_BITS && from <= to);
@ -143,7 +143,7 @@ INLINE void snd_mask_reset_range(snd_mask_t *mask, unsigned int from, unsigned i
mask->bits[MASK_OFS(i)] &= ~MASK_BIT(i);
}
INLINE void snd_mask_leave(snd_mask_t *mask, unsigned int val)
INLINE void snd_mask_leave(struct snd_mask *mask, unsigned int val)
{
unsigned int v;
assert(val <= SNDRV_MASK_BITS);
@ -152,30 +152,30 @@ INLINE void snd_mask_leave(snd_mask_t *mask, unsigned int val)
mask->bits[MASK_OFS(val)] = v;
}
INLINE void snd_mask_intersect(snd_mask_t *mask, const snd_mask_t *v)
INLINE void snd_mask_intersect(struct snd_mask *mask, const struct snd_mask *v)
{
int i;
for (i = 0; i < SNDRV_MASK_SIZE; i++)
mask->bits[i] &= v->bits[i];
}
INLINE int snd_mask_eq(const snd_mask_t *mask, const snd_mask_t *v)
INLINE int snd_mask_eq(const struct snd_mask *mask, const struct snd_mask *v)
{
return ! memcmp(mask, v, SNDRV_MASK_SIZE * sizeof(u_int32_t));
}
INLINE void snd_mask_copy(snd_mask_t *mask, const snd_mask_t *v)
INLINE void snd_mask_copy(struct snd_mask *mask, const struct snd_mask *v)
{
*mask = *v;
}
INLINE int snd_mask_test(const snd_mask_t *mask, unsigned int val)
INLINE int snd_mask_test(const struct snd_mask *mask, unsigned int val)
{
assert(val <= SNDRV_MASK_BITS);
return mask->bits[MASK_OFS(val)] & MASK_BIT(val);
}
INLINE int snd_mask_single(const snd_mask_t *mask)
INLINE int snd_mask_single(const struct snd_mask *mask)
{
int i, c = 0;
assert(!snd_mask_empty(mask));
@ -191,9 +191,9 @@ INLINE int snd_mask_single(const snd_mask_t *mask)
return 1;
}
INLINE int snd_mask_refine(snd_mask_t *mask, const snd_mask_t *v)
INLINE int snd_mask_refine(struct snd_mask *mask, const struct snd_mask *v)
{
snd_mask_t old;
struct snd_mask old;
assert(!snd_mask_empty(mask));
snd_mask_copy(&old, mask);
snd_mask_intersect(mask, v);
@ -202,7 +202,7 @@ INLINE int snd_mask_refine(snd_mask_t *mask, const snd_mask_t *v)
return !snd_mask_eq(mask, &old);
}
INLINE int snd_mask_refine_first(snd_mask_t *mask)
INLINE int snd_mask_refine_first(struct snd_mask *mask)
{
assert(!snd_mask_empty(mask));
if (snd_mask_single(mask))
@ -211,7 +211,7 @@ INLINE int snd_mask_refine_first(snd_mask_t *mask)
return 1;
}
INLINE int snd_mask_refine_last(snd_mask_t *mask)
INLINE int snd_mask_refine_last(struct snd_mask *mask)
{
assert(!snd_mask_empty(mask));
if (snd_mask_single(mask))
@ -220,7 +220,7 @@ INLINE int snd_mask_refine_last(snd_mask_t *mask)
return 1;
}
INLINE int snd_mask_refine_min(snd_mask_t *mask, unsigned int val)
INLINE int snd_mask_refine_min(struct snd_mask *mask, unsigned int val)
{
assert(!snd_mask_empty(mask));
if (snd_mask_min(mask) >= val)
@ -231,7 +231,7 @@ INLINE int snd_mask_refine_min(snd_mask_t *mask, unsigned int val)
return 1;
}
INLINE int snd_mask_refine_max(snd_mask_t *mask, unsigned int val)
INLINE int snd_mask_refine_max(struct snd_mask *mask, unsigned int val)
{
assert(!snd_mask_empty(mask));
if (snd_mask_max(mask) <= val)
@ -242,7 +242,7 @@ INLINE int snd_mask_refine_max(snd_mask_t *mask, unsigned int val)
return 1;
}
INLINE int snd_mask_refine_set(snd_mask_t *mask, unsigned int val)
INLINE int snd_mask_refine_set(struct snd_mask *mask, unsigned int val)
{
int changed;
assert(!snd_mask_empty(mask));
@ -253,13 +253,13 @@ INLINE int snd_mask_refine_set(snd_mask_t *mask, unsigned int val)
return changed;
}
INLINE int snd_mask_value(const snd_mask_t *mask)
INLINE int snd_mask_value(const struct snd_mask *mask)
{
assert(!snd_mask_empty(mask));
return snd_mask_min(mask);
}
INLINE void snd_interval_any(snd_interval_t *i)
INLINE void snd_interval_any(struct snd_interval *i)
{
i->min = 0;
i->openmin = 0;
@ -269,42 +269,42 @@ INLINE void snd_interval_any(snd_interval_t *i)
i->empty = 0;
}
INLINE void snd_interval_none(snd_interval_t *i)
INLINE void snd_interval_none(struct snd_interval *i)
{
i->empty = 1;
}
INLINE int snd_interval_checkempty(const snd_interval_t *i)
INLINE int snd_interval_checkempty(const struct snd_interval *i)
{
return (i->min > i->max ||
(i->min == i->max && (i->openmin || i->openmax)));
}
INLINE int snd_interval_empty(const snd_interval_t *i)
INLINE int snd_interval_empty(const struct snd_interval *i)
{
return i->empty;
}
INLINE int snd_interval_single(const snd_interval_t *i)
INLINE int snd_interval_single(const struct snd_interval *i)
{
assert(!snd_interval_empty(i));
return (i->min == i->max ||
(i->min + 1 == i->max && i->openmax));
}
INLINE int snd_interval_value(const snd_interval_t *i)
INLINE int snd_interval_value(const struct snd_interval *i)
{
assert(snd_interval_single(i));
return i->min;
}
INLINE int snd_interval_min(const snd_interval_t *i)
INLINE int snd_interval_min(const struct snd_interval *i)
{
assert(!snd_interval_empty(i));
return i->min;
}
INLINE int snd_interval_max(const snd_interval_t *i)
INLINE int snd_interval_max(const struct snd_interval *i)
{
unsigned int v;
assert(!snd_interval_empty(i));
@ -314,18 +314,18 @@ INLINE int snd_interval_max(const snd_interval_t *i)
return v;
}
INLINE int snd_interval_test(const snd_interval_t *i, unsigned int val)
INLINE int snd_interval_test(const struct snd_interval *i, unsigned int val)
{
return !((i->min > val || (i->min == val && i->openmin) ||
i->max < val || (i->max == val && i->openmax)));
}
INLINE void snd_interval_copy(snd_interval_t *d, const snd_interval_t *s)
INLINE void snd_interval_copy(struct snd_interval *d, const struct snd_interval *s)
{
*d = *s;
}
INLINE int snd_interval_setinteger(snd_interval_t *i)
INLINE int snd_interval_setinteger(struct snd_interval *i)
{
if (i->integer)
return 0;
@ -335,7 +335,7 @@ INLINE int snd_interval_setinteger(snd_interval_t *i)
return 1;
}
INLINE int snd_interval_eq(const snd_interval_t *i1, const snd_interval_t *i2)
INLINE int snd_interval_eq(const struct snd_interval *i1, const struct snd_interval *i2)
{
if (i1->empty)
return i2->empty;

View File

@ -36,11 +36,6 @@
* Raw MIDI interface
*/
typedef enum sndrv_rawmidi_stream snd_rawmidi_stream_t;
typedef struct sndrv_rawmidi_info snd_rawmidi_info_t;
typedef struct sndrv_rawmidi_params snd_rawmidi_params_t;
typedef struct sndrv_rawmidi_status snd_rawmidi_status_t;
#define SNDRV_RAWMIDI_DEVICES 8
#define SNDRV_RAWMIDI_LFLG_OUTPUT (1<<0)
@ -49,23 +44,22 @@ typedef struct sndrv_rawmidi_status snd_rawmidi_status_t;
#define SNDRV_RAWMIDI_LFLG_APPEND (1<<2)
#define SNDRV_RAWMIDI_LFLG_NOOPENLOCK (1<<3)
typedef struct _snd_rawmidi_runtime snd_rawmidi_runtime_t;
typedef struct _snd_rawmidi_substream snd_rawmidi_substream_t;
typedef struct _snd_rawmidi_str snd_rawmidi_str_t;
struct snd_rawmidi;
struct snd_rawmidi_substream;
typedef struct _snd_rawmidi_ops {
int (*open) (snd_rawmidi_substream_t * substream);
int (*close) (snd_rawmidi_substream_t * substream);
void (*trigger) (snd_rawmidi_substream_t * substream, int up);
void (*drain) (snd_rawmidi_substream_t * substream);
} snd_rawmidi_ops_t;
struct snd_rawmidi_ops {
int (*open) (struct snd_rawmidi_substream * substream);
int (*close) (struct snd_rawmidi_substream * substream);
void (*trigger) (struct snd_rawmidi_substream * substream, int up);
void (*drain) (struct snd_rawmidi_substream * substream);
};
typedef struct _snd_rawmidi_global_ops {
int (*dev_register) (snd_rawmidi_t * rmidi);
int (*dev_unregister) (snd_rawmidi_t * rmidi);
} snd_rawmidi_global_ops_t;
struct snd_rawmidi_global_ops {
int (*dev_register) (struct snd_rawmidi * rmidi);
int (*dev_unregister) (struct snd_rawmidi * rmidi);
};
struct _snd_rawmidi_runtime {
struct snd_rawmidi_runtime {
unsigned int drain: 1, /* drain stage */
oss: 1; /* OSS compatible mode */
/* midi stream buffer */
@ -80,15 +74,15 @@ struct _snd_rawmidi_runtime {
spinlock_t lock;
wait_queue_head_t sleep;
/* event handler (new bytes, input only) */
void (*event)(snd_rawmidi_substream_t *substream);
void (*event)(struct snd_rawmidi_substream *substream);
/* defers calls to event [input] or ops->trigger [output] */
struct tasklet_struct tasklet;
/* private data */
void *private_data;
void (*private_free)(snd_rawmidi_substream_t *substream);
void (*private_free)(struct snd_rawmidi_substream *substream);
};
struct _snd_rawmidi_substream {
struct snd_rawmidi_substream {
struct list_head list; /* list of all substream for given stream */
int stream; /* direction */
int number; /* substream number */
@ -97,29 +91,29 @@ struct _snd_rawmidi_substream {
active_sensing: 1; /* send active sensing when close */
int use_count; /* use counter (for output) */
size_t bytes;
snd_rawmidi_t *rmidi;
snd_rawmidi_str_t *pstr;
struct snd_rawmidi *rmidi;
struct snd_rawmidi_str *pstr;
char name[32];
snd_rawmidi_runtime_t *runtime;
struct snd_rawmidi_runtime *runtime;
/* hardware layer */
snd_rawmidi_ops_t *ops;
struct snd_rawmidi_ops *ops;
};
typedef struct _snd_rawmidi_file {
snd_rawmidi_t *rmidi;
snd_rawmidi_substream_t *input;
snd_rawmidi_substream_t *output;
} snd_rawmidi_file_t;
struct snd_rawmidi_file {
struct snd_rawmidi *rmidi;
struct snd_rawmidi_substream *input;
struct snd_rawmidi_substream *output;
};
struct _snd_rawmidi_str {
struct snd_rawmidi_str {
unsigned int substream_count;
unsigned int substream_opened;
struct list_head substreams;
};
struct _snd_rawmidi {
snd_card_t *card;
struct snd_rawmidi {
struct snd_card *card;
struct list_head list;
unsigned int device; /* device number */
unsigned int info_flags; /* SNDRV_RAWMIDI_INFO_XXXX */
char id[64];
@ -129,52 +123,61 @@ struct _snd_rawmidi {
int ossreg;
#endif
snd_rawmidi_global_ops_t *ops;
struct snd_rawmidi_global_ops *ops;
snd_rawmidi_str_t streams[2];
struct snd_rawmidi_str streams[2];
void *private_data;
void (*private_free) (snd_rawmidi_t *rmidi);
void (*private_free) (struct snd_rawmidi *rmidi);
struct semaphore open_mutex;
wait_queue_head_t open_wait;
snd_info_entry_t *dev;
snd_info_entry_t *proc_entry;
struct snd_info_entry *dev;
struct snd_info_entry *proc_entry;
#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
snd_seq_device_t *seq_dev;
struct snd_seq_device *seq_dev;
#endif
};
/* main rawmidi functions */
int snd_rawmidi_new(snd_card_t * card, char *id, int device,
int snd_rawmidi_new(struct snd_card *card, char *id, int device,
int output_count, int input_count,
snd_rawmidi_t ** rmidi);
void snd_rawmidi_set_ops(snd_rawmidi_t * rmidi, int stream, snd_rawmidi_ops_t * ops);
struct snd_rawmidi **rmidi);
void snd_rawmidi_set_ops(struct snd_rawmidi *rmidi, int stream,
struct snd_rawmidi_ops *ops);
/* callbacks */
void snd_rawmidi_receive_reset(snd_rawmidi_substream_t * substream);
int snd_rawmidi_receive(snd_rawmidi_substream_t * substream, const unsigned char *buffer, int count);
void snd_rawmidi_transmit_reset(snd_rawmidi_substream_t * substream);
int snd_rawmidi_transmit_empty(snd_rawmidi_substream_t * substream);
int snd_rawmidi_transmit_peek(snd_rawmidi_substream_t * substream, unsigned char *buffer, int count);
int snd_rawmidi_transmit_ack(snd_rawmidi_substream_t * substream, int count);
int snd_rawmidi_transmit(snd_rawmidi_substream_t * substream, unsigned char *buffer, int count);
void snd_rawmidi_receive_reset(struct snd_rawmidi_substream *substream);
int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,
const unsigned char *buffer, int count);
void snd_rawmidi_transmit_reset(struct snd_rawmidi_substream *substream);
int snd_rawmidi_transmit_empty(struct snd_rawmidi_substream *substream);
int snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
unsigned char *buffer, int count);
int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count);
int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
unsigned char *buffer, int count);
/* main midi functions */
int snd_rawmidi_info_select(snd_card_t *card, snd_rawmidi_info_t *info);
int snd_rawmidi_kernel_open(int cardnum, int device, int subdevice, int mode, snd_rawmidi_file_t * rfile);
int snd_rawmidi_kernel_release(snd_rawmidi_file_t * rfile);
int snd_rawmidi_output_params(snd_rawmidi_substream_t * substream, snd_rawmidi_params_t * params);
int snd_rawmidi_input_params(snd_rawmidi_substream_t * substream, snd_rawmidi_params_t * params);
int snd_rawmidi_drop_output(snd_rawmidi_substream_t * substream);
int snd_rawmidi_drain_output(snd_rawmidi_substream_t * substream);
int snd_rawmidi_drain_input(snd_rawmidi_substream_t * substream);
long snd_rawmidi_kernel_read(snd_rawmidi_substream_t * substream, unsigned char *buf, long count);
long snd_rawmidi_kernel_write(snd_rawmidi_substream_t * substream, const unsigned char *buf, long count);
int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info);
int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice,
int mode, struct snd_rawmidi_file *rfile);
int snd_rawmidi_kernel_release(struct snd_rawmidi_file *rfile);
int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream,
struct snd_rawmidi_params *params);
int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream,
struct snd_rawmidi_params *params);
int snd_rawmidi_drop_output(struct snd_rawmidi_substream *substream);
int snd_rawmidi_drain_output(struct snd_rawmidi_substream *substream);
int snd_rawmidi_drain_input(struct snd_rawmidi_substream *substream);
long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
unsigned char *buf, long count);
long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream,
const unsigned char *buf, long count);
#endif /* __SOUND_RAWMIDI_H */

View File

@ -60,7 +60,7 @@ enum sb_hw_type {
#define SB_MPU_INPUT 1
struct _snd_sb {
struct snd_sb {
unsigned long port; /* base port of DSP chip */
struct resource *res_port;
unsigned long mpu_port; /* MPU port for SB DSP 4.0+ */
@ -92,24 +92,26 @@ struct _snd_sb {
void *csp; /* used only when CONFIG_SND_SB16_CSP is set */
snd_card_t *card;
snd_pcm_t *pcm;
snd_pcm_substream_t *playback_substream;
snd_pcm_substream_t *capture_substream;
struct snd_card *card;
struct snd_pcm *pcm;
struct snd_pcm_substream *playback_substream;
struct snd_pcm_substream *capture_substream;
snd_rawmidi_t *rmidi;
snd_rawmidi_substream_t *midi_substream_input;
snd_rawmidi_substream_t *midi_substream_output;
struct snd_rawmidi *rmidi;
struct snd_rawmidi_substream *midi_substream_input;
struct snd_rawmidi_substream *midi_substream_output;
irqreturn_t (*rmidi_callback)(int irq, void *dev_id, struct pt_regs *regs);
spinlock_t reg_lock;
spinlock_t open_lock;
spinlock_t midi_input_lock;
snd_info_entry_t *proc_entry;
};
struct snd_info_entry *proc_entry;
typedef struct _snd_sb sb_t;
#ifdef CONFIG_PM
unsigned char saved_regs[0x20];
#endif
};
/* I/O ports */
@ -267,48 +269,52 @@ typedef struct _snd_sb sb_t;
*
*/
static inline void snd_sb_ack_8bit(sb_t *chip)
static inline void snd_sb_ack_8bit(struct snd_sb *chip)
{
inb(SBP(chip, DATA_AVAIL));
}
static inline void snd_sb_ack_16bit(sb_t *chip)
static inline void snd_sb_ack_16bit(struct snd_sb *chip)
{
inb(SBP(chip, DATA_AVAIL_16));
}
/* sb_common.c */
int snd_sbdsp_command(sb_t *chip, unsigned char val);
int snd_sbdsp_get_byte(sb_t *chip);
int snd_sbdsp_reset(sb_t *chip);
int snd_sbdsp_create(snd_card_t *card,
int snd_sbdsp_command(struct snd_sb *chip, unsigned char val);
int snd_sbdsp_get_byte(struct snd_sb *chip);
int snd_sbdsp_reset(struct snd_sb *chip);
int snd_sbdsp_create(struct snd_card *card,
unsigned long port,
int irq,
irqreturn_t (*irq_handler)(int, void *, struct pt_regs *),
int dma8, int dma16,
unsigned short hardware,
sb_t **r_chip);
struct snd_sb **r_chip);
/* sb_mixer.c */
void snd_sbmixer_write(sb_t *chip, unsigned char reg, unsigned char data);
unsigned char snd_sbmixer_read(sb_t *chip, unsigned char reg);
int snd_sbmixer_new(sb_t *chip);
void snd_sbmixer_write(struct snd_sb *chip, unsigned char reg, unsigned char data);
unsigned char snd_sbmixer_read(struct snd_sb *chip, unsigned char reg);
int snd_sbmixer_new(struct snd_sb *chip);
#ifdef CONFIG_PM
void snd_sbmixer_suspend(struct snd_sb *chip);
void snd_sbmixer_resume(struct snd_sb *chip);
#endif
/* sb8_init.c */
int snd_sb8dsp_pcm(sb_t *chip, int device, snd_pcm_t ** rpcm);
int snd_sb8dsp_pcm(struct snd_sb *chip, int device, struct snd_pcm ** rpcm);
/* sb8.c */
irqreturn_t snd_sb8dsp_interrupt(sb_t *chip);
int snd_sb8_playback_open(snd_pcm_substream_t *substream);
int snd_sb8_capture_open(snd_pcm_substream_t *substream);
int snd_sb8_playback_close(snd_pcm_substream_t *substream);
int snd_sb8_capture_close(snd_pcm_substream_t *substream);
irqreturn_t snd_sb8dsp_interrupt(struct snd_sb *chip);
int snd_sb8_playback_open(struct snd_pcm_substream *substream);
int snd_sb8_capture_open(struct snd_pcm_substream *substream);
int snd_sb8_playback_close(struct snd_pcm_substream *substream);
int snd_sb8_capture_close(struct snd_pcm_substream *substream);
/* midi8.c */
irqreturn_t snd_sb8dsp_midi_interrupt(sb_t *chip);
int snd_sb8dsp_midi(sb_t *chip, int device, snd_rawmidi_t ** rrawmidi);
irqreturn_t snd_sb8dsp_midi_interrupt(struct snd_sb *chip);
int snd_sb8dsp_midi(struct snd_sb *chip, int device, struct snd_rawmidi ** rrawmidi);
/* sb16_init.c */
int snd_sb16dsp_pcm(sb_t *chip, int device, snd_pcm_t ** rpcm);
const snd_pcm_ops_t *snd_sb16dsp_get_pcm_ops(int direction);
int snd_sb16dsp_configure(sb_t *chip);
int snd_sb16dsp_pcm(struct snd_sb *chip, int device, struct snd_pcm ** rpcm);
const struct snd_pcm_ops *snd_sb16dsp_get_pcm_ops(int direction);
int snd_sb16dsp_configure(struct snd_sb *chip);
/* sb16.c */
irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs);
@ -328,7 +334,7 @@ enum {
#define SB_MIXVAL_INPUT_SW(reg1, reg2, left_shift, right_shift) \
((reg1) | ((reg2) << 8) | ((left_shift) << 16) | ((right_shift) << 24))
int snd_sbmixer_add_ctl(sb_t *chip, const char *name, int index, int type, unsigned long value);
int snd_sbmixer_add_ctl(struct snd_sb *chip, const char *name, int index, int type, unsigned long value);
/* for ease of use */
struct sbmix_elem {
@ -352,7 +358,7 @@ struct sbmix_elem {
.type = SB_MIX_INPUT_SW, \
.private_value = SB_MIXVAL_INPUT_SW(reg1, reg2, left_shift, right_shift) }
static inline int snd_sbmixer_add_ctl_elem(sb_t *chip, const struct sbmix_elem *c)
static inline int snd_sbmixer_add_ctl_elem(struct snd_sb *chip, const struct sbmix_elem *c)
{
return snd_sbmixer_add_ctl(chip, c->name, 0, c->type, c->private_value);
}

View File

@ -63,25 +63,25 @@
#define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE 0x3000
/* microcode header */
typedef struct snd_sb_csp_mc_header {
struct snd_sb_csp_mc_header {
char codec_name[16]; /* id name of codec */
unsigned short func_req; /* requested function */
} snd_sb_csp_mc_header_t;
};
/* microcode to be loaded */
typedef struct snd_sb_csp_microcode {
snd_sb_csp_mc_header_t info;
struct snd_sb_csp_microcode {
struct snd_sb_csp_mc_header info;
unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE];
} snd_sb_csp_microcode_t;
};
/* start CSP with sample_width in mono/stereo */
typedef struct snd_sb_csp_start {
struct snd_sb_csp_start {
int sample_width; /* sample width, look above */
int channels; /* channels, look above */
} snd_sb_csp_start_t;
};
/* CSP information */
typedef struct snd_sb_csp_info {
struct snd_sb_csp_info {
char codec_name[16]; /* id name of codec */
unsigned short func_nr; /* function number */
unsigned int acc_format; /* accepted PCM formats */
@ -93,17 +93,17 @@ typedef struct snd_sb_csp_info {
unsigned short run_width; /* current sample width */
unsigned short version; /* version id: 0x10 - 0x1f */
unsigned short state; /* state bits */
} snd_sb_csp_info_t;
};
/* HWDEP controls */
/* get CSP information */
#define SNDRV_SB_CSP_IOCTL_INFO _IOR('H', 0x10, snd_sb_csp_info_t)
#define SNDRV_SB_CSP_IOCTL_INFO _IOR('H', 0x10, struct snd_sb_csp_info)
/* load microcode to CSP */
#define SNDRV_SB_CSP_IOCTL_LOAD_CODE _IOW('H', 0x11, snd_sb_csp_microcode_t)
#define SNDRV_SB_CSP_IOCTL_LOAD_CODE _IOW('H', 0x11, struct snd_sb_csp_microcode)
/* unload microcode from CSP */
#define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE _IO('H', 0x12)
/* start CSP */
#define SNDRV_SB_CSP_IOCTL_START _IOW('H', 0x13, snd_sb_csp_start_t)
#define SNDRV_SB_CSP_IOCTL_START _IOW('H', 0x13, struct snd_sb_csp_start)
/* stop CSP */
#define SNDRV_SB_CSP_IOCTL_STOP _IO('H', 0x14)
/* pause CSP and DMA transfer */
@ -115,25 +115,25 @@ typedef struct snd_sb_csp_info {
#include "sb.h"
#include "hwdep.h"
typedef struct snd_sb_csp snd_sb_csp_t;
struct snd_sb_csp;
/*
* CSP operators
*/
typedef struct {
int (*csp_use) (snd_sb_csp_t * p);
int (*csp_unuse) (snd_sb_csp_t * p);
int (*csp_autoload) (snd_sb_csp_t * p, int pcm_sfmt, int play_rec_mode);
int (*csp_start) (snd_sb_csp_t * p, int sample_width, int channels);
int (*csp_stop) (snd_sb_csp_t * p);
int (*csp_qsound_transfer) (snd_sb_csp_t * p);
} snd_sb_csp_ops_t;
struct snd_sb_csp_ops {
int (*csp_use) (struct snd_sb_csp * p);
int (*csp_unuse) (struct snd_sb_csp * p);
int (*csp_autoload) (struct snd_sb_csp * p, int pcm_sfmt, int play_rec_mode);
int (*csp_start) (struct snd_sb_csp * p, int sample_width, int channels);
int (*csp_stop) (struct snd_sb_csp * p);
int (*csp_qsound_transfer) (struct snd_sb_csp * p);
};
/*
* CSP private data
*/
struct snd_sb_csp {
sb_t *chip; /* SB16 DSP */
struct snd_sb *chip; /* SB16 DSP */
int used; /* usage flag - exclusive */
char codec_name[16]; /* name of codec */
unsigned short func_nr; /* function number */
@ -147,7 +147,7 @@ struct snd_sb_csp {
int version; /* CSP version (0x10 - 0x1f) */
int running; /* running state */
snd_sb_csp_ops_t ops; /* operators */
struct snd_sb_csp_ops ops; /* operators */
spinlock_t q_lock; /* locking */
int q_enabled; /* enabled flag */
@ -155,13 +155,13 @@ struct snd_sb_csp {
int qpos_right; /* right position */
int qpos_changed; /* position changed flag */
snd_kcontrol_t *qsound_switch;
snd_kcontrol_t *qsound_space;
struct snd_kcontrol *qsound_switch;
struct snd_kcontrol *qsound_space;
struct semaphore access_mutex; /* locking */
};
int snd_sb_csp_new(sb_t *chip, int device, snd_hwdep_t ** rhwdep);
int snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep);
#endif
#endif /* __SOUND_SB16_CSP */

View File

@ -21,9 +21,6 @@
*
*/
typedef struct snd_seq_device snd_seq_device_t;
typedef struct snd_seq_dev_ops snd_seq_dev_ops_t;
/*
* registered device information
*/
@ -36,7 +33,7 @@ typedef struct snd_seq_dev_ops snd_seq_dev_ops_t;
struct snd_seq_device {
/* device info */
snd_card_t *card; /* sound card */
struct snd_card *card; /* sound card */
int device; /* device number */
char id[ID_LEN]; /* driver id */
char name[80]; /* device name */
@ -44,7 +41,7 @@ struct snd_seq_device {
void *driver_data; /* private data for driver */
int status; /* flag - read only */
void *private_data; /* private data for the caller */
void (*private_free)(snd_seq_device_t *device);
void (*private_free)(struct snd_seq_device *device);
struct list_head list; /* link to next device */
};
@ -63,19 +60,19 @@ struct snd_seq_device {
* Typically, call snd_device_free(dev->card, dev->driver_data)
*/
struct snd_seq_dev_ops {
int (*init_device)(snd_seq_device_t *dev);
int (*free_device)(snd_seq_device_t *dev);
int (*init_device)(struct snd_seq_device *dev);
int (*free_device)(struct snd_seq_device *dev);
};
/*
* prototypes
*/
void snd_seq_device_load_drivers(void);
int snd_seq_device_new(snd_card_t *card, int device, char *id, int argsize, snd_seq_device_t **result);
int snd_seq_device_register_driver(char *id, snd_seq_dev_ops_t *entry, int argsize);
int snd_seq_device_new(struct snd_card *card, int device, char *id, int argsize, struct snd_seq_device **result);
int snd_seq_device_register_driver(char *id, struct snd_seq_dev_ops *entry, int argsize);
int snd_seq_device_unregister_driver(char *id);
#define SNDRV_SEQ_DEVICE_ARGPTR(dev) (void *)((char *)(dev) + sizeof(snd_seq_device_t))
#define SNDRV_SEQ_DEVICE_ARGPTR(dev) (void *)((char *)(dev) + sizeof(struct snd_seq_device))
/*
@ -84,5 +81,4 @@ int snd_seq_device_unregister_driver(char *id);
#define SNDRV_SEQ_DEV_ID_MIDISYNTH "seq-midi"
#define SNDRV_SEQ_DEV_ID_OPL3 "opl3-synth"
#endif /* __SOUND_SEQ_DEVICE_H */

View File

@ -24,29 +24,27 @@
#include "seq_kernel.h"
/* Instrument cluster */
typedef struct _snd_seq_kcluster {
struct snd_seq_kcluster {
snd_seq_instr_cluster_t cluster;
char name[32];
int priority;
struct _snd_seq_kcluster *next;
} snd_seq_kcluster_t;
struct snd_seq_kcluster *next;
};
/* return pointer to private data */
#define KINSTR_DATA(kinstr) (void *)(((char *)kinstr) + sizeof(snd_seq_kinstr_t))
typedef struct snd_seq_kinstr_ops snd_seq_kinstr_ops_t;
#define KINSTR_DATA(kinstr) (void *)(((char *)kinstr) + sizeof(struct snd_seq_kinstr))
/* Instrument structure */
typedef struct _snd_seq_kinstr {
snd_seq_instr_t instr;
struct snd_seq_kinstr {
struct snd_seq_instr instr;
char name[32];
int type; /* instrument type */
int use; /* use count */
int busy; /* not useable */
int add_len; /* additional length */
snd_seq_kinstr_ops_t *ops; /* operations */
struct _snd_seq_kinstr *next;
} snd_seq_kinstr_t;
struct snd_seq_kinstr_ops *ops; /* operations */
struct snd_seq_kinstr *next;
};
#define SNDRV_SEQ_INSTR_HASH_SIZE 32
@ -54,11 +52,11 @@ typedef struct _snd_seq_kinstr {
#define SNDRV_SEQ_INSTR_FLG_DIRECT (1<<0) /* accept only direct events */
/* List of all instruments */
typedef struct {
snd_seq_kinstr_t *hash[SNDRV_SEQ_INSTR_HASH_SIZE];
struct snd_seq_kinstr_list {
struct snd_seq_kinstr *hash[SNDRV_SEQ_INSTR_HASH_SIZE];
int count; /* count of all instruments */
snd_seq_kcluster_t *chash[SNDRV_SEQ_INSTR_HASH_SIZE];
struct snd_seq_kcluster *chash[SNDRV_SEQ_INSTR_HASH_SIZE];
int ccount; /* count of all clusters */
int owner; /* current owner of the instrument list */
@ -68,7 +66,7 @@ typedef struct {
spinlock_t ops_lock;
struct semaphore ops_mutex;
unsigned long ops_flags;
} snd_seq_kinstr_list_t;
};
#define SNDRV_SEQ_INSTR_NOTIFY_REMOVE 0
#define SNDRV_SEQ_INSTR_NOTIFY_CHANGE 1
@ -78,33 +76,33 @@ struct snd_seq_kinstr_ops {
long add_len; /* additional length */
char *instr_type;
int (*info)(void *private_data, char *info_data, long len);
int (*put)(void *private_data, snd_seq_kinstr_t *kinstr,
int (*put)(void *private_data, struct snd_seq_kinstr *kinstr,
char __user *instr_data, long len, int atomic, int cmd);
int (*get)(void *private_data, snd_seq_kinstr_t *kinstr,
int (*get)(void *private_data, struct snd_seq_kinstr *kinstr,
char __user *instr_data, long len, int atomic, int cmd);
int (*get_size)(void *private_data, snd_seq_kinstr_t *kinstr, long *size);
int (*remove)(void *private_data, snd_seq_kinstr_t *kinstr, int atomic);
void (*notify)(void *private_data, snd_seq_kinstr_t *kinstr, int what);
int (*get_size)(void *private_data, struct snd_seq_kinstr *kinstr, long *size);
int (*remove)(void *private_data, struct snd_seq_kinstr *kinstr, int atomic);
void (*notify)(void *private_data, struct snd_seq_kinstr *kinstr, int what);
struct snd_seq_kinstr_ops *next;
};
/* instrument operations */
snd_seq_kinstr_list_t *snd_seq_instr_list_new(void);
void snd_seq_instr_list_free(snd_seq_kinstr_list_t **list);
int snd_seq_instr_list_free_cond(snd_seq_kinstr_list_t *list,
snd_seq_instr_header_t *ifree,
struct snd_seq_kinstr_list *snd_seq_instr_list_new(void);
void snd_seq_instr_list_free(struct snd_seq_kinstr_list **list);
int snd_seq_instr_list_free_cond(struct snd_seq_kinstr_list *list,
struct snd_seq_instr_header *ifree,
int client,
int atomic);
snd_seq_kinstr_t *snd_seq_instr_find(snd_seq_kinstr_list_t *list,
snd_seq_instr_t *instr,
int exact,
int follow_alias);
void snd_seq_instr_free_use(snd_seq_kinstr_list_t *list,
snd_seq_kinstr_t *instr);
int snd_seq_instr_event(snd_seq_kinstr_ops_t *ops,
snd_seq_kinstr_list_t *list,
snd_seq_event_t *ev,
struct snd_seq_kinstr *snd_seq_instr_find(struct snd_seq_kinstr_list *list,
struct snd_seq_instr *instr,
int exact,
int follow_alias);
void snd_seq_instr_free_use(struct snd_seq_kinstr_list *list,
struct snd_seq_kinstr *instr);
int snd_seq_instr_event(struct snd_seq_kinstr_ops *ops,
struct snd_seq_kinstr_list *list,
struct snd_seq_event *ev,
int client,
int atomic,
int hop);

View File

@ -24,62 +24,8 @@
#include <linux/time.h>
#include "asequencer.h"
typedef sndrv_seq_tick_time_t snd_seq_tick_time_t;
typedef sndrv_seq_position_t snd_seq_position_t;
typedef sndrv_seq_frequency_t snd_seq_frequency_t;
typedef sndrv_seq_instr_cluster_t snd_seq_instr_cluster_t;
typedef enum sndrv_seq_client_type snd_seq_client_type_t;
typedef enum sndrv_seq_stop_mode snd_seq_stop_mode_t;
typedef struct sndrv_seq_port_info snd_seq_port_info_t;
typedef struct sndrv_seq_port_subscribe snd_seq_port_subscribe_t;
typedef struct sndrv_seq_event snd_seq_event_t;
typedef struct sndrv_seq_addr snd_seq_addr_t;
typedef struct sndrv_seq_ev_volume snd_seq_ev_volume_t;
typedef struct sndrv_seq_ev_loop snd_seq_ev_loop_t;
typedef struct sndrv_seq_remove_events snd_seq_remove_events_t;
typedef struct sndrv_seq_query_subs snd_seq_query_subs_t;
typedef struct sndrv_seq_real_time snd_seq_real_time_t;
typedef struct sndrv_seq_system_info snd_seq_system_info_t;
typedef struct sndrv_seq_client_info snd_seq_client_info_t;
typedef struct sndrv_seq_queue_info snd_seq_queue_info_t;
typedef struct sndrv_seq_queue_status snd_seq_queue_status_t;
typedef struct sndrv_seq_queue_tempo snd_seq_queue_tempo_t;
typedef struct sndrv_seq_queue_owner snd_seq_queue_owner_t;
typedef struct sndrv_seq_queue_timer snd_seq_queue_timer_t;
typedef struct sndrv_seq_queue_client snd_seq_queue_client_t;
typedef struct sndrv_seq_client_pool snd_seq_client_pool_t;
typedef struct sndrv_seq_instr snd_seq_instr_t;
typedef struct sndrv_seq_instr_data snd_seq_instr_data_t;
typedef struct sndrv_seq_instr_header snd_seq_instr_header_t;
typedef union sndrv_seq_timestamp snd_seq_timestamp_t;
#define snd_seq_event_bounce_ext_data sndrv_seq_event_bounce_ext_data
#define snd_seq_ev_is_result_type sndrv_seq_ev_is_result_type
#define snd_seq_ev_is_channel_type sndrv_seq_ev_is_channel_type
#define snd_seq_ev_is_note_type sndrv_seq_ev_is_note_type
#define snd_seq_ev_is_control_type sndrv_seq_ev_is_control_type
#define snd_seq_ev_is_queue_type sndrv_seq_ev_is_queue_type
#define snd_seq_ev_is_message_type sndrv_seq_ev_is_message_type
#define snd_seq_ev_is_sample_type sndrv_seq_ev_is_sample_type
#define snd_seq_ev_is_user_type sndrv_seq_ev_is_user_type
#define snd_seq_ev_is_fixed_type sndrv_seq_ev_is_fixed_type
#define snd_seq_ev_is_instr_type sndrv_seq_ev_is_instr_type
#define snd_seq_ev_is_variable_type sndrv_seq_ev_is_variable_type
#define snd_seq_ev_is_reserved sndrv_seq_ev_is_reserved
#define snd_seq_ev_is_direct sndrv_seq_ev_is_direct
#define snd_seq_ev_is_prior sndrv_seq_ev_is_prior
#define snd_seq_ev_length_type sndrv_seq_ev_length_type
#define snd_seq_ev_is_fixed sndrv_seq_ev_is_fixed
#define snd_seq_ev_is_variable sndrv_seq_ev_is_variable
#define snd_seq_ev_is_varusr sndrv_seq_ev_is_varusr
#define snd_seq_ev_timestamp_type sndrv_seq_ev_timestamp_type
#define snd_seq_ev_is_tick sndrv_seq_ev_is_tick
#define snd_seq_ev_is_real sndrv_seq_ev_is_real
#define snd_seq_ev_timemode_type sndrv_seq_ev_timemode_type
#define snd_seq_ev_is_abstime sndrv_seq_ev_is_abstime
#define snd_seq_ev_is_reltime sndrv_seq_ev_is_reltime
#define snd_seq_queue_sync_port sndrv_seq_queue_sync_port
#define snd_seq_queue_owner sndrv_seq_queue_owner
typedef struct snd_seq_real_time snd_seq_real_time_t;
typedef union snd_seq_timestamp snd_seq_timestamp_t;
/* maximum number of events dequeued per schedule interval */
#define SNDRV_SEQ_MAX_DEQUEUE 50
@ -114,69 +60,48 @@ typedef union sndrv_seq_timestamp snd_seq_timestamp_t;
/* max size of event size */
#define SNDRV_SEQ_MAX_EVENT_LEN 0x3fffffff
/* typedefs */
struct _snd_seq_user_client;
struct _snd_seq_kernel_client;
struct _snd_seq_client;
struct _snd_seq_queue;
typedef struct _snd_seq_user_client user_client_t;
typedef struct _snd_seq_kernel_client kernel_client_t;
typedef struct _snd_seq_client client_t;
typedef struct _snd_seq_queue queue_t;
/* call-backs for kernel client */
typedef struct {
void *private_data;
unsigned allow_input: 1,
allow_output: 1;
/*...*/
} snd_seq_client_callback_t;
/* call-backs for kernel port */
typedef int (snd_seq_kernel_port_open_t)(void *private_data, snd_seq_port_subscribe_t *info);
typedef int (snd_seq_kernel_port_close_t)(void *private_data, snd_seq_port_subscribe_t *info);
typedef int (snd_seq_kernel_port_input_t)(snd_seq_event_t *ev, int direct, void *private_data, int atomic, int hop);
typedef void (snd_seq_kernel_port_private_free_t)(void *private_data);
typedef struct {
struct snd_seq_port_callback {
struct module *owner;
void *private_data;
snd_seq_kernel_port_open_t *subscribe;
snd_seq_kernel_port_close_t *unsubscribe;
snd_seq_kernel_port_open_t *use;
snd_seq_kernel_port_close_t *unuse;
snd_seq_kernel_port_input_t *event_input;
snd_seq_kernel_port_private_free_t *private_free;
int (*subscribe)(void *private_data, struct snd_seq_port_subscribe *info);
int (*unsubscribe)(void *private_data, struct snd_seq_port_subscribe *info);
int (*use)(void *private_data, struct snd_seq_port_subscribe *info);
int (*unuse)(void *private_data, struct snd_seq_port_subscribe *info);
int (*event_input)(struct snd_seq_event *ev, int direct, void *private_data, int atomic, int hop);
void (*private_free)(void *private_data);
unsigned int callback_all; /* call subscribe callbacks at each connection/disconnection */
/*...*/
} snd_seq_port_callback_t;
};
/* interface for kernel client */
extern int snd_seq_create_kernel_client(snd_card_t *card, int client_index, snd_seq_client_callback_t *callback);
extern int snd_seq_delete_kernel_client(int client);
extern int snd_seq_kernel_client_enqueue(int client, snd_seq_event_t *ev, int atomic, int hop);
extern int snd_seq_kernel_client_dispatch(int client, snd_seq_event_t *ev, int atomic, int hop);
extern int snd_seq_kernel_client_ctl(int client, unsigned int cmd, void *arg);
int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
const char *name_fmt, ...)
__attribute__ ((format (printf, 3, 4)));
int snd_seq_delete_kernel_client(int client);
int snd_seq_kernel_client_enqueue(int client, struct snd_seq_event *ev, int atomic, int hop);
int snd_seq_kernel_client_dispatch(int client, struct snd_seq_event *ev, int atomic, int hop);
int snd_seq_kernel_client_ctl(int client, unsigned int cmd, void *arg);
#define SNDRV_SEQ_EXT_MASK 0xc0000000
#define SNDRV_SEQ_EXT_USRPTR 0x80000000
#define SNDRV_SEQ_EXT_CHAINED 0x40000000
typedef int (*snd_seq_dump_func_t)(void *ptr, void *buf, int count);
int snd_seq_expand_var_event(const snd_seq_event_t *event, int count, char *buf, int in_kernel, int size_aligned);
int snd_seq_dump_var_event(const snd_seq_event_t *event, snd_seq_dump_func_t func, void *private_data);
int snd_seq_expand_var_event(const struct snd_seq_event *event, int count, char *buf,
int in_kernel, int size_aligned);
int snd_seq_dump_var_event(const struct snd_seq_event *event,
snd_seq_dump_func_t func, void *private_data);
/* interface for OSS emulation */
int snd_seq_set_queue_tempo(int client, snd_seq_queue_tempo_t *tempo);
int snd_seq_set_queue_tempo(int client, struct snd_seq_queue_tempo *tempo);
/* port callback routines */
void snd_port_init_callback(snd_seq_port_callback_t *p);
snd_seq_port_callback_t *snd_port_alloc_callback(void);
void snd_port_init_callback(struct snd_seq_port_callback *p);
struct snd_seq_port_callback *snd_port_alloc_callback(void);
/* port attach/detach */
int snd_seq_event_port_attach(int client, snd_seq_port_callback_t *pcbp,
int snd_seq_event_port_attach(int client, struct snd_seq_port_callback *pcbp,
int cap, int type, int midi_channels, int midi_voices, char *portname);
int snd_seq_event_port_detach(int client, int port);

View File

@ -29,7 +29,7 @@
* channel. All drivers for hardware that does not understand midi
* directly will probably need to use this structure.
*/
typedef struct snd_midi_channel {
struct snd_midi_channel {
void *private; /* A back pointer to driver data */
int number; /* The channel number */
int client; /* The client associated with this channel */
@ -53,41 +53,43 @@ typedef struct snd_midi_channel {
short gm_rpn_fine_tuning; /* Master fine tuning */
short gm_rpn_coarse_tuning; /* Master coarse tuning */
} snd_midi_channel_t;
};
/*
* A structure that represets a set of channels bound to a port. There
* would usually be 16 channels per port. But fewer could be used for
* particular cases.
* The channel set consists of information describing the client and
* port for this midi synth and an array of snd_midi_channel_t structures.
* A driver that had no need for snd_midi_channel_t could still use the
* port for this midi synth and an array of snd_midi_channel structures.
* A driver that had no need for snd_midi_channel could still use the
* channel set type if it wished with the channel array null.
*/
typedef struct snd_midi_channel_set {
struct snd_midi_channel_set {
void *private_data; /* Driver data */
int client; /* Client for this port */
int port; /* The port number */
int max_channels; /* Size of the channels array */
snd_midi_channel_t *channels;
struct snd_midi_channel *channels;
unsigned char midi_mode; /* MIDI operating mode */
unsigned char gs_master_volume; /* SYSEX master volume: 0-127 */
unsigned char gs_chorus_mode;
unsigned char gs_reverb_mode;
} snd_midi_channel_set_t;
};
typedef struct snd_seq_midi_op {
void (*note_on)(void *private_data, int note, int vel, snd_midi_channel_t *chan);
void (*note_off)(void *private_data,int note, int vel, snd_midi_channel_t *chan); /* release note */
void (*key_press)(void *private_data, int note, int vel, snd_midi_channel_t *chan);
void (*note_terminate)(void *private_data, int note, snd_midi_channel_t *chan); /* terminate note immediately */
void (*control)(void *private_data, int type, snd_midi_channel_t *chan);
void (*nrpn)(void *private_data, snd_midi_channel_t *chan, snd_midi_channel_set_t *chset);
void (*sysex)(void *private_data, unsigned char *buf, int len, int parsed, snd_midi_channel_set_t *chset);
} snd_midi_op_t;
struct snd_midi_op {
void (*note_on)(void *private_data, int note, int vel, struct snd_midi_channel *chan);
void (*note_off)(void *private_data,int note, int vel, struct snd_midi_channel *chan); /* release note */
void (*key_press)(void *private_data, int note, int vel, struct snd_midi_channel *chan);
void (*note_terminate)(void *private_data, int note, struct snd_midi_channel *chan); /* terminate note immediately */
void (*control)(void *private_data, int type, struct snd_midi_channel *chan);
void (*nrpn)(void *private_data, struct snd_midi_channel *chan,
struct snd_midi_channel_set *chset);
void (*sysex)(void *private_data, unsigned char *buf, int len, int parsed,
struct snd_midi_channel_set *chset);
};
/*
* These defines are used so that pitchbend, aftertouch etc, can be
@ -186,10 +188,10 @@ enum {
};
/* Prototypes for midi_process.c */
void snd_midi_process_event(snd_midi_op_t *ops, snd_seq_event_t *ev,
snd_midi_channel_set_t *chanset);
void snd_midi_channel_set_clear(snd_midi_channel_set_t *chset);
snd_midi_channel_set_t *snd_midi_channel_alloc_set(int n);
void snd_midi_channel_free_set(snd_midi_channel_set_t *chset);
void snd_midi_process_event(struct snd_midi_op *ops, struct snd_seq_event *ev,
struct snd_midi_channel_set *chanset);
void snd_midi_channel_set_clear(struct snd_midi_channel_set *chset);
struct snd_midi_channel_set *snd_midi_channel_alloc_set(int n);
void snd_midi_channel_free_set(struct snd_midi_channel_set *chset);
#endif /* __SOUND_SEQ_MIDI_EMUL_H */

View File

@ -26,10 +26,8 @@
#define MAX_MIDI_EVENT_BUF 256
typedef struct snd_midi_event_t snd_midi_event_t;
/* midi status */
struct snd_midi_event_t {
struct snd_midi_event {
int qlen; /* queue length */
int read; /* chars read */
int type; /* current event type */
@ -40,15 +38,17 @@ struct snd_midi_event_t {
spinlock_t lock;
};
int snd_midi_event_new(int bufsize, snd_midi_event_t **rdev);
void snd_midi_event_free(snd_midi_event_t *dev);
void snd_midi_event_reset_encode(snd_midi_event_t *dev);
void snd_midi_event_reset_decode(snd_midi_event_t *dev);
void snd_midi_event_no_status(snd_midi_event_t *dev, int on);
int snd_midi_event_new(int bufsize, struct snd_midi_event **rdev);
void snd_midi_event_free(struct snd_midi_event *dev);
void snd_midi_event_reset_encode(struct snd_midi_event *dev);
void snd_midi_event_reset_decode(struct snd_midi_event *dev);
void snd_midi_event_no_status(struct snd_midi_event *dev, int on);
/* encode from byte stream - return number of written bytes if success */
long snd_midi_event_encode(snd_midi_event_t *dev, unsigned char *buf, long count, snd_seq_event_t *ev);
int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev);
long snd_midi_event_encode(struct snd_midi_event *dev, unsigned char *buf, long count,
struct snd_seq_event *ev);
int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c, struct snd_seq_event *ev);
/* decode from event to bytes - return number of written bytes if success */
long snd_midi_event_decode(snd_midi_event_t *dev, unsigned char *buf, long count, snd_seq_event_t *ev);
long snd_midi_event_decode(struct snd_midi_event *dev, unsigned char *buf, long count,
struct snd_seq_event *ev);
#endif /* __SOUND_SEQ_MIDI_EVENT_H */

View File

@ -24,23 +24,17 @@
#include "asequencer.h"
#include "seq_kernel.h"
/*
* type definitions
*/
typedef struct snd_seq_oss_arg_t snd_seq_oss_arg_t;
typedef struct snd_seq_oss_callback_t snd_seq_oss_callback_t;
/*
* argument structure for synthesizer operations
*/
struct snd_seq_oss_arg_t {
struct snd_seq_oss_arg {
/* given by OSS sequencer */
int app_index; /* application unique index */
int file_mode; /* file mode - see below */
int seq_mode; /* sequencer mode - see below */
/* following must be initialized in open callback */
snd_seq_addr_t addr; /* opened port address */
struct snd_seq_addr addr; /* opened port address */
void *private_data; /* private data for lowlevel drivers */
/* note-on event passing mode: initially given by OSS seq,
@ -53,14 +47,14 @@ struct snd_seq_oss_arg_t {
/*
* synthesizer operation callbacks
*/
struct snd_seq_oss_callback_t {
struct snd_seq_oss_callback {
struct module *owner;
int (*open)(snd_seq_oss_arg_t *p, void *closure);
int (*close)(snd_seq_oss_arg_t *p);
int (*ioctl)(snd_seq_oss_arg_t *p, unsigned int cmd, unsigned long arg);
int (*load_patch)(snd_seq_oss_arg_t *p, int format, const char __user *buf, int offs, int count);
int (*reset)(snd_seq_oss_arg_t *p);
int (*raw_event)(snd_seq_oss_arg_t *p, unsigned char *data);
int (*open)(struct snd_seq_oss_arg *p, void *closure);
int (*close)(struct snd_seq_oss_arg *p);
int (*ioctl)(struct snd_seq_oss_arg *p, unsigned int cmd, unsigned long arg);
int (*load_patch)(struct snd_seq_oss_arg *p, int format, const char __user *buf, int offs, int count);
int (*reset)(struct snd_seq_oss_arg *p);
int (*raw_event)(struct snd_seq_oss_arg *p, unsigned char *data);
};
/* flag: file_mode */
@ -88,13 +82,13 @@ struct snd_seq_oss_callback_t {
/*
* data pointer to snd_seq_register_device
*/
typedef struct snd_seq_oss_reg {
struct snd_seq_oss_reg {
int type;
int subtype;
int nvoices;
snd_seq_oss_callback_t oper;
struct snd_seq_oss_callback oper;
void *private_data;
} snd_seq_oss_reg_t;
};
/* device id */
#define SNDRV_SEQ_DEV_ID_OSS "seq-oss"

View File

@ -25,25 +25,23 @@
#include "rawmidi.h"
#include "seq_midi_event.h"
typedef struct _snd_virmidi_dev snd_virmidi_dev_t;
/*
* device file instance:
* This instance is created at each time the midi device file is
* opened. Each instance has its own input buffer and MIDI parser
* (buffer), and is associated with the device instance.
*/
typedef struct _snd_virmidi {
struct snd_virmidi {
struct list_head list;
int seq_mode;
int client;
int port;
unsigned int trigger: 1;
snd_midi_event_t *parser;
snd_seq_event_t event;
snd_virmidi_dev_t *rdev;
snd_rawmidi_substream_t *substream;
} snd_virmidi_t;
struct snd_midi_event *parser;
struct snd_seq_event event;
struct snd_virmidi_dev *rdev;
struct snd_rawmidi_substream *substream;
};
#define SNDRV_VIRMIDI_SUBSCRIBE (1<<0)
#define SNDRV_VIRMIDI_USE (1<<1)
@ -53,9 +51,9 @@ typedef struct _snd_virmidi {
* Each virtual midi device has one device instance. It contains
* common information and the linked-list of opened files,
*/
struct _snd_virmidi_dev {
snd_card_t *card; /* associated card */
snd_rawmidi_t *rmidi; /* rawmidi device */
struct snd_virmidi_dev {
struct snd_card *card; /* associated card */
struct snd_rawmidi *rmidi; /* rawmidi device */
int seq_mode; /* SNDRV_VIRMIDI_XXX */
int device; /* sequencer device */
int client; /* created/attached client */
@ -78,6 +76,6 @@ struct _snd_virmidi_dev {
#define SNDRV_VIRMIDI_SEQ_ATTACH 1
#define SNDRV_VIRMIDI_SEQ_DISPATCH 2
int snd_virmidi_new(snd_card_t *card, int device, snd_rawmidi_t **rrmidi);
int snd_virmidi_new(struct snd_card *card, int device, struct snd_rawmidi **rrmidi);
#endif /* __SOUND_SEQ_VIRMIDI */

View File

@ -35,7 +35,7 @@
#endif
/* patch interface header: 16 bytes */
typedef struct soundfont_patch_info_t {
struct soundfont_patch_info {
unsigned short key; /* use the key below */
#define SNDRV_OSS_SOUNDFONT_PATCH SNDRV_OSS_PATCHKEY(0x07)
@ -59,7 +59,7 @@ typedef struct soundfont_patch_info_t {
short reserved; /* word alignment data */
/* the actual patch data begins after this */
} soundfont_patch_info_t;
};
/*
@ -68,7 +68,7 @@ typedef struct soundfont_patch_info_t {
#define SNDRV_SFNT_PATCH_NAME_LEN 32
typedef struct soundfont_open_parm_t {
struct soundfont_open_parm {
unsigned short type; /* sample type */
#define SNDRV_SFNT_PAT_TYPE_MISC 0
#define SNDRV_SFNT_PAT_TYPE_GUS 6
@ -78,7 +78,7 @@ typedef struct soundfont_open_parm_t {
short reserved;
char name[SNDRV_SFNT_PATCH_NAME_LEN];
} soundfont_open_parm_t;
};
/*
@ -86,7 +86,7 @@ typedef struct soundfont_open_parm_t {
*/
/* wave table envelope & effect parameters to control EMU8000 */
typedef struct soundfont_voice_parm_t {
struct soundfont_voice_parm {
unsigned short moddelay; /* modulation delay (0x8000) */
unsigned short modatkhld; /* modulation attack & hold time (0x7f7f) */
unsigned short moddcysus; /* modulation decay & sustain (0x7f7f) */
@ -108,11 +108,11 @@ typedef struct soundfont_voice_parm_t {
unsigned char chorus; /* chorus send (0x00) */
unsigned char reverb; /* reverb send (0x00) */
unsigned short reserved[4]; /* not used */
} soundfont_voice_parm_t;
};
/* wave table parameters: 92 bytes */
typedef struct soundfont_voice_info_t {
struct soundfont_voice_info {
unsigned short sf_id; /* file id (should be zero) */
unsigned short sample; /* sample id */
int start, end; /* sample offset correction */
@ -135,13 +135,13 @@ typedef struct soundfont_voice_info_t {
unsigned char amplitude; /* sample volume (127 max) */
unsigned char attenuation; /* attenuation (0.375dB) */
short scaleTuning; /* pitch scale tuning(%), normally 100 */
soundfont_voice_parm_t parm; /* voice envelope parameters */
struct soundfont_voice_parm parm; /* voice envelope parameters */
unsigned short sample_mode; /* sample mode_flag (set by driver) */
} soundfont_voice_info_t;
};
/* instrument info header: 4 bytes */
typedef struct soundfont_voice_rec_hdr_t {
struct soundfont_voice_rec_hdr {
unsigned char bank; /* midi bank number */
unsigned char instr; /* midi preset number */
char nvoices; /* number of voices */
@ -149,7 +149,7 @@ typedef struct soundfont_voice_rec_hdr_t {
#define SNDRV_SFNT_WR_APPEND 0 /* append anyway */
#define SNDRV_SFNT_WR_EXCLUSIVE 1 /* skip if already exists */
#define SNDRV_SFNT_WR_REPLACE 2 /* replace if already exists */
} soundfont_voice_rec_hdr_t;
};
/*
@ -157,7 +157,7 @@ typedef struct soundfont_voice_rec_hdr_t {
*/
/* wave table sample header: 32 bytes */
typedef struct soundfont_sample_info_t {
struct soundfont_sample_info {
unsigned short sf_id; /* file id (should be zero) */
unsigned short sample; /* sample id */
int start, end; /* start & end offset */
@ -174,17 +174,17 @@ typedef struct soundfont_sample_info_t {
#define SNDRV_SFNT_SAMPLE_STEREO_RIGHT 64 /* stereo right sound */
#define SNDRV_SFNT_SAMPLE_REVERSE_LOOP 128 /* reverse looping */
unsigned int truesize; /* used memory size (set by driver) */
} soundfont_sample_info_t;
};
/*
* voice preset mapping (aliasing)
*/
typedef struct soundfont_voice_map_t {
struct soundfont_voice_map {
int map_bank, map_instr, map_key; /* key = -1 means all keys */
int src_bank, src_instr, src_key;
} soundfont_voice_map_t;
};
/*
@ -195,7 +195,7 @@ typedef struct soundfont_voice_map_t {
#define SNDRV_EMUX_VERSION ((1 << 16) | (0 << 8) | 0) /* 1.0.0 */
struct sndrv_emux_misc_mode {
struct snd_emux_misc_mode {
int port; /* -1 = all */
int mode;
int value;
@ -204,11 +204,11 @@ struct sndrv_emux_misc_mode {
enum {
SNDRV_EMUX_IOCTL_VERSION = _IOR('H', 0x80, unsigned int),
SNDRV_EMUX_IOCTL_LOAD_PATCH = _IOWR('H', 0x81, soundfont_patch_info_t),
SNDRV_EMUX_IOCTL_LOAD_PATCH = _IOWR('H', 0x81, struct soundfont_patch_info),
SNDRV_EMUX_IOCTL_RESET_SAMPLES = _IO('H', 0x82),
SNDRV_EMUX_IOCTL_REMOVE_LAST_SAMPLES = _IO('H', 0x83),
SNDRV_EMUX_IOCTL_MEM_AVAIL = _IOW('H', 0x84, int),
SNDRV_EMUX_IOCTL_MISC_MODE = _IOWR('H', 0x84, struct sndrv_emux_misc_mode),
SNDRV_EMUX_IOCTL_MISC_MODE = _IOWR('H', 0x84, struct snd_emux_misc_mode),
};
#endif /* __SOUND_SFNT_INFO_H */

View File

@ -26,8 +26,8 @@ struct _snd_wavefront_midi {
snd_wavefront_mpu_id output_mpu; /* most-recently-used */
snd_wavefront_mpu_id input_mpu; /* most-recently-used */
unsigned int mode[2]; /* MPU401_MODE_XXX */
snd_rawmidi_substream_t *substream_output[2];
snd_rawmidi_substream_t *substream_input[2];
struct snd_rawmidi_substream *substream_output[2];
struct snd_rawmidi_substream *substream_input[2];
struct timer_list timer;
spinlock_t open;
spinlock_t virtual; /* protects isvirtual */
@ -38,8 +38,8 @@ struct _snd_wavefront_midi {
#define MPU_ACK 0xFE
#define UART_MODE_ON 0x3F
extern snd_rawmidi_ops_t snd_wavefront_midi_output;
extern snd_rawmidi_ops_t snd_wavefront_midi_input;
extern struct snd_rawmidi_ops snd_wavefront_midi_output;
extern struct snd_rawmidi_ops snd_wavefront_midi_input;
extern void snd_wavefront_midi_enable_virtual (snd_wavefront_card_t *);
extern void snd_wavefront_midi_disable_virtual (snd_wavefront_card_t *);
@ -116,23 +116,23 @@ extern int snd_wavefront_config_midi (snd_wavefront_t *dev) ;
extern int snd_wavefront_cmd (snd_wavefront_t *, int, unsigned char *,
unsigned char *);
extern int snd_wavefront_synth_ioctl (snd_hwdep_t *,
extern int snd_wavefront_synth_ioctl (struct snd_hwdep *,
struct file *,
unsigned int cmd,
unsigned long arg);
extern int snd_wavefront_synth_open (snd_hwdep_t *, struct file *);
extern int snd_wavefront_synth_release (snd_hwdep_t *, struct file *);
extern int snd_wavefront_synth_open (struct snd_hwdep *, struct file *);
extern int snd_wavefront_synth_release (struct snd_hwdep *, struct file *);
/* FX processor - see also yss225.[ch] */
extern int snd_wavefront_fx_start (snd_wavefront_t *);
extern int snd_wavefront_fx_detect (snd_wavefront_t *);
extern int snd_wavefront_fx_ioctl (snd_hwdep_t *,
extern int snd_wavefront_fx_ioctl (struct snd_hwdep *,
struct file *,
unsigned int cmd,
unsigned long arg);
extern int snd_wavefront_fx_open (snd_hwdep_t *, struct file *);
extern int snd_wavefront_fx_release (snd_hwdep_t *, struct file *);
extern int snd_wavefront_fx_open (struct snd_hwdep *, struct file *);
extern int snd_wavefront_fx_release (struct snd_hwdep *, struct file *);
/* prefix in all snd_printk() delivered messages */

View File

@ -29,94 +29,93 @@
#define SF_MAX_PRESETS 256 /* drums are mapped from 128 to 256 */
#define SF_IS_DRUM_BANK(z) ((z) == 128)
typedef struct snd_sf_zone {
struct snd_sf_zone {
struct snd_sf_zone *next; /* Link to next */
unsigned char bank; /* Midi bank for this zone */
unsigned char instr; /* Midi program for this zone */
unsigned char mapped; /* True if mapped to something else */
soundfont_voice_info_t v; /* All the soundfont parameters */
struct soundfont_voice_info v; /* All the soundfont parameters */
int counter;
struct snd_sf_sample *sample; /* Link to sample */
/* The following deals with preset numbers (programs) */
struct snd_sf_zone *next_instr; /* Next zone of this instrument */
struct snd_sf_zone *next_zone; /* Next zone in play list */
} snd_sf_zone_t;
};
typedef struct snd_sf_sample {
soundfont_sample_info_t v;
struct snd_sf_sample {
struct soundfont_sample_info v;
int counter;
snd_util_memblk_t *block; /* allocated data block */
struct snd_util_memblk *block; /* allocated data block */
struct snd_sf_sample *next;
} snd_sf_sample_t;
};
/*
* This represents all the information relating to a soundfont.
*/
typedef struct snd_soundfont {
struct snd_soundfont {
struct snd_soundfont *next; /* Link to next */
/*struct snd_soundfont *prev;*/ /* Link to previous */
short id; /* file id */
short type; /* font type */
unsigned char name[SNDRV_SFNT_PATCH_NAME_LEN]; /* identifier */
snd_sf_zone_t *zones; /* Font information */
snd_sf_sample_t *samples; /* The sample headers */
} snd_soundfont_t;
struct snd_sf_zone *zones; /* Font information */
struct snd_sf_sample *samples; /* The sample headers */
};
/*
* Type of the sample access callback
*/
typedef int (*snd_sf_sample_new_t)(void *private_data, snd_sf_sample_t *sp,
snd_util_memhdr_t *hdr, const void __user *buf, long count);
typedef int (*snd_sf_sample_free_t)(void *private_data, snd_sf_sample_t *sp,
snd_util_memhdr_t *hdr);
typedef void (*snd_sf_sample_reset_t)(void *private);
typedef struct snd_sf_callback {
struct snd_sf_callback {
void *private_data;
snd_sf_sample_new_t sample_new;
snd_sf_sample_free_t sample_free;
snd_sf_sample_reset_t sample_reset;
} snd_sf_callback_t;
int (*sample_new)(void *private_data, struct snd_sf_sample *sp,
struct snd_util_memhdr *hdr,
const void __user *buf, long count);
int (*sample_free)(void *private_data, struct snd_sf_sample *sp,
struct snd_util_memhdr *hdr);
void (*sample_reset)(void *private);
};
/*
* List of soundfonts.
*/
typedef struct snd_sf_list {
snd_soundfont_t *currsf; /* The currently open soundfont */
struct snd_sf_list {
struct snd_soundfont *currsf; /* The currently open soundfont */
int open_client; /* client pointer for lock */
int mem_used; /* used memory size */
snd_sf_zone_t *presets[SF_MAX_PRESETS];
snd_soundfont_t *fonts; /* The list of soundfonts */
struct snd_sf_zone *presets[SF_MAX_PRESETS];
struct snd_soundfont *fonts; /* The list of soundfonts */
int fonts_size; /* number of fonts allocated */
int zone_counter; /* last allocated time for zone */
int sample_counter; /* last allocated time for sample */
int zone_locked; /* locked time for zone */
int sample_locked; /* locked time for sample */
snd_sf_callback_t callback; /* callback functions */
struct snd_sf_callback callback; /* callback functions */
int presets_locked;
struct semaphore presets_mutex;
spinlock_t lock;
snd_util_memhdr_t *memhdr;
} snd_sf_list_t;
struct snd_util_memhdr *memhdr;
};
/* Prototypes for soundfont.c */
int snd_soundfont_load(snd_sf_list_t *sflist, const void __user *data, long count, int client);
int snd_soundfont_load_guspatch(snd_sf_list_t *sflist, const char __user *data,
int snd_soundfont_load(struct snd_sf_list *sflist, const void __user *data,
long count, int client);
int snd_soundfont_load_guspatch(struct snd_sf_list *sflist, const char __user *data,
long count, int client);
int snd_soundfont_close_check(snd_sf_list_t *sflist, int client);
int snd_soundfont_close_check(struct snd_sf_list *sflist, int client);
snd_sf_list_t *snd_sf_new(snd_sf_callback_t *callback, snd_util_memhdr_t *hdr);
void snd_sf_free(snd_sf_list_t *sflist);
struct snd_sf_list *snd_sf_new(struct snd_sf_callback *callback,
struct snd_util_memhdr *hdr);
void snd_sf_free(struct snd_sf_list *sflist);
int snd_soundfont_remove_samples(snd_sf_list_t *sflist);
int snd_soundfont_remove_unlocked(snd_sf_list_t *sflist);
int snd_soundfont_remove_samples(struct snd_sf_list *sflist);
int snd_soundfont_remove_unlocked(struct snd_sf_list *sflist);
int snd_soundfont_search_zone(snd_sf_list_t *sflist, int *notep, int vel,
int snd_soundfont_search_zone(struct snd_sf_list *sflist, int *notep, int vel,
int preset, int bank,
int def_preset, int def_bank,
snd_sf_zone_t **table, int max_layers);
struct snd_sf_zone **table, int max_layers);
/* Parameter conversions */
int snd_sf_calc_parm_hold(int msec);

View File

@ -24,15 +24,15 @@
#include <linux/videodev.h>
typedef struct snd_tea575x tea575x_t;
struct snd_tea575x;
struct snd_tea575x_ops {
void (*write)(tea575x_t *tea, unsigned int val);
unsigned int (*read)(tea575x_t *tea);
void (*write)(struct snd_tea575x *tea, unsigned int val);
unsigned int (*read)(struct snd_tea575x *tea);
};
struct snd_tea575x {
snd_card_t *card;
struct snd_card *card;
struct video_device vd; /* video device */
struct file_operations fops;
int dev_nr; /* requested device number + 1 */
@ -45,7 +45,7 @@ struct snd_tea575x {
void *private_data;
};
void snd_tea575x_init(tea575x_t *tea);
void snd_tea575x_exit(tea575x_t *tea);
void snd_tea575x_init(struct snd_tea575x *tea);
void snd_tea575x_exit(struct snd_tea575x *tea);
#endif /* __SOUND_TEA575X_TUNER_H */

View File

@ -22,21 +22,10 @@
*
*/
#include "control.h"
#include "i2c.h" /* generic i2c support */
typedef struct {
snd_i2c_device_t *device;
snd_i2c_bus_t *bus;
int equalizer;
int fader;
unsigned char regs[8];
unsigned char mleft, mright;
unsigned char bass, treble;
unsigned char max_bass, max_treble;
} tea6330t_t;
extern int snd_tea6330t_detect(snd_i2c_bus_t *bus, int equalizer);
extern int snd_tea6330t_update_mixer(snd_card_t * card, snd_i2c_bus_t * bus, int equalizer, int fader);
int snd_tea6330t_detect(struct snd_i2c_bus *bus, int equalizer);
int snd_tea6330t_update_mixer(struct snd_card *card, struct snd_i2c_bus *bus,
int equalizer, int fader);
#endif /* __SOUND_TEA6330T_H */

View File

@ -26,20 +26,6 @@
#include <sound/asound.h>
#include <linux/interrupt.h>
typedef enum sndrv_timer_class snd_timer_class_t;
typedef enum sndrv_timer_slave_class snd_timer_slave_class_t;
typedef enum sndrv_timer_global snd_timer_global_t;
typedef struct sndrv_timer_id snd_timer_id_t;
typedef struct sndrv_timer_ginfo snd_timer_ginfo_t;
typedef struct sndrv_timer_gparams snd_timer_gparams_t;
typedef struct sndrv_timer_gstatus snd_timer_gstatus_t;
typedef struct sndrv_timer_select snd_timer_select_t;
typedef struct sndrv_timer_info snd_timer_info_t;
typedef struct sndrv_timer_params snd_timer_params_t;
typedef struct sndrv_timer_status snd_timer_status_t;
typedef struct sndrv_timer_read snd_timer_read_t;
typedef struct sndrv_timer_tread snd_timer_tread_t;
#define snd_timer_chip(timer) ((timer)->private_data)
#define SNDRV_TIMER_DEVICES 16
@ -64,11 +50,9 @@ typedef struct sndrv_timer_tread snd_timer_tread_t;
#define SNDRV_TIMER_FLG_CHANGE 0x00000001
#define SNDRV_TIMER_FLG_RESCHED 0x00000002 /* need reschedule */
typedef void (*snd_timer_callback_t) (snd_timer_instance_t * timeri, unsigned long ticks, unsigned long resolution);
typedef void (*snd_timer_ccallback_t) (snd_timer_instance_t * timeri, enum sndrv_timer_event event,
struct timespec * tstamp, unsigned long resolution);
struct snd_timer;
struct _snd_timer_hardware {
struct snd_timer_hardware {
/* -- must be filled with low-level driver */
unsigned int flags; /* various flags */
unsigned long resolution; /* average timer resolution for one tick in nsec */
@ -76,18 +60,18 @@ struct _snd_timer_hardware {
unsigned long resolution_max; /* maximal resolution */
unsigned long ticks; /* max timer ticks per interrupt */
/* -- low-level functions -- */
int (*open) (snd_timer_t * timer);
int (*close) (snd_timer_t * timer);
unsigned long (*c_resolution) (snd_timer_t * timer);
int (*start) (snd_timer_t * timer);
int (*stop) (snd_timer_t * timer);
int (*set_period) (snd_timer_t * timer, unsigned long period_num, unsigned long period_den);
int (*precise_resolution) (snd_timer_t * timer, unsigned long *num, unsigned long *den);
int (*open) (struct snd_timer * timer);
int (*close) (struct snd_timer * timer);
unsigned long (*c_resolution) (struct snd_timer * timer);
int (*start) (struct snd_timer * timer);
int (*stop) (struct snd_timer * timer);
int (*set_period) (struct snd_timer * timer, unsigned long period_num, unsigned long period_den);
int (*precise_resolution) (struct snd_timer * timer, unsigned long *num, unsigned long *den);
};
struct _snd_timer {
snd_timer_class_t tmr_class;
snd_card_t *card;
struct snd_timer {
int tmr_class;
struct snd_card *card;
struct module *module;
int tmr_device;
int tmr_subdevice;
@ -97,8 +81,8 @@ struct _snd_timer {
int running; /* running instances */
unsigned long sticks; /* schedule ticks */
void *private_data;
void (*private_free) (snd_timer_t *timer);
struct _snd_timer_hardware hw;
void (*private_free) (struct snd_timer *timer);
struct snd_timer_hardware hw;
spinlock_t lock;
struct list_head device_list;
struct list_head open_list_head;
@ -108,49 +92,53 @@ struct _snd_timer {
struct tasklet_struct task_queue;
};
struct _snd_timer_instance {
snd_timer_t * timer;
struct snd_timer_instance {
struct snd_timer *timer;
char *owner;
unsigned int flags;
void *private_data;
void (*private_free) (snd_timer_instance_t *ti);
snd_timer_callback_t callback;
snd_timer_ccallback_t ccallback;
void (*private_free) (struct snd_timer_instance *ti);
void (*callback) (struct snd_timer_instance *timeri,
unsigned long ticks, unsigned long resolution);
void (*ccallback) (struct snd_timer_instance * timeri,
int event,
struct timespec * tstamp,
unsigned long resolution);
void *callback_data;
unsigned long ticks; /* auto-load ticks when expired */
unsigned long cticks; /* current ticks */
unsigned long pticks; /* accumulated ticks for callback */
unsigned long resolution; /* current resolution for tasklet */
unsigned long lost; /* lost ticks */
snd_timer_slave_class_t slave_class;
int slave_class;
unsigned int slave_id;
struct list_head open_list;
struct list_head active_list;
struct list_head ack_list;
struct list_head slave_list_head;
struct list_head slave_active_head;
snd_timer_instance_t *master;
struct snd_timer_instance *master;
};
/*
* Registering
*/
extern int snd_timer_new(snd_card_t *card, char *id, snd_timer_id_t *tid, snd_timer_t ** rtimer);
extern void snd_timer_notify(snd_timer_t *timer, enum sndrv_timer_event event, struct timespec *tstamp);
extern int snd_timer_global_new(char *id, int device, snd_timer_t **rtimer);
extern int snd_timer_global_free(snd_timer_t *timer);
extern int snd_timer_global_register(snd_timer_t *timer);
extern int snd_timer_global_unregister(snd_timer_t *timer);
int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid, struct snd_timer **rtimer);
void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstamp);
int snd_timer_global_new(char *id, int device, struct snd_timer **rtimer);
int snd_timer_global_free(struct snd_timer *timer);
int snd_timer_global_register(struct snd_timer *timer);
int snd_timer_global_unregister(struct snd_timer *timer);
extern int snd_timer_open(snd_timer_instance_t ** ti, char *owner, snd_timer_id_t *tid, unsigned int slave_id);
extern int snd_timer_close(snd_timer_instance_t * timeri);
extern unsigned long snd_timer_resolution(snd_timer_instance_t * timeri);
extern int snd_timer_start(snd_timer_instance_t * timeri, unsigned int ticks);
extern int snd_timer_stop(snd_timer_instance_t * timeri);
extern int snd_timer_continue(snd_timer_instance_t * timeri);
extern int snd_timer_pause(snd_timer_instance_t * timeri);
int snd_timer_open(struct snd_timer_instance **ti, char *owner, struct snd_timer_id *tid, unsigned int slave_id);
int snd_timer_close(struct snd_timer_instance *timeri);
unsigned long snd_timer_resolution(struct snd_timer_instance *timeri);
int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks);
int snd_timer_stop(struct snd_timer_instance *timeri);
int snd_timer_continue(struct snd_timer_instance *timeri);
int snd_timer_pause(struct snd_timer_instance *timeri);
extern void snd_timer_interrupt(snd_timer_t * timer, unsigned long ticks_left);
void snd_timer_interrupt(struct snd_timer *timer, unsigned long ticks_left);
#endif /* __SOUND_TIMER_H */

View File

@ -253,43 +253,43 @@ enum serial_intf_ctrl_bits {
#define T4D_DEFAULT_PCM_RVOL 127 /* 0 - 127 */
#define T4D_DEFAULT_PCM_CVOL 127 /* 0 - 127 */
typedef struct _snd_trident trident_t;
typedef struct _snd_trident_voice snd_trident_voice_t;
typedef struct _snd_trident_pcm_mixer snd_trident_pcm_mixer_t;
struct snd_trident;
struct snd_trident_voice;
struct snd_trident_pcm_mixer;
typedef struct {
void (*sample_start)(trident_t *gus, snd_trident_voice_t *voice, snd_seq_position_t position);
void (*sample_stop)(trident_t *gus, snd_trident_voice_t *voice, snd_seq_stop_mode_t mode);
void (*sample_freq)(trident_t *gus, snd_trident_voice_t *voice, snd_seq_frequency_t freq);
void (*sample_volume)(trident_t *gus, snd_trident_voice_t *voice, snd_seq_ev_volume_t *volume);
void (*sample_loop)(trident_t *card, snd_trident_voice_t *voice, snd_seq_ev_loop_t *loop);
void (*sample_pos)(trident_t *card, snd_trident_voice_t *voice, snd_seq_position_t position);
void (*sample_private1)(trident_t *card, snd_trident_voice_t *voice, unsigned char *data);
} snd_trident_sample_ops_t;
struct snd_trident_sample_ops {
void (*sample_start)(struct snd_trident *gus, struct snd_trident_voice *voice, snd_seq_position_t position);
void (*sample_stop)(struct snd_trident *gus, struct snd_trident_voice *voice, int mode);
void (*sample_freq)(struct snd_trident *gus, struct snd_trident_voice *voice, snd_seq_frequency_t freq);
void (*sample_volume)(struct snd_trident *gus, struct snd_trident_voice *voice, struct snd_seq_ev_volume *volume);
void (*sample_loop)(struct snd_trident *card, struct snd_trident_voice *voice, struct snd_seq_ev_loop *loop);
void (*sample_pos)(struct snd_trident *card, struct snd_trident_voice *voice, snd_seq_position_t position);
void (*sample_private1)(struct snd_trident *card, struct snd_trident_voice *voice, unsigned char *data);
};
typedef struct {
snd_midi_channel_set_t * chset;
trident_t * trident;
struct snd_trident_port {
struct snd_midi_channel_set * chset;
struct snd_trident * trident;
int mode; /* operation mode */
int client; /* sequencer client number */
int port; /* sequencer port number */
unsigned int midi_has_voices: 1;
} snd_trident_port_t;
};
typedef struct snd_trident_memblk_arg {
struct snd_trident_memblk_arg {
short first_page, last_page;
} snd_trident_memblk_arg_t;
};
typedef struct {
struct snd_trident_tlb {
unsigned int * entries; /* 16k-aligned TLB table */
dma_addr_t entries_dmaaddr; /* 16k-aligned PCI address to TLB table */
unsigned long * shadow_entries; /* shadow entries with virtual addresses */
struct snd_dma_buffer buffer;
snd_util_memhdr_t * memhdr; /* page allocation list */
struct snd_util_memhdr * memhdr; /* page allocation list */
struct snd_dma_buffer silent_page;
} snd_trident_tlb_t;
};
struct _snd_trident_voice {
struct snd_trident_voice {
unsigned int number;
unsigned int use: 1,
pcm: 1,
@ -300,8 +300,8 @@ struct _snd_trident_voice {
unsigned char port;
unsigned char index;
snd_seq_instr_t instr;
snd_trident_sample_ops_t *sample_ops;
struct snd_seq_instr instr;
struct snd_trident_sample_ops *sample_ops;
/* channel parameters */
unsigned int CSO; /* 24 bits (16 on DX) */
@ -323,13 +323,13 @@ struct _snd_trident_voice {
unsigned int negCSO; /* nonzero - use negative CSO */
snd_util_memblk_t *memblk; /* memory block if TLB enabled */
struct snd_util_memblk *memblk; /* memory block if TLB enabled */
/* PCM data */
trident_t *trident;
snd_pcm_substream_t *substream;
snd_trident_voice_t *extra; /* extra PCM voice (acts as interrupt generator) */
struct snd_trident *trident;
struct snd_pcm_substream *substream;
struct snd_trident_voice *extra; /* extra PCM voice (acts as interrupt generator) */
unsigned int running: 1,
capture: 1,
spdif: 1,
@ -347,25 +347,25 @@ struct _snd_trident_voice {
/* --- */
void *private_data;
void (*private_free)(snd_trident_voice_t *voice);
void (*private_free)(struct snd_trident_voice *voice);
};
struct _snd_4dwave {
struct snd_4dwave {
int seq_client;
snd_trident_port_t seq_ports[4];
snd_simple_ops_t simple_ops;
snd_seq_kinstr_list_t *ilist;
struct snd_trident_port seq_ports[4];
struct snd_simple_ops simple_ops;
struct snd_seq_kinstr_list *ilist;
snd_trident_voice_t voices[64];
struct snd_trident_voice voices[64];
int ChanSynthCount; /* number of allocated synth channels */
int max_size; /* maximum synth memory size in bytes */
int current_size; /* current allocated synth mem in bytes */
};
struct _snd_trident_pcm_mixer {
snd_trident_voice_t *voice; /* active voice */
struct snd_trident_pcm_mixer {
struct snd_trident_voice *voice; /* active voice */
unsigned short vol; /* front volume */
unsigned char pan; /* pan control */
unsigned char rvol; /* rear volume */
@ -373,7 +373,7 @@ struct _snd_trident_pcm_mixer {
unsigned char pad;
};
struct _snd_trident {
struct snd_trident {
int irq;
unsigned int device; /* device ID */
@ -386,13 +386,13 @@ struct _snd_trident {
unsigned int spurious_irq_count;
unsigned int spurious_irq_max_delta;
snd_trident_tlb_t tlb; /* TLB entries for NX cards */
struct snd_trident_tlb tlb; /* TLB entries for NX cards */
unsigned char spdif_ctrl;
unsigned char spdif_pcm_ctrl;
unsigned int spdif_bits;
unsigned int spdif_pcm_bits;
snd_kcontrol_t *spdif_pcm_ctl; /* S/PDIF settings */
struct snd_kcontrol *spdif_pcm_ctl; /* S/PDIF settings */
unsigned int ac97_ctrl;
unsigned int ChanMap[2]; /* allocation map for hardware channels */
@ -403,7 +403,7 @@ struct _snd_trident {
unsigned int ac97_detect: 1; /* 1 = AC97 in detection phase */
unsigned int in_suspend: 1; /* 1 during suspend/resume */
struct _snd_4dwave synth; /* synth specific variables */
struct snd_4dwave synth; /* synth specific variables */
spinlock_t event_lock;
spinlock_t voice_alloc;
@ -411,52 +411,57 @@ struct _snd_trident {
struct snd_dma_device dma_dev;
struct pci_dev *pci;
snd_card_t *card;
snd_pcm_t *pcm; /* ADC/DAC PCM */
snd_pcm_t *foldback; /* Foldback PCM */
snd_pcm_t *spdif; /* SPDIF PCM */
snd_rawmidi_t *rmidi;
snd_seq_device_t *seq_dev;
struct snd_card *card;
struct snd_pcm *pcm; /* ADC/DAC PCM */
struct snd_pcm *foldback; /* Foldback PCM */
struct snd_pcm *spdif; /* SPDIF PCM */
struct snd_rawmidi *rmidi;
struct snd_seq_device *seq_dev;
ac97_bus_t *ac97_bus;
ac97_t *ac97;
ac97_t *ac97_sec;
struct snd_ac97_bus *ac97_bus;
struct snd_ac97 *ac97;
struct snd_ac97 *ac97_sec;
unsigned int musicvol_wavevol;
snd_trident_pcm_mixer_t pcm_mixer[32];
snd_kcontrol_t *ctl_vol; /* front volume */
snd_kcontrol_t *ctl_pan; /* pan */
snd_kcontrol_t *ctl_rvol; /* rear volume */
snd_kcontrol_t *ctl_cvol; /* center volume */
struct snd_trident_pcm_mixer pcm_mixer[32];
struct snd_kcontrol *ctl_vol; /* front volume */
struct snd_kcontrol *ctl_pan; /* pan */
struct snd_kcontrol *ctl_rvol; /* rear volume */
struct snd_kcontrol *ctl_cvol; /* center volume */
spinlock_t reg_lock;
struct gameport *gameport;
};
int snd_trident_create(snd_card_t * card,
int snd_trident_create(struct snd_card *card,
struct pci_dev *pci,
int pcm_streams,
int pcm_spdif_device,
int max_wavetable_size,
trident_t ** rtrident);
int snd_trident_create_gameport(trident_t *trident);
struct snd_trident ** rtrident);
int snd_trident_create_gameport(struct snd_trident *trident);
int snd_trident_pcm(trident_t * trident, int device, snd_pcm_t **rpcm);
int snd_trident_foldback_pcm(trident_t * trident, int device, snd_pcm_t **rpcm);
int snd_trident_spdif_pcm(trident_t * trident, int device, snd_pcm_t **rpcm);
int snd_trident_attach_synthesizer(trident_t * trident);
snd_trident_voice_t *snd_trident_alloc_voice(trident_t * trident, int type, int client, int port);
void snd_trident_free_voice(trident_t * trident, snd_trident_voice_t *voice);
void snd_trident_start_voice(trident_t * trident, unsigned int voice);
void snd_trident_stop_voice(trident_t * trident, unsigned int voice);
void snd_trident_write_voice_regs(trident_t * trident, snd_trident_voice_t *voice);
int snd_trident_pcm(struct snd_trident * trident, int device, struct snd_pcm **rpcm);
int snd_trident_foldback_pcm(struct snd_trident * trident, int device, struct snd_pcm **rpcm);
int snd_trident_spdif_pcm(struct snd_trident * trident, int device, struct snd_pcm **rpcm);
int snd_trident_attach_synthesizer(struct snd_trident * trident);
struct snd_trident_voice *snd_trident_alloc_voice(struct snd_trident * trident, int type,
int client, int port);
void snd_trident_free_voice(struct snd_trident * trident, struct snd_trident_voice *voice);
void snd_trident_start_voice(struct snd_trident * trident, unsigned int voice);
void snd_trident_stop_voice(struct snd_trident * trident, unsigned int voice);
void snd_trident_write_voice_regs(struct snd_trident * trident, struct snd_trident_voice *voice);
int snd_trident_suspend(struct pci_dev *pci, pm_message_t state);
int snd_trident_resume(struct pci_dev *pci);
/* TLB memory allocation */
snd_util_memblk_t *snd_trident_alloc_pages(trident_t *trident, snd_pcm_substream_t *substream);
int snd_trident_free_pages(trident_t *trident, snd_util_memblk_t *blk);
snd_util_memblk_t *snd_trident_synth_alloc(trident_t *trident, unsigned int size);
int snd_trident_synth_free(trident_t *trident, snd_util_memblk_t *blk);
int snd_trident_synth_copy_from_user(trident_t *trident, snd_util_memblk_t *blk, int offset, const char __user *data, int size);
struct snd_util_memblk *snd_trident_alloc_pages(struct snd_trident *trident,
struct snd_pcm_substream *substream);
int snd_trident_free_pages(struct snd_trident *trident, struct snd_util_memblk *blk);
struct snd_util_memblk *snd_trident_synth_alloc(struct snd_trident *trident, unsigned int size);
int snd_trident_synth_free(struct snd_trident *trident, struct snd_util_memblk *blk);
int snd_trident_synth_copy_from_user(struct snd_trident *trident, struct snd_util_memblk *blk,
int offset, const char __user *data, int size);
#endif /* __SOUND_TRIDENT_H */

173
include/sound/typedefs.h Normal file
View File

@ -0,0 +1,173 @@
/*
* Typedef's for backward compatibility (for out-of-kernel drivers)
*
* This file will be removed soon in future
*/
/* core stuff */
typedef struct snd_card snd_card_t;
typedef struct snd_device snd_device_t;
typedef struct snd_device_ops snd_device_ops_t;
typedef enum snd_card_type snd_card_type_t;
typedef struct snd_minor snd_minor_t;
/* info */
typedef struct snd_info_entry snd_info_entry_t;
typedef struct snd_info_buffer snd_info_buffer_t;
/* control */
typedef struct snd_ctl_file snd_ctl_file_t;
typedef struct snd_kcontrol snd_kcontrol_t;
typedef struct snd_kcontrol_new snd_kcontrol_new_t;
typedef struct snd_kcontrol_volatile snd_kcontrol_volatile_t;
typedef struct snd_kctl_event snd_kctl_event_t;
typedef struct snd_aes_iec958 snd_aes_iec958_t;
typedef struct snd_ctl_card_info snd_ctl_card_info_t;
typedef struct snd_ctl_elem_id snd_ctl_elem_id_t;
typedef struct snd_ctl_elem_list snd_ctl_elem_list_t;
typedef struct snd_ctl_elem_info snd_ctl_elem_info_t;
typedef struct snd_ctl_elem_value snd_ctl_elem_value_t;
typedef struct snd_ctl_event snd_ctl_event_t;
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
typedef struct snd_mixer_oss snd_mixer_oss_t;
#endif
/* timer */
typedef struct snd_timer snd_timer_t;
typedef struct snd_timer_instance snd_timer_instance_t;
typedef struct snd_timer_id snd_timer_id_t;
typedef struct snd_timer_ginfo snd_timer_ginfo_t;
typedef struct snd_timer_gparams snd_timer_gparams_t;
typedef struct snd_timer_gstatus snd_timer_gstatus_t;
typedef struct snd_timer_select snd_timer_select_t;
typedef struct snd_timer_info snd_timer_info_t;
typedef struct snd_timer_params snd_timer_params_t;
typedef struct snd_timer_status snd_timer_status_t;
typedef struct snd_timer_read snd_timer_read_t;
typedef struct snd_timer_tread snd_timer_tread_t;
/* PCM */
typedef struct snd_pcm snd_pcm_t;
typedef struct snd_pcm_str snd_pcm_str_t;
typedef struct snd_pcm_substream snd_pcm_substream_t;
typedef struct snd_pcm_info snd_pcm_info_t;
typedef struct snd_pcm_hw_params snd_pcm_hw_params_t;
typedef struct snd_pcm_sw_params snd_pcm_sw_params_t;
typedef struct snd_pcm_channel_info snd_pcm_channel_info_t;
typedef struct snd_pcm_status snd_pcm_status_t;
typedef struct snd_pcm_mmap_status snd_pcm_mmap_status_t;
typedef struct snd_pcm_mmap_control snd_pcm_mmap_control_t;
typedef struct snd_mask snd_mask_t;
typedef struct snd_sg_buf snd_pcm_sgbuf_t;
typedef struct snd_interval snd_interval_t;
typedef struct snd_xferi snd_xferi_t;
typedef struct snd_xfern snd_xfern_t;
typedef struct snd_xferv snd_xferv_t;
typedef struct snd_pcm_file snd_pcm_file_t;
typedef struct snd_pcm_runtime snd_pcm_runtime_t;
typedef struct snd_pcm_hardware snd_pcm_hardware_t;
typedef struct snd_pcm_ops snd_pcm_ops_t;
typedef struct snd_pcm_hw_rule snd_pcm_hw_rule_t;
typedef struct snd_pcm_hw_constraints snd_pcm_hw_constraints_t;
typedef struct snd_ratnum ratnum_t;
typedef struct snd_ratden ratden_t;
typedef struct snd_pcm_hw_constraint_ratnums snd_pcm_hw_constraint_ratnums_t;
typedef struct snd_pcm_hw_constraint_ratdens snd_pcm_hw_constraint_ratdens_t;
typedef struct snd_pcm_hw_constraint_list snd_pcm_hw_constraint_list_t;
typedef struct snd_pcm_group snd_pcm_group_t;
typedef struct snd_pcm_notify snd_pcm_notify_t;
/* rawmidi */
typedef struct snd_rawmidi snd_rawmidi_t;
typedef struct snd_rawmidi_info snd_rawmidi_info_t;
typedef struct snd_rawmidi_params snd_rawmidi_params_t;
typedef struct snd_rawmidi_status snd_rawmidi_status_t;
typedef struct snd_rawmidi_runtime snd_rawmidi_runtime_t;
typedef struct snd_rawmidi_substream snd_rawmidi_substream_t;
typedef struct snd_rawmidi_str snd_rawmidi_str_t;
typedef struct snd_rawmidi_ops snd_rawmidi_ops_t;
typedef struct snd_rawmidi_global_ops snd_rawmidi_global_ops_t;
typedef struct snd_rawmidi_file snd_rawmidi_file_t;
/* hwdep */
typedef struct snd_hwdep snd_hwdep_t;
typedef struct snd_hwdep_info snd_hwdep_info_t;
typedef struct snd_hwdep_dsp_status snd_hwdep_dsp_status_t;
typedef struct snd_hwdep_dsp_image snd_hwdep_dsp_image_t;
typedef struct snd_hwdep_ops snd_hwdep_ops_t;
/* sequencer */
typedef struct snd_seq_port_info snd_seq_port_info_t;
typedef struct snd_seq_port_subscribe snd_seq_port_subscribe_t;
typedef struct snd_seq_event snd_seq_event_t;
typedef struct snd_seq_addr snd_seq_addr_t;
typedef struct snd_seq_ev_volume snd_seq_ev_volume_t;
typedef struct snd_seq_ev_loop snd_seq_ev_loop_t;
typedef struct snd_seq_remove_events snd_seq_remove_events_t;
typedef struct snd_seq_query_subs snd_seq_query_subs_t;
typedef struct snd_seq_system_info snd_seq_system_info_t;
typedef struct snd_seq_client_info snd_seq_client_info_t;
typedef struct snd_seq_queue_info snd_seq_queue_info_t;
typedef struct snd_seq_queue_status snd_seq_queue_status_t;
typedef struct snd_seq_queue_tempo snd_seq_queue_tempo_t;
typedef struct snd_seq_queue_owner snd_seq_queue_owner_t;
typedef struct snd_seq_queue_timer snd_seq_queue_timer_t;
typedef struct snd_seq_queue_client snd_seq_queue_client_t;
typedef struct snd_seq_client_pool snd_seq_client_pool_t;
typedef struct snd_seq_instr snd_seq_instr_t;
typedef struct snd_seq_instr_data snd_seq_instr_data_t;
typedef struct snd_seq_instr_header snd_seq_instr_header_t;
typedef struct snd_seq_user_client user_client_t;
typedef struct snd_seq_kernel_client kernel_client_t;
typedef struct snd_seq_client client_t;
typedef struct snd_seq_queue queue_t;
/* seq_device */
typedef struct snd_seq_device snd_seq_device_t;
typedef struct snd_seq_dev_ops snd_seq_dev_ops_t;
/* seq_midi */
typedef struct snd_midi_event snd_midi_event_t;
/* seq_midi_emul */
typedef struct snd_midi_channel snd_midi_channel_t;
typedef struct snd_midi_channel_set snd_midi_channel_set_t;
typedef struct snd_midi_op snd_midi_op_t;
/* seq_oss */
typedef struct snd_seq_oss_arg snd_seq_oss_arg_t;
typedef struct snd_seq_oss_callback snd_seq_oss_callback_t;
typedef struct snd_seq_oss_reg snd_seq_oss_reg_t;
/* virmidi */
typedef struct snd_virmidi_dev snd_virmidi_dev_t;
typedef struct snd_virmidi snd_virmidi_t;
/* seq_instr */
typedef struct snd_seq_kcluster snd_seq_kcluster_t;
typedef struct snd_seq_kinstr_ops snd_seq_kinstr_ops_t;
typedef struct snd_seq_kinstr snd_seq_kinstr_t;
typedef struct snd_seq_kinstr_list snd_seq_kinstr_list_t;
/* ac97 */
typedef struct snd_ac97_bus ac97_bus_t;
typedef struct snd_ac97_bus_ops ac97_bus_ops_t;
typedef struct snd_ac97_template ac97_template_t;
typedef struct snd_ac97 ac97_t;
/* opl3/4 */
typedef struct snd_opl3 opl3_t;
typedef struct snd_opl4 opl4_t;
/* mpu401 */
typedef struct snd_mpu401 mpu401_t;
/* i2c */
typedef struct snd_i2c_device snd_i2c_device_t;
typedef struct snd_i2c_bus snd_i2c_bus_t;
typedef struct snd_ak4531 ak4531_t;

View File

@ -15,7 +15,7 @@
* features support
*/
/* $Id: uda1341.h,v 1.6 2004/05/03 17:36:50 tiwai Exp $ */
/* $Id: uda1341.h,v 1.8 2005/11/17 14:17:21 tiwai Exp $ */
#define UDA1341_ALSA_NAME "snd-uda1341"
@ -37,11 +37,6 @@ enum uda1341_onoff {
ON,
};
const char *onoff_names[] = {
"Off",
"On",
};
enum uda1341_format {
I2S=0,
LSB16,
@ -53,17 +48,6 @@ enum uda1341_format {
LSB20MSB,
};
const char *format_names[] = {
"I2S-bus",
"LSB 16bits",
"LSB 18bits",
"LSB 20bits",
"MSB",
"in LSB 16bits/out MSB",
"in LSB 18bits/out MSB",
"in LSB 20bits/out MSB",
};
enum uda1341_fs {
F512=0,
F384,
@ -71,23 +55,11 @@ enum uda1341_fs {
Funused,
};
const char *fs_names[] = {
"512*fs",
"384*fs",
"256*fs",
"Unused - bad value!",
};
enum uda1341_peak {
BEFORE=0,
AFTER,
};
const char *peak_names[] = {
"before",
"after",
};
enum uda1341_filter {
FLAT=0,
MIN,
@ -95,24 +67,6 @@ enum uda1341_filter {
MAX,
};
const char *filter_names[] = {
"flat",
"min",
"min",
"max",
};
const char*bass_values[][16] = {
{"0 dB", "0 dB", "0 dB", "0 dB", "0 dB", "0 dB", "0 dB", "0 dB", "0 dB", "0 dB", "0 dB",
"0 dB", "0 dB", "0 dB", "0 dB", "undefined", }, //flat
{"0 dB", "2 dB", "4 dB", "6 dB", "8 dB", "10 dB", "12 dB", "14 dB", "16 dB", "18 dB", "18 dB",
"18 dB", "18 dB", "18 dB", "18 dB", "undefined",}, // min
{"0 dB", "2 dB", "4 dB", "6 dB", "8 dB", "10 dB", "12 dB", "14 dB", "16 dB", "18 dB", "18 dB",
"18 dB", "18 dB", "18 dB", "18 dB", "undefined",}, // min
{"0 dB", "2 dB", "4 dB", "6 dB", "8 dB", "10 dB", "12 dB", "14 dB", "16 dB", "18 dB", "20 dB",
"22 dB", "24 dB", "24 dB", "24 dB", "undefined",}, // max
};
enum uda1341_mixer {
DOUBLE,
LINE,
@ -120,13 +74,6 @@ enum uda1341_mixer {
MIXER,
};
const char *mixer_names[] = {
"double differential",
"input channel 1 (line in)",
"input channel 2 (microphone)",
"digital mixer",
};
enum uda1341_deemp {
NONE,
D32,
@ -134,58 +81,6 @@ enum uda1341_deemp {
D48,
};
const char *deemp_names[] = {
"none",
"32 kHz",
"44.1 kHz",
"48 kHz",
};
const char *mic_sens_value[] = {
"-3 dB", "0 dB", "3 dB", "9 dB", "15 dB", "21 dB", "27 dB", "not used",
};
const unsigned short AGC_atime[] = {
11, 16, 11, 16, 21, 11, 16, 21,
};
const unsigned short AGC_dtime[] = {
100, 100, 200, 200, 200, 400, 400, 400,
};
const char *AGC_level[] = {
"-9.0", "-11.5", "-15.0", "-17.5",
};
const char *ig_small_value[] = {
"-3.0", "-2.5", "-2.0", "-1.5", "-1.0", "-0.5",
};
/*
* this was computed as peak_value[i] = pow((63-i)*1.42,1.013)
*
* UDA1341 datasheet on page 21: Peak value (dB) = (Peak level - 63.5)*5*log2
* There is an table with these values [level]=value: [3]=-90.31, [7]=-84.29
* [61]=-2.78, [62] = -1.48, [63] = 0.0
* I tried to compute it, but using but even using logarithm with base either 10 or 2
* i was'n able to get values in the table from the formula. So I constructed another
* formula (see above) to interpolate the values as good as possible. If there is some
* mistake, please contact me on tomas.kasparek@seznam.cz. Thanks.
* UDA1341TS datasheet is available at:
* http://www-us9.semiconductors.com/acrobat/datasheets/UDA1341TS_3.pdf
*/
const char *peak_value[] = {
"-INF dB", "N.A.", "N.A", "90.31 dB", "N.A.", "N.A.", "N.A.", "-84.29 dB",
"-82.65 dB", "-81.13 dB", "-79.61 dB", "-78.09 dB", "-76.57 dB", "-75.05 dB", "-73.53 dB",
"-72.01 dB", "-70.49 dB", "-68.97 dB", "-67.45 dB", "-65.93 dB", "-64.41 dB", "-62.90 dB",
"-61.38 dB", "-59.86 dB", "-58.35 dB", "-56.83 dB", "-55.32 dB", "-53.80 dB", "-52.29 dB",
"-50.78 dB", "-49.26 dB", "-47.75 dB", "-46.24 dB", "-44.73 dB", "-43.22 dB", "-41.71 dB",
"-40.20 dB", "-38.69 dB", "-37.19 dB", "-35.68 dB", "-34.17 dB", "-32.67 dB", "-31.17 dB",
"-29.66 dB", "-28.16 dB", "-26.66 dB", "-25.16 dB", "-23.66 dB", "-22.16 dB", "-20.67 dB",
"-19.17 dB", "-17.68 dB", "-16.19 dB", "-14.70 dB", "-13.21 dB", "-11.72 dB", "-10.24 dB",
"-8.76 dB", "-7.28 dB", "-5.81 dB", "-4.34 dB", "-2.88 dB", "-1.43 dB", "0.00 dB",
};
enum uda1341_config {
CMD_READ_REG = 0,
CMD_RESET,
@ -224,7 +119,7 @@ enum write_through {
FLUSH,
};
int __init snd_chip_uda1341_mixer_new(snd_card_t *card, struct l3_client **clnt);
int __init snd_chip_uda1341_mixer_new(struct snd_card *card, struct l3_client **clnt);
/*
* Local variables:

View File

@ -20,29 +20,25 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
typedef struct snd_util_memblk snd_util_memblk_t;
typedef struct snd_util_memhdr snd_util_memhdr_t;
typedef unsigned int snd_util_unit_t;
/*
* memory block
*/
struct snd_util_memblk {
snd_util_unit_t size; /* size of this block */
snd_util_unit_t offset; /* zero-offset of this block */
unsigned int size; /* size of this block */
unsigned int offset; /* zero-offset of this block */
struct list_head list; /* link */
};
#define snd_util_memblk_argptr(blk) (void*)((char*)(blk) + sizeof(snd_util_memblk_t))
#define snd_util_memblk_argptr(blk) (void*)((char*)(blk) + sizeof(struct snd_util_memblk))
/*
* memory management information
*/
struct snd_util_memhdr {
snd_util_unit_t size; /* size of whole data */
unsigned int size; /* size of whole data */
struct list_head block; /* block linked-list header */
int nblocks; /* # of allocated blocks */
snd_util_unit_t used; /* used memory size */
unsigned int used; /* used memory size */
int block_extra_size; /* extra data size of chunk */
struct semaphore block_mutex; /* lock */
};
@ -50,15 +46,17 @@ struct snd_util_memhdr {
/*
* prototypes
*/
snd_util_memhdr_t *snd_util_memhdr_new(int memsize);
void snd_util_memhdr_free(snd_util_memhdr_t *hdr);
snd_util_memblk_t *snd_util_mem_alloc(snd_util_memhdr_t *hdr, int size);
int snd_util_mem_free(snd_util_memhdr_t *hdr, snd_util_memblk_t *blk);
int snd_util_mem_avail(snd_util_memhdr_t *hdr);
struct snd_util_memhdr *snd_util_memhdr_new(int memsize);
void snd_util_memhdr_free(struct snd_util_memhdr *hdr);
struct snd_util_memblk *snd_util_mem_alloc(struct snd_util_memhdr *hdr, int size);
int snd_util_mem_free(struct snd_util_memhdr *hdr, struct snd_util_memblk *blk);
int snd_util_mem_avail(struct snd_util_memhdr *hdr);
/* functions without mutex */
snd_util_memblk_t *__snd_util_mem_alloc(snd_util_memhdr_t *hdr, int size);
void __snd_util_mem_free(snd_util_memhdr_t *hdr, snd_util_memblk_t *blk);
snd_util_memblk_t *__snd_util_memblk_new(snd_util_memhdr_t *hdr, snd_util_unit_t units, struct list_head *prev);
struct snd_util_memblk *__snd_util_mem_alloc(struct snd_util_memhdr *hdr, int size);
void __snd_util_mem_free(struct snd_util_memhdr *hdr, struct snd_util_memblk *blk);
struct snd_util_memblk *__snd_util_memblk_new(struct snd_util_memhdr *hdr,
unsigned int units,
struct list_head *prev);
#endif /* __SOUND_UTIL_MEM_H */

View File

@ -1,3 +1,3 @@
/* include/version.h. Generated by configure. */
#define CONFIG_SND_VERSION "1.0.10rc3"
#define CONFIG_SND_DATE " (Mon Nov 07 13:30:21 2005 UTC)"
#define CONFIG_SND_VERSION "1.0.11rc2"
#define CONFIG_SND_DATE " (Wed Jan 04 08:57:20 2006 UTC)"

View File

@ -36,9 +36,6 @@
struct firmware;
struct device;
typedef struct snd_vx_core vx_core_t;
typedef struct vx_pipe vx_pipe_t;
#define VX_DRIVER_VERSION 0x010000 /* 1.0.0 */
/*
@ -76,7 +73,7 @@ struct vx_pipe {
int channels;
unsigned int differed_type;
pcx_time_t pcx_time;
snd_pcm_substream_t *substream;
struct snd_pcm_substream *substream;
int hbuf_size; /* H-buffer size in bytes */
int buffer_bytes; /* the ALSA pcm buffer size in bytes */
@ -88,36 +85,38 @@ struct vx_pipe {
u64 cur_count; /* current sample position (for playback) */
unsigned int references; /* an output pipe may be used for monitoring and/or playback */
vx_pipe_t *monitoring_pipe; /* pointer to the monitoring pipe (capture pipe only)*/
struct vx_pipe *monitoring_pipe; /* pointer to the monitoring pipe (capture pipe only)*/
struct tasklet_struct start_tq;
};
struct vx_core;
struct snd_vx_ops {
/* low-level i/o */
unsigned char (*in8)(vx_core_t *chip, int reg);
unsigned int (*in32)(vx_core_t *chip, int reg);
void (*out8)(vx_core_t *chip, int reg, unsigned char val);
void (*out32)(vx_core_t *chip, int reg, unsigned int val);
unsigned char (*in8)(struct vx_core *chip, int reg);
unsigned int (*in32)(struct vx_core *chip, int reg);
void (*out8)(struct vx_core *chip, int reg, unsigned char val);
void (*out32)(struct vx_core *chip, int reg, unsigned int val);
/* irq */
int (*test_and_ack)(vx_core_t *chip);
void (*validate_irq)(vx_core_t *chip, int enable);
int (*test_and_ack)(struct vx_core *chip);
void (*validate_irq)(struct vx_core *chip, int enable);
/* codec */
void (*write_codec)(vx_core_t *chip, int codec, unsigned int data);
void (*akm_write)(vx_core_t *chip, int reg, unsigned int data);
void (*reset_codec)(vx_core_t *chip);
void (*change_audio_source)(vx_core_t *chip, int src);
void (*set_clock_source)(vx_core_t *chp, int src);
void (*write_codec)(struct vx_core *chip, int codec, unsigned int data);
void (*akm_write)(struct vx_core *chip, int reg, unsigned int data);
void (*reset_codec)(struct vx_core *chip);
void (*change_audio_source)(struct vx_core *chip, int src);
void (*set_clock_source)(struct vx_core *chp, int src);
/* chip init */
int (*load_dsp)(vx_core_t *chip, int idx, const struct firmware *fw);
void (*reset_dsp)(vx_core_t *chip);
void (*reset_board)(vx_core_t *chip, int cold_reset);
int (*add_controls)(vx_core_t *chip);
int (*load_dsp)(struct vx_core *chip, int idx, const struct firmware *fw);
void (*reset_dsp)(struct vx_core *chip);
void (*reset_board)(struct vx_core *chip, int cold_reset);
int (*add_controls)(struct vx_core *chip);
/* pcm */
void (*dma_write)(vx_core_t *chip, snd_pcm_runtime_t *runtime,
vx_pipe_t *pipe, int count);
void (*dma_read)(vx_core_t *chip, snd_pcm_runtime_t *runtime,
vx_pipe_t *pipe, int count);
void (*dma_write)(struct vx_core *chip, struct snd_pcm_runtime *runtime,
struct vx_pipe *pipe, int count);
void (*dma_read)(struct vx_core *chip, struct snd_pcm_runtime *runtime,
struct vx_pipe *pipe, int count);
};
struct snd_vx_hardware {
@ -158,10 +157,10 @@ enum {
/* min/max values for analog output for old codecs */
#define VX_ANALOG_OUT_LEVEL_MAX 0xe3
struct snd_vx_core {
struct vx_core {
/* ALSA stuff */
snd_card_t *card;
snd_pcm_t *pcm[VX_MAX_CODECS];
struct snd_card *card;
struct snd_pcm *pcm[VX_MAX_CODECS];
int type; /* VX_TYPE_XXX */
int irq;
@ -179,7 +178,7 @@ struct snd_vx_core {
unsigned int pcm_running;
struct device *dev;
snd_hwdep_t *hwdep;
struct snd_hwdep *hwdep;
struct vx_rmh irq_rmh; /* RMH used in interrupts */
@ -216,14 +215,14 @@ struct snd_vx_core {
/*
* constructor
*/
vx_core_t *snd_vx_create(snd_card_t *card, struct snd_vx_hardware *hw,
struct snd_vx_ops *ops, int extra_size);
int snd_vx_setup_firmware(vx_core_t *chip);
int snd_vx_load_boot_image(vx_core_t *chip, const struct firmware *dsp);
int snd_vx_dsp_boot(vx_core_t *chip, const struct firmware *dsp);
int snd_vx_dsp_load(vx_core_t *chip, const struct firmware *dsp);
struct vx_core *snd_vx_create(struct snd_card *card, struct snd_vx_hardware *hw,
struct snd_vx_ops *ops, int extra_size);
int snd_vx_setup_firmware(struct vx_core *chip);
int snd_vx_load_boot_image(struct vx_core *chip, const struct firmware *dsp);
int snd_vx_dsp_boot(struct vx_core *chip, const struct firmware *dsp);
int snd_vx_dsp_load(struct vx_core *chip, const struct firmware *dsp);
void snd_vx_free_firmware(vx_core_t *chip);
void snd_vx_free_firmware(struct vx_core *chip);
/*
* interrupt handler; exported for pcmcia
@ -233,37 +232,37 @@ irqreturn_t snd_vx_irq_handler(int irq, void *dev, struct pt_regs *regs);
/*
* lowlevel functions
*/
static inline int vx_test_and_ack(vx_core_t *chip)
static inline int vx_test_and_ack(struct vx_core *chip)
{
snd_assert(chip->ops->test_and_ack, return -ENXIO);
return chip->ops->test_and_ack(chip);
}
static inline void vx_validate_irq(vx_core_t *chip, int enable)
static inline void vx_validate_irq(struct vx_core *chip, int enable)
{
snd_assert(chip->ops->validate_irq, return);
chip->ops->validate_irq(chip, enable);
}
static inline unsigned char snd_vx_inb(vx_core_t *chip, int reg)
static inline unsigned char snd_vx_inb(struct vx_core *chip, int reg)
{
snd_assert(chip->ops->in8, return 0);
return chip->ops->in8(chip, reg);
}
static inline unsigned int snd_vx_inl(vx_core_t *chip, int reg)
static inline unsigned int snd_vx_inl(struct vx_core *chip, int reg)
{
snd_assert(chip->ops->in32, return 0);
return chip->ops->in32(chip, reg);
}
static inline void snd_vx_outb(vx_core_t *chip, int reg, unsigned char val)
static inline void snd_vx_outb(struct vx_core *chip, int reg, unsigned char val)
{
snd_assert(chip->ops->out8, return);
chip->ops->out8(chip, reg, val);
}
static inline void snd_vx_outl(vx_core_t *chip, int reg, unsigned int val)
static inline void snd_vx_outl(struct vx_core *chip, int reg, unsigned int val)
{
snd_assert(chip->ops->out32, return);
chip->ops->out32(chip, reg, val);
@ -274,27 +273,25 @@ static inline void snd_vx_outl(vx_core_t *chip, int reg, unsigned int val)
#define vx_inl(chip,reg) snd_vx_inl(chip, VX_##reg)
#define vx_outl(chip,reg,val) snd_vx_outl(chip, VX_##reg,val)
void snd_vx_delay(vx_core_t *chip, int msec);
static inline void vx_reset_dsp(vx_core_t *chip)
static inline void vx_reset_dsp(struct vx_core *chip)
{
snd_assert(chip->ops->reset_dsp, return);
chip->ops->reset_dsp(chip);
}
int vx_send_msg(vx_core_t *chip, struct vx_rmh *rmh);
int vx_send_msg_nolock(vx_core_t *chip, struct vx_rmh *rmh);
int vx_send_rih(vx_core_t *chip, int cmd);
int vx_send_rih_nolock(vx_core_t *chip, int cmd);
int vx_send_msg(struct vx_core *chip, struct vx_rmh *rmh);
int vx_send_msg_nolock(struct vx_core *chip, struct vx_rmh *rmh);
int vx_send_rih(struct vx_core *chip, int cmd);
int vx_send_rih_nolock(struct vx_core *chip, int cmd);
void vx_reset_codec(vx_core_t *chip, int cold_reset);
void vx_reset_codec(struct vx_core *chip, int cold_reset);
/*
* check the bit on the specified register
* returns zero if a bit matches, or a negative error code.
* exported for vxpocket driver
*/
int snd_vx_check_reg_bit(vx_core_t *chip, int reg, int mask, int bit, int time);
int snd_vx_check_reg_bit(struct vx_core *chip, int reg, int mask, int bit, int time);
#define vx_check_isr(chip,mask,bit,time) snd_vx_check_reg_bit(chip, VX_ISR, mask, bit, time)
#define vx_wait_isr_bit(chip,bit) vx_check_isr(chip, bit, bit, 200)
#define vx_wait_for_rx_full(chip) vx_wait_isr_bit(chip, ISR_RX_FULL)
@ -303,15 +300,15 @@ int snd_vx_check_reg_bit(vx_core_t *chip, int reg, int mask, int bit, int time);
/*
* pseudo-DMA transfer
*/
static inline void vx_pseudo_dma_write(vx_core_t *chip, snd_pcm_runtime_t *runtime,
vx_pipe_t *pipe, int count)
static inline void vx_pseudo_dma_write(struct vx_core *chip, struct snd_pcm_runtime *runtime,
struct vx_pipe *pipe, int count)
{
snd_assert(chip->ops->dma_write, return);
chip->ops->dma_write(chip, runtime, pipe, count);
}
static inline void vx_pseudo_dma_read(vx_core_t *chip, snd_pcm_runtime_t *runtime,
vx_pipe_t *pipe, int count)
static inline void vx_pseudo_dma_read(struct vx_core *chip, struct snd_pcm_runtime *runtime,
struct vx_pipe *pipe, int count)
{
snd_assert(chip->ops->dma_read, return);
chip->ops->dma_read(chip, runtime, pipe, count);
@ -329,26 +326,32 @@ static inline void vx_pseudo_dma_read(vx_core_t *chip, snd_pcm_runtime_t *runtim
/*
* pcm stuff
*/
int snd_vx_pcm_new(vx_core_t *chip);
void vx_pcm_update_intr(vx_core_t *chip, unsigned int events);
int snd_vx_pcm_new(struct vx_core *chip);
void vx_pcm_update_intr(struct vx_core *chip, unsigned int events);
/*
* mixer stuff
*/
int snd_vx_mixer_new(vx_core_t *chip);
void vx_toggle_dac_mute(vx_core_t *chip, int mute);
int vx_sync_audio_source(vx_core_t *chip);
int vx_set_monitor_level(vx_core_t *chip, int audio, int level, int active);
int snd_vx_mixer_new(struct vx_core *chip);
void vx_toggle_dac_mute(struct vx_core *chip, int mute);
int vx_sync_audio_source(struct vx_core *chip);
int vx_set_monitor_level(struct vx_core *chip, int audio, int level, int active);
/*
* IEC958 & clock stuff
*/
void vx_set_iec958_status(vx_core_t *chip, unsigned int bits);
int vx_set_clock(vx_core_t *chip, unsigned int freq);
void vx_set_internal_clock(vx_core_t *chip, unsigned int freq);
int vx_change_frequency(vx_core_t *chip);
void vx_set_iec958_status(struct vx_core *chip, unsigned int bits);
int vx_set_clock(struct vx_core *chip, unsigned int freq);
void vx_set_internal_clock(struct vx_core *chip, unsigned int freq);
int vx_change_frequency(struct vx_core *chip);
/*
* PM
*/
int snd_vx_suspend(struct vx_core *card, pm_message_t state);
int snd_vx_resume(struct vx_core *card);
/*
* hardware constants
*/

View File

@ -184,7 +184,7 @@
*
*/
typedef struct _snd_ymfpci_playback_bank {
struct snd_ymfpci_playback_bank {
u32 format;
u32 loop_default;
u32 base; /* 32-bit address */
@ -215,46 +215,45 @@ typedef struct _snd_ymfpci_playback_bank {
u32 eff3_gain;
u32 lpfD1;
u32 lpfD2;
} snd_ymfpci_playback_bank_t;
};
typedef struct _snd_ymfpci_capture_bank {
struct snd_ymfpci_capture_bank {
u32 base; /* 32-bit address */
u32 loop_end; /* 32-bit offset */
u32 start; /* 32-bit offset */
u32 num_of_loops; /* counter */
} snd_ymfpci_capture_bank_t;
};
typedef struct _snd_ymfpci_effect_bank {
struct snd_ymfpci_effect_bank {
u32 base; /* 32-bit address */
u32 loop_end; /* 32-bit offset */
u32 start; /* 32-bit offset */
u32 temp;
} snd_ymfpci_effect_bank_t;
};
typedef struct _snd_ymfpci_voice ymfpci_voice_t;
typedef struct _snd_ymfpci_pcm ymfpci_pcm_t;
typedef struct _snd_ymfpci ymfpci_t;
struct snd_ymfpci_pcm;
struct snd_ymfpci;
typedef enum {
enum snd_ymfpci_voice_type {
YMFPCI_PCM,
YMFPCI_SYNTH,
YMFPCI_MIDI
} ymfpci_voice_type_t;
};
struct _snd_ymfpci_voice {
ymfpci_t *chip;
struct snd_ymfpci_voice {
struct snd_ymfpci *chip;
int number;
unsigned int use: 1,
pcm: 1,
synth: 1,
midi: 1;
snd_ymfpci_playback_bank_t *bank;
struct snd_ymfpci_playback_bank *bank;
dma_addr_t bank_addr;
void (*interrupt)(ymfpci_t *chip, ymfpci_voice_t *voice);
ymfpci_pcm_t *ypcm;
void (*interrupt)(struct snd_ymfpci *chip, struct snd_ymfpci_voice *voice);
struct snd_ymfpci_pcm *ypcm;
};
typedef enum {
enum snd_ymfpci_pcm_type {
PLAYBACK_VOICE,
CAPTURE_REC,
CAPTURE_AC97,
@ -263,13 +262,13 @@ typedef enum {
EFFECT_EFF1,
EFFECT_EFF2,
EFFECT_EFF3
} snd_ymfpci_pcm_type_t;
};
struct _snd_ymfpci_pcm {
ymfpci_t *chip;
snd_ymfpci_pcm_type_t type;
snd_pcm_substream_t *substream;
ymfpci_voice_t *voices[2]; /* playback only */
struct snd_ymfpci_pcm {
struct snd_ymfpci *chip;
enum snd_ymfpci_pcm_type type;
struct snd_pcm_substream *substream;
struct snd_ymfpci_voice *voices[2]; /* playback only */
unsigned int running: 1;
unsigned int output_front: 1;
unsigned int output_rear: 1;
@ -282,7 +281,7 @@ struct _snd_ymfpci_pcm {
u32 shift;
};
struct _snd_ymfpci {
struct snd_ymfpci {
int irq;
unsigned int device_id; /* PCI device ID */
@ -316,47 +315,47 @@ struct _snd_ymfpci {
struct snd_dma_buffer ac3_tmp_base;
u32 *ctrl_playback;
snd_ymfpci_playback_bank_t *bank_playback[YDSXG_PLAYBACK_VOICES][2];
snd_ymfpci_capture_bank_t *bank_capture[YDSXG_CAPTURE_VOICES][2];
snd_ymfpci_effect_bank_t *bank_effect[YDSXG_EFFECT_VOICES][2];
struct snd_ymfpci_playback_bank *bank_playback[YDSXG_PLAYBACK_VOICES][2];
struct snd_ymfpci_capture_bank *bank_capture[YDSXG_CAPTURE_VOICES][2];
struct snd_ymfpci_effect_bank *bank_effect[YDSXG_EFFECT_VOICES][2];
int start_count;
u32 active_bank;
ymfpci_voice_t voices[64];
struct snd_ymfpci_voice voices[64];
ac97_bus_t *ac97_bus;
ac97_t *ac97;
snd_rawmidi_t *rawmidi;
snd_timer_t *timer;
struct snd_ac97_bus *ac97_bus;
struct snd_ac97 *ac97;
struct snd_rawmidi *rawmidi;
struct snd_timer *timer;
struct pci_dev *pci;
snd_card_t *card;
snd_pcm_t *pcm;
snd_pcm_t *pcm2;
snd_pcm_t *pcm_spdif;
snd_pcm_t *pcm_4ch;
snd_pcm_substream_t *capture_substream[YDSXG_CAPTURE_VOICES];
snd_pcm_substream_t *effect_substream[YDSXG_EFFECT_VOICES];
snd_kcontrol_t *ctl_vol_recsrc;
snd_kcontrol_t *ctl_vol_adcrec;
snd_kcontrol_t *ctl_vol_spdifrec;
struct snd_card *card;
struct snd_pcm *pcm;
struct snd_pcm *pcm2;
struct snd_pcm *pcm_spdif;
struct snd_pcm *pcm_4ch;
struct snd_pcm_substream *capture_substream[YDSXG_CAPTURE_VOICES];
struct snd_pcm_substream *effect_substream[YDSXG_EFFECT_VOICES];
struct snd_kcontrol *ctl_vol_recsrc;
struct snd_kcontrol *ctl_vol_adcrec;
struct snd_kcontrol *ctl_vol_spdifrec;
unsigned short spdif_bits, spdif_pcm_bits;
snd_kcontrol_t *spdif_pcm_ctl;
struct snd_kcontrol *spdif_pcm_ctl;
int mode_dup4ch;
int rear_opened;
int spdif_opened;
struct {
u16 left;
u16 right;
snd_kcontrol_t *ctl;
struct snd_kcontrol *ctl;
} pcm_mixer[32];
spinlock_t reg_lock;
spinlock_t voice_lock;
wait_queue_head_t interrupt_sleep;
atomic_t interrupt_sleep_count;
snd_info_entry_t *proc_entry;
struct snd_info_entry *proc_entry;
#ifdef CONFIG_PM
u32 *saved_regs;
@ -364,17 +363,20 @@ struct _snd_ymfpci {
#endif
};
int snd_ymfpci_create(snd_card_t * card,
int snd_ymfpci_create(struct snd_card *card,
struct pci_dev *pci,
unsigned short old_legacy_ctrl,
ymfpci_t ** rcodec);
void snd_ymfpci_free_gameport(ymfpci_t *chip);
struct snd_ymfpci ** rcodec);
void snd_ymfpci_free_gameport(struct snd_ymfpci *chip);
int snd_ymfpci_pcm(ymfpci_t *chip, int device, snd_pcm_t **rpcm);
int snd_ymfpci_pcm2(ymfpci_t *chip, int device, snd_pcm_t **rpcm);
int snd_ymfpci_pcm_spdif(ymfpci_t *chip, int device, snd_pcm_t **rpcm);
int snd_ymfpci_pcm_4ch(ymfpci_t *chip, int device, snd_pcm_t **rpcm);
int snd_ymfpci_mixer(ymfpci_t *chip, int rear_switch);
int snd_ymfpci_timer(ymfpci_t *chip, int device);
int snd_ymfpci_suspend(struct pci_dev *pci, pm_message_t state);
int snd_ymfpci_resume(struct pci_dev *pci);
int snd_ymfpci_pcm(struct snd_ymfpci *chip, int device, struct snd_pcm **rpcm);
int snd_ymfpci_pcm2(struct snd_ymfpci *chip, int device, struct snd_pcm **rpcm);
int snd_ymfpci_pcm_spdif(struct snd_ymfpci *chip, int device, struct snd_pcm **rpcm);
int snd_ymfpci_pcm_4ch(struct snd_ymfpci *chip, int device, struct snd_pcm **rpcm);
int snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch);
int snd_ymfpci_timer(struct snd_ymfpci *chip, int device);
#endif /* __SOUND_YMFPCI_H */

View File

@ -48,14 +48,6 @@ config SND
For more information, see <http://www.alsa-project.org/>
config SND_AC97_CODEC
tristate
select SND_PCM
select SND_AC97_BUS
config SND_AC97_BUS
tristate
source "sound/core/Kconfig"
source "sound/drivers/Kconfig"

View File

@ -7,7 +7,6 @@ config SND_SA11XX_UDA1341
tristate "SA11xx UDA1341TS driver (iPaq H3600)"
depends on ARCH_SA1100 && SND && L3
select SND_PCM
select SND_GENERIC_DRIVER
help
Say Y here if you have a Compaq iPaq H3x00 handheld computer
and want to use its Philips UDA 1341 audio chip.

View File

@ -40,7 +40,7 @@
*/
#undef CONFIG_PM
static void aaci_ac97_select_codec(struct aaci *aaci, ac97_t *ac97)
static void aaci_ac97_select_codec(struct aaci *aaci, struct snd_ac97 *ac97)
{
u32 v, maincr = aaci->maincr | MAINCR_SCRA(ac97->num);
@ -65,7 +65,7 @@ static void aaci_ac97_select_codec(struct aaci *aaci, ac97_t *ac97)
* SI1TxEn, SI2TxEn and SI12TxEn bits are set in the AACI_MAINCR
* register.
*/
static void aaci_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short val)
static void aaci_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val)
{
struct aaci *aaci = ac97->private_data;
u32 v;
@ -97,7 +97,7 @@ static void aaci_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short val
/*
* Read an AC'97 register.
*/
static unsigned short aaci_ac97_read(ac97_t *ac97, unsigned short reg)
static unsigned short aaci_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
{
struct aaci *aaci = ac97->private_data;
u32 v;
@ -284,11 +284,11 @@ static unsigned int rate_list[] = {
* (unimplemented)
*/
static int
aaci_rule_rate_by_channels(snd_pcm_hw_params_t *p, snd_pcm_hw_rule_t *rule)
aaci_rule_rate_by_channels(struct snd_pcm_hw_params *p, struct snd_pcm_hw_rule *rule)
{
struct aaci *aaci = rule->private;
unsigned int rate_mask = SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_5512;
snd_interval_t *c = hw_param_interval(p, SNDRV_PCM_HW_PARAM_CHANNELS);
struct snd_interval *c = hw_param_interval(p, SNDRV_PCM_HW_PARAM_CHANNELS);
switch (c->max) {
case 6:
@ -304,7 +304,7 @@ aaci_rule_rate_by_channels(snd_pcm_hw_params_t *p, snd_pcm_hw_rule_t *rule)
rate_mask);
}
static snd_pcm_hardware_t aaci_hw_info = {
static struct snd_pcm_hardware aaci_hw_info = {
.info = SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_INTERLEAVED |
@ -330,10 +330,10 @@ static snd_pcm_hardware_t aaci_hw_info = {
.periods_max = PAGE_SIZE / 16,
};
static int aaci_pcm_open(struct aaci *aaci, snd_pcm_substream_t *substream,
static int aaci_pcm_open(struct aaci *aaci, struct snd_pcm_substream *substream,
struct aaci_runtime *aacirun)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
int ret;
aacirun->substream = substream;
@ -375,7 +375,7 @@ static int aaci_pcm_open(struct aaci *aaci, snd_pcm_substream_t *substream,
/*
* Common ALSA stuff
*/
static int aaci_pcm_close(snd_pcm_substream_t *substream)
static int aaci_pcm_close(struct snd_pcm_substream *substream)
{
struct aaci *aaci = substream->private_data;
struct aaci_runtime *aacirun = substream->runtime->private_data;
@ -388,7 +388,7 @@ static int aaci_pcm_close(snd_pcm_substream_t *substream)
return 0;
}
static int aaci_pcm_hw_free(snd_pcm_substream_t *substream)
static int aaci_pcm_hw_free(struct snd_pcm_substream *substream)
{
struct aaci_runtime *aacirun = substream->runtime->private_data;
@ -409,9 +409,9 @@ static int aaci_pcm_hw_free(snd_pcm_substream_t *substream)
return 0;
}
static int aaci_pcm_hw_params(snd_pcm_substream_t *substream,
static int aaci_pcm_hw_params(struct snd_pcm_substream *substream,
struct aaci_runtime *aacirun,
snd_pcm_hw_params_t *params)
struct snd_pcm_hw_params *params)
{
int err;
@ -434,9 +434,9 @@ static int aaci_pcm_hw_params(snd_pcm_substream_t *substream,
return err;
}
static int aaci_pcm_prepare(snd_pcm_substream_t *substream)
static int aaci_pcm_prepare(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
struct aaci_runtime *aacirun = runtime->private_data;
aacirun->start = (void *)runtime->dma_area;
@ -448,16 +448,16 @@ static int aaci_pcm_prepare(snd_pcm_substream_t *substream)
return 0;
}
static snd_pcm_uframes_t aaci_pcm_pointer(snd_pcm_substream_t *substream)
static snd_pcm_uframes_t aaci_pcm_pointer(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
struct aaci_runtime *aacirun = runtime->private_data;
ssize_t bytes = aacirun->ptr - aacirun->start;
return bytes_to_frames(runtime, bytes);
}
static int aaci_pcm_mmap(snd_pcm_substream_t *substream, struct vm_area_struct *vma)
static int aaci_pcm_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *vma)
{
return devdma_mmap(NULL, substream, vma);
}
@ -484,7 +484,7 @@ static const u32 channels_to_txmask[] = {
static unsigned int channel_list[] = { 2, 4, 6 };
static int
aaci_rule_channels(snd_pcm_hw_params_t *p, snd_pcm_hw_rule_t *rule)
aaci_rule_channels(struct snd_pcm_hw_params *p, struct snd_pcm_hw_rule *rule)
{
struct aaci *aaci = rule->private;
unsigned int chan_mask = 1 << 0, slots;
@ -504,7 +504,7 @@ aaci_rule_channels(snd_pcm_hw_params_t *p, snd_pcm_hw_rule_t *rule)
chan_mask);
}
static int aaci_pcm_playback_open(snd_pcm_substream_t *substream)
static int aaci_pcm_playback_open(struct snd_pcm_substream *substream)
{
struct aaci *aaci = substream->private_data;
int ret;
@ -522,8 +522,8 @@ static int aaci_pcm_playback_open(snd_pcm_substream_t *substream)
return aaci_pcm_open(aaci, substream, &aaci->playback);
}
static int aaci_pcm_playback_hw_params(snd_pcm_substream_t *substream,
snd_pcm_hw_params_t *params)
static int aaci_pcm_playback_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct aaci *aaci = substream->private_data;
struct aaci_runtime *aacirun = substream->runtime->private_data;
@ -575,7 +575,7 @@ static void aaci_pcm_playback_start(struct aaci_runtime *aacirun)
writel(aacirun->cr, aacirun->base + AACI_TXCR);
}
static int aaci_pcm_playback_trigger(snd_pcm_substream_t *substream, int cmd)
static int aaci_pcm_playback_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct aaci *aaci = substream->private_data;
struct aaci_runtime *aacirun = substream->runtime->private_data;
@ -614,7 +614,7 @@ static int aaci_pcm_playback_trigger(snd_pcm_substream_t *substream, int cmd)
return ret;
}
static snd_pcm_ops_t aaci_playback_ops = {
static struct snd_pcm_ops aaci_playback_ops = {
.open = aaci_pcm_playback_open,
.close = aaci_pcm_close,
.ioctl = snd_pcm_lib_ioctl,
@ -632,34 +632,29 @@ static snd_pcm_ops_t aaci_playback_ops = {
* Power Management.
*/
#ifdef CONFIG_PM
static int aaci_do_suspend(snd_card_t *card, unsigned int state)
static int aaci_do_suspend(struct snd_card *card, unsigned int state)
{
struct aaci *aaci = card->private_data;
if (aaci->card->power_state != SNDRV_CTL_POWER_D3cold) {
snd_pcm_suspend_all(aaci->pcm);
snd_power_change_state(aaci->card, SNDRV_CTL_POWER_D3cold);
}
snd_power_change_state(card, SNDRV_CTL_POWER_D3cold);
snd_pcm_suspend_all(aaci->pcm);
return 0;
}
static int aaci_do_resume(snd_card_t *card, unsigned int state)
static int aaci_do_resume(struct snd_card *card, unsigned int state)
{
struct aaci *aaci = card->private_data;
if (aaci->card->power_state != SNDRV_CTL_POWER_D0) {
snd_power_change_state(aaci->card, SNDRV_CTL_POWER_D0);
}
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}
static int aaci_suspend(struct amba_device *dev, pm_message_t state)
{
snd_card_t *card = amba_get_drvdata(dev);
struct snd_card *card = amba_get_drvdata(dev);
return card ? aaci_do_suspend(card) : 0;
}
static int aaci_resume(struct amba_device *dev)
{
snd_card_t *card = amba_get_drvdata(dev);
struct snd_card *card = amba_get_drvdata(dev);
return card ? aaci_do_resume(card) : 0;
}
#else
@ -705,16 +700,16 @@ static struct ac97_pcm ac97_defs[] __devinitdata = {
}
};
static ac97_bus_ops_t aaci_bus_ops = {
static struct snd_ac97_bus_ops aaci_bus_ops = {
.write = aaci_ac97_write,
.read = aaci_ac97_read,
};
static int __devinit aaci_probe_ac97(struct aaci *aaci)
{
ac97_template_t ac97_template;
ac97_bus_t *ac97_bus;
ac97_t *ac97;
struct snd_ac97_template ac97_template;
struct snd_ac97_bus *ac97_bus;
struct snd_ac97 *ac97;
int ret;
/*
@ -737,7 +732,7 @@ static int __devinit aaci_probe_ac97(struct aaci *aaci)
ac97_bus->clock = 48000;
aaci->ac97_bus = ac97_bus;
memset(&ac97_template, 0, sizeof(ac97_template_t));
memset(&ac97_template, 0, sizeof(struct snd_ac97_template));
ac97_template.private_data = aaci;
ac97_template.num = 0;
ac97_template.scaps = AC97_SCAP_SKIP_MODEM;
@ -762,7 +757,7 @@ static int __devinit aaci_probe_ac97(struct aaci *aaci)
return ret;
}
static void aaci_free_card(snd_card_t *card)
static void aaci_free_card(struct snd_card *card)
{
struct aaci *aaci = card->private_data;
if (aaci->base)
@ -772,7 +767,7 @@ static void aaci_free_card(snd_card_t *card)
static struct aaci * __devinit aaci_init_card(struct amba_device *dev)
{
struct aaci *aaci;
snd_card_t *card;
struct snd_card *card;
card = snd_card_new(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
THIS_MODULE, sizeof(struct aaci));
@ -780,7 +775,6 @@ static struct aaci * __devinit aaci_init_card(struct amba_device *dev)
return ERR_PTR(-ENOMEM);
card->private_free = aaci_free_card;
snd_card_set_pm_callback(card, aaci_do_suspend, aaci_do_resume, NULL);
strlcpy(card->driver, DRIVER_NAME, sizeof(card->driver));
strlcpy(card->shortname, "ARM AC'97 Interface", sizeof(card->shortname));
@ -803,7 +797,7 @@ static struct aaci * __devinit aaci_init_card(struct amba_device *dev)
static int __devinit aaci_init_pcm(struct aaci *aaci)
{
snd_pcm_t *pcm;
struct snd_pcm *pcm;
int ret;
ret = snd_pcm_new(aaci->card, "AACI AC'97", 0, 1, 0, &pcm);
@ -920,7 +914,7 @@ static int __devinit aaci_probe(struct amba_device *dev, void *id)
static int __devexit aaci_remove(struct amba_device *dev)
{
snd_card_t *card = amba_get_drvdata(dev);
struct snd_card *card = amba_get_drvdata(dev);
amba_set_drvdata(dev, NULL);

View File

@ -207,7 +207,7 @@ struct aaci_runtime {
int pcm_open;
u32 cr;
snd_pcm_substream_t *substream;
struct snd_pcm_substream *substream;
/*
* PIO support
@ -222,7 +222,7 @@ struct aaci_runtime {
struct aaci {
struct amba_device *dev;
snd_card_t *card;
struct snd_card *card;
void __iomem *base;
unsigned int fifosize;
@ -236,7 +236,7 @@ struct aaci {
struct aaci_runtime playback;
struct aaci_runtime capture;
snd_pcm_t *pcm;
struct snd_pcm *pcm;
};
#define ACSTREAM_FRONT 0

View File

@ -18,9 +18,9 @@
#include "devdma.h"
void devdma_hw_free(struct device *dev, snd_pcm_substream_t *substream)
void devdma_hw_free(struct device *dev, struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_dma_buffer *buf = runtime->dma_buffer_p;
if (runtime->dma_area == NULL)
@ -34,9 +34,9 @@ void devdma_hw_free(struct device *dev, snd_pcm_substream_t *substream)
snd_pcm_set_runtime_buffer(substream, NULL);
}
int devdma_hw_alloc(struct device *dev, snd_pcm_substream_t *substream, size_t size)
int devdma_hw_alloc(struct device *dev, struct snd_pcm_substream *substream, size_t size)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_dma_buffer *buf = runtime->dma_buffer_p;
int ret = 0;
@ -74,8 +74,8 @@ int devdma_hw_alloc(struct device *dev, snd_pcm_substream_t *substream, size_t s
return -ENOMEM;
}
int devdma_mmap(struct device *dev, snd_pcm_substream_t *substream, struct vm_area_struct *vma)
int devdma_mmap(struct device *dev, struct snd_pcm_substream *substream, struct vm_area_struct *vma)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
return dma_mmap_coherent(dev, vma, runtime->dma_area, runtime->dma_addr, runtime->dma_bytes);
}

View File

@ -1,3 +1,3 @@
void devdma_hw_free(struct device *dev, snd_pcm_substream_t *substream);
int devdma_hw_alloc(struct device *dev, snd_pcm_substream_t *substream, size_t size);
int devdma_mmap(struct device *dev, snd_pcm_substream_t *substream, struct vm_area_struct *vma);
void devdma_hw_free(struct device *dev, struct snd_pcm_substream *substream);
int devdma_hw_alloc(struct device *dev, struct snd_pcm_substream *substream, size_t size);
int devdma_mmap(struct device *dev, struct snd_pcm_substream *substream, struct vm_area_struct *vma);

View File

@ -37,69 +37,74 @@ static DECLARE_MUTEX(car_mutex);
static DECLARE_WAIT_QUEUE_HEAD(gsr_wq);
static volatile long gsr_bits;
static unsigned short pxa2xx_ac97_read(ac97_t *ac97, unsigned short reg)
/*
* Beware PXA27x bugs:
*
* o Slot 12 read from modem space will hang controller.
* o CDONE, SDONE interrupt fails after any slot 12 IO.
*
* We therefore have an hybrid approach for waiting on SDONE (interrupt or
* 1 jiffy timeout if interrupt never comes).
*/
static unsigned short pxa2xx_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
{
unsigned short val = -1;
volatile u32 *reg_addr;
down(&car_mutex);
if (CAR & CAR_CAIP) {
printk(KERN_CRIT"%s: CAR_CAIP already set\n", __FUNCTION__);
goto out;
}
/* set up primary or secondary codec space */
reg_addr = (ac97->num & 1) ? &SAC_REG_BASE : &PAC_REG_BASE;
reg_addr += (reg >> 1);
/* start read access across the ac97 link */
GSR = GSR_CDONE | GSR_SDONE;
gsr_bits = 0;
val = *reg_addr;
if (reg == AC97_GPIO_STATUS)
goto out;
wait_event_timeout(gsr_wq, gsr_bits & GSR_SDONE, 1);
if (!gsr_bits & GSR_SDONE) {
if (wait_event_timeout(gsr_wq, (GSR | gsr_bits) & GSR_SDONE, 1) <= 0 &&
!((GSR | gsr_bits) & GSR_SDONE)) {
printk(KERN_ERR "%s: read error (ac97_reg=%d GSR=%#lx)\n",
__FUNCTION__, reg, gsr_bits);
__FUNCTION__, reg, GSR | gsr_bits);
val = -1;
goto out;
}
/* valid data now */
GSR = GSR_CDONE | GSR_SDONE;
gsr_bits = 0;
val = *reg_addr;
/* but we've just started another cycle... */
wait_event_timeout(gsr_wq, gsr_bits & GSR_SDONE, 1);
wait_event_timeout(gsr_wq, (GSR | gsr_bits) & GSR_SDONE, 1);
out: up(&car_mutex);
return val;
}
static void pxa2xx_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short val)
static void pxa2xx_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val)
{
volatile u32 *reg_addr;
down(&car_mutex);
if (CAR & CAR_CAIP) {
printk(KERN_CRIT "%s: CAR_CAIP already set\n", __FUNCTION__);
goto out;
}
/* set up primary or secondary codec space */
reg_addr = (ac97->num & 1) ? &SAC_REG_BASE : &PAC_REG_BASE;
reg_addr += (reg >> 1);
GSR = GSR_CDONE | GSR_SDONE;
gsr_bits = 0;
*reg_addr = val;
wait_event_timeout(gsr_wq, gsr_bits & GSR_CDONE, 1);
if (!gsr_bits & GSR_SDONE)
if (wait_event_timeout(gsr_wq, (GSR | gsr_bits) & GSR_CDONE, 1) <= 0 &&
!((GSR | gsr_bits) & GSR_CDONE))
printk(KERN_ERR "%s: write error (ac97_reg=%d GSR=%#lx)\n",
__FUNCTION__, reg, gsr_bits);
__FUNCTION__, reg, GSR | gsr_bits);
out: up(&car_mutex);
up(&car_mutex);
}
static void pxa2xx_ac97_reset(ac97_t *ac97)
static void pxa2xx_ac97_reset(struct snd_ac97 *ac97)
{
/* First, try cold reset */
GCR &= GCR_COLD_RST; /* clear everything but nCRST */
@ -172,13 +177,13 @@ static irqreturn_t pxa2xx_ac97_irq(int irq, void *dev_id, struct pt_regs *regs)
return IRQ_NONE;
}
static ac97_bus_ops_t pxa2xx_ac97_ops = {
static struct snd_ac97_bus_ops pxa2xx_ac97_ops = {
.read = pxa2xx_ac97_read,
.write = pxa2xx_ac97_write,
.reset = pxa2xx_ac97_reset,
};
static pxa2xx_pcm_dma_params_t pxa2xx_ac97_pcm_out = {
static struct pxa2xx_pcm_dma_params pxa2xx_ac97_pcm_out = {
.name = "AC97 PCM out",
.dev_addr = __PREG(PCDR),
.drcmr = &DRCMRTXPCDR,
@ -186,7 +191,7 @@ static pxa2xx_pcm_dma_params_t pxa2xx_ac97_pcm_out = {
DCMD_BURST32 | DCMD_WIDTH4,
};
static pxa2xx_pcm_dma_params_t pxa2xx_ac97_pcm_in = {
static struct pxa2xx_pcm_dma_params pxa2xx_ac97_pcm_in = {
.name = "AC97 PCM in",
.dev_addr = __PREG(PCDR),
.drcmr = &DRCMRRXPCDR,
@ -194,12 +199,12 @@ static pxa2xx_pcm_dma_params_t pxa2xx_ac97_pcm_in = {
DCMD_BURST32 | DCMD_WIDTH4,
};
static snd_pcm_t *pxa2xx_ac97_pcm;
static ac97_t *pxa2xx_ac97_ac97;
static struct snd_pcm *pxa2xx_ac97_pcm;
static struct snd_ac97 *pxa2xx_ac97_ac97;
static int pxa2xx_ac97_pcm_startup(snd_pcm_substream_t *substream)
static int pxa2xx_ac97_pcm_startup(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
pxa2xx_audio_ops_t *platform_ops;
int r;
@ -218,7 +223,7 @@ static int pxa2xx_ac97_pcm_startup(snd_pcm_substream_t *substream)
return 0;
}
static void pxa2xx_ac97_pcm_shutdown(snd_pcm_substream_t *substream)
static void pxa2xx_ac97_pcm_shutdown(struct snd_pcm_substream *substream)
{
pxa2xx_audio_ops_t *platform_ops;
@ -227,15 +232,15 @@ static void pxa2xx_ac97_pcm_shutdown(snd_pcm_substream_t *substream)
platform_ops->shutdown(substream, platform_ops->priv);
}
static int pxa2xx_ac97_pcm_prepare(snd_pcm_substream_t *substream)
static int pxa2xx_ac97_pcm_prepare(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
int reg = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
AC97_PCM_FRONT_DAC_RATE : AC97_PCM_LR_ADC_RATE;
return snd_ac97_set_rate(pxa2xx_ac97_ac97, reg, runtime->rate);
}
static pxa2xx_pcm_client_t pxa2xx_ac97_pcm_client = {
static struct pxa2xx_pcm_client pxa2xx_ac97_pcm_client = {
.playback_params = &pxa2xx_ac97_pcm_out,
.capture_params = &pxa2xx_ac97_pcm_in,
.startup = pxa2xx_ac97_pcm_startup,
@ -245,39 +250,37 @@ static pxa2xx_pcm_client_t pxa2xx_ac97_pcm_client = {
#ifdef CONFIG_PM
static int pxa2xx_ac97_do_suspend(snd_card_t *card, pm_message_t state)
static int pxa2xx_ac97_do_suspend(struct snd_card *card, pm_message_t state)
{
if (card->power_state != SNDRV_CTL_POWER_D3cold) {
pxa2xx_audio_ops_t *platform_ops = card->dev->platform_data;
snd_pcm_suspend_all(pxa2xx_ac97_pcm);
snd_ac97_suspend(pxa2xx_ac97_ac97);
snd_power_change_state(card, SNDRV_CTL_POWER_D3cold);
if (platform_ops && platform_ops->suspend)
platform_ops->suspend(platform_ops->priv);
GCR |= GCR_ACLINK_OFF;
pxa_set_cken(CKEN2_AC97, 0);
}
pxa2xx_audio_ops_t *platform_ops = card->dev->platform_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3cold);
snd_pcm_suspend_all(pxa2xx_ac97_pcm);
snd_ac97_suspend(pxa2xx_ac97_ac97);
if (platform_ops && platform_ops->suspend)
platform_ops->suspend(platform_ops->priv);
GCR |= GCR_ACLINK_OFF;
pxa_set_cken(CKEN2_AC97, 0);
return 0;
}
static int pxa2xx_ac97_do_resume(snd_card_t *card)
static int pxa2xx_ac97_do_resume(struct snd_card *card)
{
if (card->power_state != SNDRV_CTL_POWER_D0) {
pxa2xx_audio_ops_t *platform_ops = card->dev->platform_data;
pxa_set_cken(CKEN2_AC97, 1);
if (platform_ops && platform_ops->resume)
platform_ops->resume(platform_ops->priv);
snd_ac97_resume(pxa2xx_ac97_ac97);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
}
pxa2xx_audio_ops_t *platform_ops = card->dev->platform_data;
pxa_set_cken(CKEN2_AC97, 1);
if (platform_ops && platform_ops->resume)
platform_ops->resume(platform_ops->priv);
snd_ac97_resume(pxa2xx_ac97_ac97);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}
static int pxa2xx_ac97_suspend(struct platform_device *dev, pm_message_t state)
{
snd_card_t *card = platform_get_drvdata(dev);
struct snd_card *card = platform_get_drvdata(dev);
int ret = 0;
if (card)
@ -288,7 +291,7 @@ static int pxa2xx_ac97_suspend(struct platform_device *dev, pm_message_t state)
static int pxa2xx_ac97_resume(struct platform_device *dev)
{
snd_card_t *card = platform_get_drvdata(dev);
struct snd_card *card = platform_get_drvdata(dev);
int ret = 0;
if (card)
@ -304,9 +307,9 @@ static int pxa2xx_ac97_resume(struct platform_device *dev)
static int pxa2xx_ac97_probe(struct platform_device *dev)
{
snd_card_t *card;
ac97_bus_t *ac97_bus;
ac97_template_t ac97_template;
struct snd_card *card;
struct snd_ac97_bus *ac97_bus;
struct snd_ac97_template ac97_template;
int ret;
ret = -ENOMEM;
@ -349,8 +352,6 @@ static int pxa2xx_ac97_probe(struct platform_device *dev)
snprintf(card->longname, sizeof(card->longname),
"%s (%s)", dev->dev.driver->name, card->mixername);
snd_card_set_pm_callback(card, pxa2xx_ac97_do_suspend,
pxa2xx_ac97_do_resume, NULL);
ret = snd_card_register(card);
if (ret == 0) {
platform_set_drvdata(dev, card);
@ -370,7 +371,7 @@ static int pxa2xx_ac97_probe(struct platform_device *dev)
static int pxa2xx_ac97_remove(struct platform_device *dev)
{
snd_card_t *card = platform_get_drvdata(dev);
struct snd_card *card = platform_get_drvdata(dev);
if (card) {
snd_card_free(card);

View File

@ -28,7 +28,7 @@
#include "pxa2xx-pcm.h"
static const snd_pcm_hardware_t pxa2xx_pcm_hardware = {
static const struct snd_pcm_hardware pxa2xx_pcm_hardware = {
.info = SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_INTERLEAVED |
@ -44,15 +44,15 @@ static const snd_pcm_hardware_t pxa2xx_pcm_hardware = {
struct pxa2xx_runtime_data {
int dma_ch;
pxa2xx_pcm_dma_params_t *params;
struct pxa2xx_pcm_dma_params *params;
pxa_dma_desc *dma_desc_array;
dma_addr_t dma_desc_array_phys;
};
static int pxa2xx_pcm_hw_params(snd_pcm_substream_t *substream,
snd_pcm_hw_params_t *params)
static int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
struct pxa2xx_runtime_data *rtd = runtime->private_data;
size_t totsize = params_buffer_bytes(params);
size_t period = params_period_bytes(params);
@ -86,7 +86,7 @@ static int pxa2xx_pcm_hw_params(snd_pcm_substream_t *substream,
return 0;
}
static int pxa2xx_pcm_hw_free(snd_pcm_substream_t *substream)
static int pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream)
{
struct pxa2xx_runtime_data *rtd = substream->runtime->private_data;
@ -95,10 +95,10 @@ static int pxa2xx_pcm_hw_free(snd_pcm_substream_t *substream)
return 0;
}
static int pxa2xx_pcm_prepare(snd_pcm_substream_t *substream)
static int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream)
{
pxa2xx_pcm_client_t *client = substream->private_data;
snd_pcm_runtime_t *runtime = substream->runtime;
struct pxa2xx_pcm_client *client = substream->private_data;
struct snd_pcm_runtime *runtime = substream->runtime;
struct pxa2xx_runtime_data *rtd = runtime->private_data;
DCSR(rtd->dma_ch) &= ~DCSR_RUN;
@ -109,7 +109,7 @@ static int pxa2xx_pcm_prepare(snd_pcm_substream_t *substream)
return client->prepare(substream);
}
static int pxa2xx_pcm_trigger(snd_pcm_substream_t *substream, int cmd)
static int pxa2xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct pxa2xx_runtime_data *rtd = substream->runtime->private_data;
int ret = 0;
@ -139,7 +139,7 @@ static int pxa2xx_pcm_trigger(snd_pcm_substream_t *substream, int cmd)
static void pxa2xx_pcm_dma_irq(int dma_ch, void *dev_id, struct pt_regs *regs)
{
snd_pcm_substream_t *substream = dev_id;
struct snd_pcm_substream *substream = dev_id;
struct pxa2xx_runtime_data *rtd = substream->runtime->private_data;
int dcsr;
@ -155,9 +155,9 @@ static void pxa2xx_pcm_dma_irq(int dma_ch, void *dev_id, struct pt_regs *regs)
}
}
static snd_pcm_uframes_t pxa2xx_pcm_pointer(snd_pcm_substream_t *substream)
static snd_pcm_uframes_t pxa2xx_pcm_pointer(struct snd_pcm_substream *substream)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
struct pxa2xx_runtime_data *rtd = runtime->private_data;
dma_addr_t ptr = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
DSADR(rtd->dma_ch) : DTADR(rtd->dma_ch);
@ -168,9 +168,9 @@ static snd_pcm_uframes_t pxa2xx_pcm_pointer(snd_pcm_substream_t *substream)
}
static int
pxa2xx_pcm_hw_rule_mult32(snd_pcm_hw_params_t *params, snd_pcm_hw_rule_t *rule)
pxa2xx_pcm_hw_rule_mult32(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule)
{
snd_interval_t *i = hw_param_interval(params, rule->var);
struct snd_interval *i = hw_param_interval(params, rule->var);
int changed = 0;
if (i->min & 31) {
@ -188,10 +188,10 @@ pxa2xx_pcm_hw_rule_mult32(snd_pcm_hw_params_t *params, snd_pcm_hw_rule_t *rule)
return changed;
}
static int pxa2xx_pcm_open(snd_pcm_substream_t *substream)
static int pxa2xx_pcm_open(struct snd_pcm_substream *substream)
{
pxa2xx_pcm_client_t *client = substream->private_data;
snd_pcm_runtime_t *runtime = substream->runtime;
struct pxa2xx_pcm_client *client = substream->private_data;
struct snd_pcm_runtime *runtime = substream->runtime;
struct pxa2xx_runtime_data *rtd;
int ret;
@ -246,9 +246,9 @@ static int pxa2xx_pcm_open(snd_pcm_substream_t *substream)
return ret;
}
static int pxa2xx_pcm_close(snd_pcm_substream_t *substream)
static int pxa2xx_pcm_close(struct snd_pcm_substream *substream)
{
pxa2xx_pcm_client_t *client = substream->private_data;
struct pxa2xx_pcm_client *client = substream->private_data;
struct pxa2xx_runtime_data *rtd = substream->runtime->private_data;
pxa_free_dma(rtd->dma_ch);
@ -260,16 +260,16 @@ static int pxa2xx_pcm_close(snd_pcm_substream_t *substream)
}
static int
pxa2xx_pcm_mmap(snd_pcm_substream_t *substream, struct vm_area_struct *vma)
pxa2xx_pcm_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *vma)
{
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_runtime *runtime = substream->runtime;
return dma_mmap_writecombine(substream->pcm->card->dev, vma,
runtime->dma_area,
runtime->dma_addr,
runtime->dma_bytes);
}
static snd_pcm_ops_t pxa2xx_pcm_ops = {
static struct snd_pcm_ops pxa2xx_pcm_ops = {
.open = pxa2xx_pcm_open,
.close = pxa2xx_pcm_close,
.ioctl = snd_pcm_lib_ioctl,
@ -281,9 +281,9 @@ static snd_pcm_ops_t pxa2xx_pcm_ops = {
.mmap = pxa2xx_pcm_mmap,
};
static int pxa2xx_pcm_preallocate_dma_buffer(snd_pcm_t *pcm, int stream)
static int pxa2xx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
{
snd_pcm_substream_t *substream = pcm->streams[stream].substream;
struct snd_pcm_substream *substream = pcm->streams[stream].substream;
struct snd_dma_buffer *buf = &substream->dma_buffer;
size_t size = pxa2xx_pcm_hardware.buffer_bytes_max;
buf->dev.type = SNDRV_DMA_TYPE_DEV;
@ -297,9 +297,9 @@ static int pxa2xx_pcm_preallocate_dma_buffer(snd_pcm_t *pcm, int stream)
return 0;
}
static void pxa2xx_pcm_free_dma_buffers(snd_pcm_t *pcm)
static void pxa2xx_pcm_free_dma_buffers(struct snd_pcm *pcm)
{
snd_pcm_substream_t *substream;
struct snd_pcm_substream *substream;
struct snd_dma_buffer *buf;
int stream;
@ -318,9 +318,10 @@ static void pxa2xx_pcm_free_dma_buffers(snd_pcm_t *pcm)
static u64 pxa2xx_pcm_dmamask = 0xffffffff;
int pxa2xx_pcm_new(snd_card_t *card, pxa2xx_pcm_client_t *client, snd_pcm_t **rpcm)
int pxa2xx_pcm_new(struct snd_card *card, struct pxa2xx_pcm_client *client,
struct snd_pcm **rpcm)
{
snd_pcm_t *pcm;
struct snd_pcm *pcm;
int play = client->playback_params ? 1 : 0;
int capt = client->capture_params ? 1 : 0;
int ret;

View File

@ -10,20 +10,20 @@
* published by the Free Software Foundation.
*/
typedef struct {
struct pxa2xx_pcm_dma_params {
char *name; /* stream identifier */
u32 dcmd; /* DMA descriptor dcmd field */
volatile u32 *drcmr; /* the DMA request channel to use */
u32 dev_addr; /* device physical address for DMA */
} pxa2xx_pcm_dma_params_t;
};
typedef struct {
pxa2xx_pcm_dma_params_t *playback_params;
pxa2xx_pcm_dma_params_t *capture_params;
int (*startup)(snd_pcm_substream_t *);
void (*shutdown)(snd_pcm_substream_t *);
int (*prepare)(snd_pcm_substream_t *);
} pxa2xx_pcm_client_t;
struct pxa2xx_pcm_client {
struct pxa2xx_pcm_dma_params *playback_params;
struct pxa2xx_pcm_dma_params *capture_params;
int (*startup)(struct snd_pcm_substream *);
void (*shutdown)(struct snd_pcm_substream *);
int (*prepare)(struct snd_pcm_substream *);
};
extern int pxa2xx_pcm_new(snd_card_t *, pxa2xx_pcm_client_t *, snd_pcm_t **);
extern int pxa2xx_pcm_new(struct snd_card *, struct pxa2xx_pcm_client *, struct snd_pcm **);

View File

@ -21,7 +21,7 @@
* merged HAL layer (patches from Brian)
*/
/* $Id: sa11xx-uda1341.c,v 1.23 2005/09/09 13:22:34 tiwai Exp $ */
/* $Id: sa11xx-uda1341.c,v 1.27 2005/12/07 09:13:42 cladisch Exp $ */
/***************************************************************************************************
*
@ -64,6 +64,8 @@
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/delay.h>
@ -115,7 +117,7 @@ static char *id = NULL; /* ID for this card */
module_param(id, charp, 0444);
MODULE_PARM_DESC(id, "ID string for SA1100/SA1111 + UDA1341TS soundcard.");
typedef struct audio_stream {
struct audio_stream {
char *id; /* identification string */
int stream_id; /* numeric identification */
dma_device_t dma_dev; /* device identifier for DMA */
@ -130,18 +132,16 @@ typedef struct audio_stream {
int tx_spin; /* are we recoding - flag used to do DMA trans. for sync */
unsigned int old_offset;
spinlock_t dma_lock; /* for locking in DMA operations (see dma-sa1100.c in the kernel) */
snd_pcm_substream_t *stream;
}audio_stream_t;
struct snd_pcm_substream *stream;
};
typedef struct snd_card_sa11xx_uda1341 {
snd_card_t *card;
struct sa11xx_uda1341 {
struct snd_card *card;
struct l3_client *uda1341;
snd_pcm_t *pcm;
struct snd_pcm *pcm;
long samplerate;
audio_stream_t s[2]; /* playback & capture */
} sa11xx_uda1341_t;
static struct snd_card_sa11xx_uda1341 *sa11xx_uda1341 = NULL;
struct audio_stream s[2]; /* playback & capture */
};
static unsigned int rates[] = {
8000, 10666, 10985, 14647,
@ -149,12 +149,14 @@ static unsigned int rates[] = {
29400, 32000, 44100, 48000,
};
static snd_pcm_hw_constraint_list_t hw_constraints_rates = {
static struct snd_pcm_hw_constraint_list hw_constraints_rates = {
.count = ARRAY_SIZE(rates),
.list = rates,
.mask = 0,
};
static struct platform_device *device;
/* }}} */
/* {{{ Clock and sample rate stuff */
@ -195,7 +197,7 @@ static void sa11xx_uda1341_set_audio_clock(long val)
}
}
static void sa11xx_uda1341_set_samplerate(sa11xx_uda1341_t *sa11xx_uda1341, long rate)
static void sa11xx_uda1341_set_samplerate(struct sa11xx_uda1341 *sa11xx_uda1341, long rate)
{
int clk_div = 0;
int clk=0;
@ -280,7 +282,7 @@ static void sa11xx_uda1341_set_samplerate(sa11xx_uda1341_t *sa11xx_uda1341, long
/* {{{ HW init and shutdown */
static void sa11xx_uda1341_audio_init(sa11xx_uda1341_t *sa11xx_uda1341)
static void sa11xx_uda1341_audio_init(struct sa11xx_uda1341 *sa11xx_uda1341)
{
unsigned long flags;
@ -337,7 +339,7 @@ static void sa11xx_uda1341_audio_init(sa11xx_uda1341_t *sa11xx_uda1341)
#endif
}
static void sa11xx_uda1341_audio_shutdown(sa11xx_uda1341_t *sa11xx_uda1341)
static void sa11xx_uda1341_audio_shutdown(struct sa11xx_uda1341 *sa11xx_uda1341)
{
/* mute on */
#ifdef CONFIG_H3600_HAL
@ -378,7 +380,7 @@ static void sa11xx_uda1341_audio_shutdown(sa11xx_uda1341_t *sa11xx_uda1341)
#ifdef HH_VERSION
static int audio_dma_request(audio_stream_t *s, void (*callback)(void *, int))
static int audio_dma_request(struct audio_stream *s, void (*callback)(void *, int))
{
int ret;
@ -391,7 +393,7 @@ static int audio_dma_request(audio_stream_t *s, void (*callback)(void *, int))
return 0;
}
static inline void audio_dma_free(audio_stream_t *s)
static inline void audio_dma_free(struct audio_stream *s)
{
sa1100_free_dma(s->dmach);
s->dmach = -1;
@ -399,7 +401,7 @@ static inline void audio_dma_free(audio_stream_t *s)
#else
static int audio_dma_request(audio_stream_t *s, void (*callback)(void *))
static int audio_dma_request(struct audio_stream *s, void (*callback)(void *))
{
int ret;
@ -409,18 +411,18 @@ static int audio_dma_request(audio_stream_t *s, void (*callback)(void *))
return ret;
}
static void audio_dma_free(audio_stream_t *s)
static void audio_dma_free(struct audio_stream *s)
{
sa1100_free_dma((s)->dma_regs);
(s)->dma_regs = 0;
sa1100_free_dma(s->dma_regs);
s->dma_regs = 0;
}
#endif
static u_int audio_get_dma_pos(audio_stream_t *s)
static u_int audio_get_dma_pos(struct audio_stream *s)
{
snd_pcm_substream_t * substream = s->stream;
snd_pcm_runtime_t *runtime = substream->runtime;
struct snd_pcm_substream *substream = s->stream;
struct snd_pcm_runtime *runtime = substream->runtime;
unsigned int offset;
unsigned long flags;
dma_addr_t addr;
@ -445,7 +447,7 @@ static u_int audio_get_dma_pos(audio_stream_t *s)
/*
* this stops the dma and clears the dma ptrs
*/
static void audio_stop_dma(audio_stream_t *s)
static void audio_stop_dma(struct audio_stream *s)
{
unsigned long flags;
@ -461,10 +463,10 @@ static void audio_stop_dma(audio_stream_t *s)
spin_unlock_irqrestore(&s->dma_lock, flags);
}
static void audio_process_dma(audio_stream_t *s)
static void audio_process_dma(struct audio_stream *s)
{
snd_pcm_substream_t *substream = s->stream;
snd_pcm_runtime_t *runtime;
struct snd_pcm_substream *substream = s->stream;
struct snd_pcm_runtime *runtime;
unsigned int dma_size;
unsigned int offset;
int ret;
@ -527,7 +529,7 @@ static void audio_dma_callback(void *data, int size)
static void audio_dma_callback(void *data)
#endif
{
audio_stream_t *s = data;
struct audio_stream *s = data;
/*
* If we are getting a callback for an active stream then we inform
@ -549,12 +551,12 @@ static void audio_dma_callback(void *data)
/* {{{ trigger & timer */
static int snd_sa11xx_uda1341_trigger(snd_pcm_substream_t * substream, int cmd)
static int snd_sa11xx_uda1341_trigger(struct snd_pcm_substream *substream, int cmd)
{
sa11xx_uda1341_t *chip = snd_pcm_substream_chip(substream);
struct sa11xx_uda1341 *chip = snd_pcm_substream_chip(substream);
int stream_id = substream->pstr->stream;
audio_stream_t *s = &chip->s[stream_id];
audio_stream_t *s1 = &chip->s[stream_id ^ 1];
struct audio_stream *s = &chip->s[stream_id];
struct audio_stream *s1 = &chip->s[stream_id ^ 1];
int err = 0;
/* note local interrupts are already disabled in the midlevel code */
@ -683,11 +685,11 @@ static int snd_sa11xx_uda1341_trigger(snd_pcm_substream_t * substream, int cmd)
return err;
}
static int snd_sa11xx_uda1341_prepare(snd_pcm_substream_t * substream)
static int snd_sa11xx_uda1341_prepare(struct snd_pcm_substream *substream)
{
sa11xx_uda1341_t *chip = snd_pcm_substream_chip(substream);
snd_pcm_runtime_t *runtime = substream->runtime;
audio_stream_t *s = &chip->s[substream->pstr->stream];
struct sa11xx_uda1341 *chip = snd_pcm_substream_chip(substream);
struct snd_pcm_runtime *runtime = substream->runtime;
struct audio_stream *s = &chip->s[substream->pstr->stream];
/* set requested samplerate */
sa11xx_uda1341_set_samplerate(chip, runtime->rate);
@ -701,15 +703,15 @@ static int snd_sa11xx_uda1341_prepare(snd_pcm_substream_t * substream)
return 0;
}
static snd_pcm_uframes_t snd_sa11xx_uda1341_pointer(snd_pcm_substream_t * substream)
static snd_pcm_uframes_t snd_sa11xx_uda1341_pointer(struct snd_pcm_substream *substream)
{
sa11xx_uda1341_t *chip = snd_pcm_substream_chip(substream);
struct sa11xx_uda1341 *chip = snd_pcm_substream_chip(substream);
return audio_get_dma_pos(&chip->s[substream->pstr->stream]);
}
/* }}} */
static snd_pcm_hardware_t snd_sa11xx_uda1341_capture =
static struct snd_pcm_hardware snd_sa11xx_uda1341_capture =
{
.info = (SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
@ -732,7 +734,7 @@ static snd_pcm_hardware_t snd_sa11xx_uda1341_capture =
.fifo_size = 0,
};
static snd_pcm_hardware_t snd_sa11xx_uda1341_playback =
static struct snd_pcm_hardware snd_sa11xx_uda1341_playback =
{
.info = (SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
@ -755,10 +757,10 @@ static snd_pcm_hardware_t snd_sa11xx_uda1341_playback =
.fifo_size = 0,
};
static int snd_card_sa11xx_uda1341_open(snd_pcm_substream_t * substream)
static int snd_card_sa11xx_uda1341_open(struct snd_pcm_substream *substream)
{
sa11xx_uda1341_t *chip = snd_pcm_substream_chip(substream);
snd_pcm_runtime_t *runtime = substream->runtime;
struct sa11xx_uda1341 *chip = snd_pcm_substream_chip(substream);
struct snd_pcm_runtime *runtime = substream->runtime;
int stream_id = substream->pstr->stream;
int err;
@ -776,9 +778,9 @@ static int snd_card_sa11xx_uda1341_open(snd_pcm_substream_t * substream)
return 0;
}
static int snd_card_sa11xx_uda1341_close(snd_pcm_substream_t * substream)
static int snd_card_sa11xx_uda1341_close(struct snd_pcm_substream *substream)
{
sa11xx_uda1341_t *chip = snd_pcm_substream_chip(substream);
struct sa11xx_uda1341 *chip = snd_pcm_substream_chip(substream);
chip->s[substream->pstr->stream].stream = NULL;
return 0;
@ -786,21 +788,21 @@ static int snd_card_sa11xx_uda1341_close(snd_pcm_substream_t * substream)
/* {{{ HW params & free */
static int snd_sa11xx_uda1341_hw_params(snd_pcm_substream_t * substream,
snd_pcm_hw_params_t * hw_params)
static int snd_sa11xx_uda1341_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *hw_params)
{
return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
}
static int snd_sa11xx_uda1341_hw_free(snd_pcm_substream_t * substream)
static int snd_sa11xx_uda1341_hw_free(struct snd_pcm_substream *substream)
{
return snd_pcm_lib_free_pages(substream);
}
/* }}} */
static snd_pcm_ops_t snd_card_sa11xx_uda1341_playback_ops = {
static struct snd_pcm_ops snd_card_sa11xx_uda1341_playback_ops = {
.open = snd_card_sa11xx_uda1341_open,
.close = snd_card_sa11xx_uda1341_close,
.ioctl = snd_pcm_lib_ioctl,
@ -811,7 +813,7 @@ static snd_pcm_ops_t snd_card_sa11xx_uda1341_playback_ops = {
.pointer = snd_sa11xx_uda1341_pointer,
};
static snd_pcm_ops_t snd_card_sa11xx_uda1341_capture_ops = {
static struct snd_pcm_ops snd_card_sa11xx_uda1341_capture_ops = {
.open = snd_card_sa11xx_uda1341_open,
.close = snd_card_sa11xx_uda1341_close,
.ioctl = snd_pcm_lib_ioctl,
@ -822,9 +824,9 @@ static snd_pcm_ops_t snd_card_sa11xx_uda1341_capture_ops = {
.pointer = snd_sa11xx_uda1341_pointer,
};
static int __init snd_card_sa11xx_uda1341_pcm(sa11xx_uda1341_t *sa11xx_uda1341, int device)
static int __init snd_card_sa11xx_uda1341_pcm(struct sa11xx_uda1341 *sa11xx_uda1341, int device)
{
snd_pcm_t *pcm;
struct snd_pcm *pcm;
int err;
if ((err = snd_pcm_new(sa11xx_uda1341->card, "UDA1341 PCM", device, 1, 1, &pcm)) < 0)
@ -835,8 +837,8 @@ static int __init snd_card_sa11xx_uda1341_pcm(sa11xx_uda1341_t *sa11xx_uda1341,
* isa works but I'm not sure why (or if) it's the right choice
* this may be too large, trying it for now
*/
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_ISA,
snd_pcm_dma_flags(0),
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
snd_dma_isa_data(),
64*1024, 64*1024);
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_card_sa11xx_uda1341_playback_ops);
@ -862,12 +864,15 @@ static int __init snd_card_sa11xx_uda1341_pcm(sa11xx_uda1341_t *sa11xx_uda1341,
#ifdef CONFIG_PM
static int snd_sa11xx_uda1341_suspend(snd_card_t *card, pm_message_t state)
static int snd_sa11xx_uda1341_suspend(struct platform_device *devptr,
pm_message_t state)
{
sa11xx_uda1341_t *chip = card->pm_private_data;
struct snd_card *card = platform_get_drvdata(devptr);
struct sa11xx_uda1341 *chip = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
#ifdef HH_VERSION
#ifdef HH_VERSION
sa1100_dma_sleep(chip->s[SNDRV_PCM_STREAM_PLAYBACK].dmach);
sa1100_dma_sleep(chip->s[SNDRV_PCM_STREAM_CAPTURE].dmach);
#else
@ -875,12 +880,14 @@ static int snd_sa11xx_uda1341_suspend(snd_card_t *card, pm_message_t state)
#endif
l3_command(chip->uda1341, CMD_SUSPEND, NULL);
sa11xx_uda1341_audio_shutdown(chip);
return 0;
}
static int snd_sa11xx_uda1341_resume(snd_card_t *card)
static int snd_sa11xx_uda1341_resume(struct platform_device *devptr)
{
sa11xx_uda1341_t *chip = card->pm_private_data;
struct snd_card *card = platform_get_drvdata(devptr);
struct sa11xx_uda1341 *chip = card->private_data;
sa11xx_uda1341_audio_init(chip);
l3_command(chip->uda1341, CMD_RESUME, NULL);
@ -890,67 +897,55 @@ static int snd_sa11xx_uda1341_resume(snd_card_t *card)
#else
//FIXME
#endif
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}
#endif /* COMFIG_PM */
void snd_sa11xx_uda1341_free(snd_card_t *card)
void snd_sa11xx_uda1341_free(struct snd_card *card)
{
sa11xx_uda1341_t *chip = card->private_data;
struct sa11xx_uda1341 *chip = card->private_data;
audio_dma_free(&chip->s[SNDRV_PCM_STREAM_PLAYBACK]);
audio_dma_free(&chip->s[SNDRV_PCM_STREAM_CAPTURE]);
sa11xx_uda1341 = NULL;
card->private_data = NULL;
kfree(chip);
}
static int __init sa11xx_uda1341_init(void)
static int __init sa11xx_uda1341_probe(struct platform_device *devptr)
{
int err;
snd_card_t *card;
if (!machine_is_h3xxx())
return -ENODEV;
struct snd_card *card;
struct sa11xx_uda1341 *chip;
/* register the soundcard */
card = snd_card_new(-1, id, THIS_MODULE, sizeof(sa11xx_uda1341_t));
card = snd_card_new(-1, id, THIS_MODULE, sizeof(struct sa11xx_uda1341));
if (card == NULL)
return -ENOMEM;
sa11xx_uda1341 = kzalloc(sizeof(*sa11xx_uda1341), GFP_KERNEL);
if (sa11xx_uda1341 == NULL)
return -ENOMEM;
chip = card->private_data;
spin_lock_init(&chip->s[0].dma_lock);
spin_lock_init(&chip->s[1].dma_lock);
card->private_data = (void *)sa11xx_uda1341;
card->private_free = snd_sa11xx_uda1341_free;
sa11xx_uda1341->card = card;
sa11xx_uda1341->samplerate = AUDIO_RATE_DEFAULT;
card->private_free = snd_sa11xx_uda1341_free;
chip->card = card;
chip->samplerate = AUDIO_RATE_DEFAULT;
// mixer
if ((err = snd_chip_uda1341_mixer_new(sa11xx_uda1341->card, &sa11xx_uda1341->uda1341)))
if ((err = snd_chip_uda1341_mixer_new(card, &chip->uda1341)))
goto nodev;
// PCM
if ((err = snd_card_sa11xx_uda1341_pcm(sa11xx_uda1341, 0)) < 0)
if ((err = snd_card_sa11xx_uda1341_pcm(chip, 0)) < 0)
goto nodev;
snd_card_set_generic_pm_callback(card,
snd_sa11xx_uda1341_suspend, snd_sa11_uda1341_resume,
sa11xx_uda1341);
strcpy(card->driver, "UDA1341");
strcpy(card->shortname, "H3600 UDA1341TS");
sprintf(card->longname, "Compaq iPAQ H3600 with Philips UDA1341TS");
if ((err = snd_card_set_generic_dev(card)) < 0)
goto nodev;
snd_card_set_dev(card, &devptr->dev);
if ((err = snd_card_register(card)) == 0) {
printk( KERN_INFO "iPAQ audio support initialized\n" );
platform_set_drvdata(devptr, card);
return 0;
}
@ -959,9 +954,47 @@ static int __init sa11xx_uda1341_init(void)
return err;
}
static int __devexit sa11xx_uda1341_remove(struct platform_device *devptr)
{
snd_card_free(platform_get_drvdata(devptr));
platform_set_drvdata(devptr, NULL);
return 0;
}
#define SA11XX_UDA1341_DRIVER "sa11xx_uda1341"
static struct platform_driver sa11xx_uda1341_driver = {
.probe = sa11xx_uda1341_probe,
.remove = __devexit_p(sa11xx_uda1341_remove),
#ifdef CONFIG_PM
.suspend = snd_sa11xx_uda1341_suspend,
.resume = snd_sa11xx_uda1341_resume,
#endif
.driver = {
.name = SA11XX_UDA1341_DRIVER,
},
};
static int __init sa11xx_uda1341_init(void)
{
int err;
if (!machine_is_h3xxx())
return -ENODEV;
if ((err = platform_driver_register(&sa11xx_uda1341_driver)) < 0)
return err;
device = platform_device_register_simple(SA11XX_UDA1341_DRIVER, -1, NULL, 0);
if (IS_ERR(device)) {
platform_driver_unregister(&sa11xx_uda1341_driver);
return PTR_ERR(device);
}
return 0;
}
static void __exit sa11xx_uda1341_exit(void)
{
snd_card_free(sa11xx_uda1341->card);
platform_device_unregister(device);
platform_driver_unregister(&sa11xx_uda1341_driver);
}
module_init(sa11xx_uda1341_init);

View File

@ -111,6 +111,25 @@ config SND_SEQ_RTCTIMER_DEFAULT
If in doubt, say Y.
config SND_DYNAMIC_MINORS
bool "Dynamic device file minor numbers (EXPERIMENTAL)"
depends on SND && EXPERIMENTAL
help
If you say Y here, the minor numbers of ALSA device files in
/dev/snd/ are allocated dynamically. This allows you to have
more than 8 sound cards, but requires a dynamic device file
system like udev.
If you are unsure about this, say N here.
config SND_SUPPORT_OLD_API
bool "Support old ALSA API"
depends on SND
default y
help
Say Y here to support the obsolete ALSA PCM API (ver.0.9.0 rc3
or older).
config SND_VERBOSE_PRINTK
bool "Verbose printk"
depends on SND
@ -133,7 +152,3 @@ config SND_DEBUG_DETECT
help
Say Y here to enable extra-verbose log messages printed when
detecting devices.
config SND_GENERIC_DRIVER
bool
depends on SND

View File

@ -34,12 +34,10 @@
/* max number of user-defined controls */
#define MAX_USER_CONTROLS 32
typedef struct _snd_kctl_ioctl {
struct snd_kctl_ioctl {
struct list_head list; /* list of all ioctls */
snd_kctl_ioctl_func_t fioctl;
} snd_kctl_ioctl_t;
#define snd_kctl_ioctl(n) list_entry(n, snd_kctl_ioctl_t, list)
};
static DECLARE_RWSEM(snd_ioctl_rwsem);
static LIST_HEAD(snd_control_ioctls);
@ -49,13 +47,12 @@ static LIST_HEAD(snd_control_compat_ioctls);
static int snd_ctl_open(struct inode *inode, struct file *file)
{
int cardnum = SNDRV_MINOR_CARD(iminor(inode));
unsigned long flags;
snd_card_t *card;
snd_ctl_file_t *ctl;
struct snd_card *card;
struct snd_ctl_file *ctl;
int err;
card = snd_cards[cardnum];
card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL);
if (!card) {
err = -ENODEV;
goto __error1;
@ -93,9 +90,9 @@ static int snd_ctl_open(struct inode *inode, struct file *file)
return err;
}
static void snd_ctl_empty_read_queue(snd_ctl_file_t * ctl)
static void snd_ctl_empty_read_queue(struct snd_ctl_file * ctl)
{
snd_kctl_event_t *cread;
struct snd_kctl_event *cread;
spin_lock(&ctl->read_lock);
while (!list_empty(&ctl->events)) {
@ -110,9 +107,9 @@ static int snd_ctl_release(struct inode *inode, struct file *file)
{
unsigned long flags;
struct list_head *list;
snd_card_t *card;
snd_ctl_file_t *ctl;
snd_kcontrol_t *control;
struct snd_card *card;
struct snd_ctl_file *ctl;
struct snd_kcontrol *control;
unsigned int idx;
ctl = file->private_data;
@ -137,12 +134,13 @@ static int snd_ctl_release(struct inode *inode, struct file *file)
return 0;
}
void snd_ctl_notify(snd_card_t *card, unsigned int mask, snd_ctl_elem_id_t *id)
void snd_ctl_notify(struct snd_card *card, unsigned int mask,
struct snd_ctl_elem_id *id)
{
unsigned long flags;
struct list_head *flist;
snd_ctl_file_t *ctl;
snd_kctl_event_t *ev;
struct snd_ctl_file *ctl;
struct snd_kctl_event *ev;
snd_assert(card != NULL && id != NULL, return);
read_lock(&card->ctl_files_rwlock);
@ -183,21 +181,23 @@ void snd_ctl_notify(snd_card_t *card, unsigned int mask, snd_ctl_elem_id_t *id)
* @control: the control template
* @access: the default control access
*
* Allocates a new snd_kcontrol_t instance and copies the given template
* Allocates a new struct snd_kcontrol instance and copies the given template
* to the new instance. It does not copy volatile data (access).
*
* Returns the pointer of the new instance, or NULL on failure.
*/
snd_kcontrol_t *snd_ctl_new(snd_kcontrol_t * control, unsigned int access)
struct snd_kcontrol *snd_ctl_new(struct snd_kcontrol *control, unsigned int access)
{
snd_kcontrol_t *kctl;
struct snd_kcontrol *kctl;
unsigned int idx;
snd_assert(control != NULL, return NULL);
snd_assert(control->count > 0, return NULL);
kctl = kzalloc(sizeof(*kctl) + sizeof(snd_kcontrol_volatile_t) * control->count, GFP_KERNEL);
if (kctl == NULL)
kctl = kzalloc(sizeof(*kctl) + sizeof(struct snd_kcontrol_volatile) * control->count, GFP_KERNEL);
if (kctl == NULL) {
snd_printk(KERN_ERR "Cannot allocate control instance\n");
return NULL;
}
*kctl = *control;
for (idx = 0; idx < kctl->count; idx++)
kctl->vd[idx].access = access;
@ -209,15 +209,16 @@ snd_kcontrol_t *snd_ctl_new(snd_kcontrol_t * control, unsigned int access)
* @ncontrol: the initialization record
* @private_data: the private data to set
*
* Allocates a new snd_kcontrol_t instance and initialize from the given
* Allocates a new struct snd_kcontrol instance and initialize from the given
* template. When the access field of ncontrol is 0, it's assumed as
* READWRITE access. When the count field is 0, it's assumes as one.
*
* Returns the pointer of the newly generated instance, or NULL on failure.
*/
snd_kcontrol_t *snd_ctl_new1(const snd_kcontrol_new_t * ncontrol, void *private_data)
struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,
void *private_data)
{
snd_kcontrol_t kctl;
struct snd_kcontrol kctl;
unsigned int access;
snd_assert(ncontrol != NULL, return NULL);
@ -249,7 +250,7 @@ snd_kcontrol_t *snd_ctl_new1(const snd_kcontrol_new_t * ncontrol, void *private_
* or snd_ctl_new1().
* Don't call this after the control was added to the card.
*/
void snd_ctl_free_one(snd_kcontrol_t * kcontrol)
void snd_ctl_free_one(struct snd_kcontrol *kcontrol)
{
if (kcontrol) {
if (kcontrol->private_free)
@ -258,11 +259,11 @@ void snd_ctl_free_one(snd_kcontrol_t * kcontrol)
}
}
static unsigned int snd_ctl_hole_check(snd_card_t * card,
static unsigned int snd_ctl_hole_check(struct snd_card *card,
unsigned int count)
{
struct list_head *list;
snd_kcontrol_t *kctl;
struct snd_kcontrol *kctl;
list_for_each(list, &card->controls) {
kctl = snd_kcontrol(list);
@ -275,7 +276,7 @@ static unsigned int snd_ctl_hole_check(snd_card_t * card,
return card->last_numid;
}
static int snd_ctl_find_hole(snd_card_t * card, unsigned int count)
static int snd_ctl_find_hole(struct snd_card *card, unsigned int count)
{
unsigned int last_numid, iter = 100000;
@ -304,12 +305,14 @@ static int snd_ctl_find_hole(snd_card_t * card, unsigned int count)
*
* It frees automatically the control which cannot be added.
*/
int snd_ctl_add(snd_card_t * card, snd_kcontrol_t * kcontrol)
int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
{
snd_ctl_elem_id_t id;
struct snd_ctl_elem_id id;
unsigned int idx;
snd_assert(card != NULL && kcontrol != NULL, return -EINVAL);
snd_assert(card != NULL, return -EINVAL);
if (! kcontrol)
return -EINVAL;
snd_assert(kcontrol->info != NULL, return -EINVAL);
id = kcontrol->id;
down_write(&card->controls_rwsem);
@ -350,9 +353,9 @@ int snd_ctl_add(snd_card_t * card, snd_kcontrol_t * kcontrol)
*
* Returns 0 if successful, or a negative error code on failure.
*/
int snd_ctl_remove(snd_card_t * card, snd_kcontrol_t * kcontrol)
int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol)
{
snd_ctl_elem_id_t id;
struct snd_ctl_elem_id id;
unsigned int idx;
snd_assert(card != NULL && kcontrol != NULL, return -EINVAL);
@ -375,9 +378,9 @@ int snd_ctl_remove(snd_card_t * card, snd_kcontrol_t * kcontrol)
*
* Returns 0 if successful, or a negative error code on failure.
*/
int snd_ctl_remove_id(snd_card_t * card, snd_ctl_elem_id_t *id)
int snd_ctl_remove_id(struct snd_card *card, struct snd_ctl_elem_id *id)
{
snd_kcontrol_t *kctl;
struct snd_kcontrol *kctl;
int ret;
down_write(&card->controls_rwsem);
@ -401,10 +404,11 @@ int snd_ctl_remove_id(snd_card_t * card, snd_ctl_elem_id_t *id)
*
* Returns 0 if successful, or a negative error code on failure.
*/
static int snd_ctl_remove_unlocked_id(snd_ctl_file_t * file, snd_ctl_elem_id_t *id)
static int snd_ctl_remove_unlocked_id(struct snd_ctl_file * file,
struct snd_ctl_elem_id *id)
{
snd_card_t *card = file->card;
snd_kcontrol_t *kctl;
struct snd_card *card = file->card;
struct snd_kcontrol *kctl;
int idx, ret;
down_write(&card->controls_rwsem);
@ -434,9 +438,10 @@ static int snd_ctl_remove_unlocked_id(snd_ctl_file_t * file, snd_ctl_elem_id_t *
*
* Returns zero if successful, or a negative error code on failure.
*/
int snd_ctl_rename_id(snd_card_t * card, snd_ctl_elem_id_t *src_id, snd_ctl_elem_id_t *dst_id)
int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id,
struct snd_ctl_elem_id *dst_id)
{
snd_kcontrol_t *kctl;
struct snd_kcontrol *kctl;
down_write(&card->controls_rwsem);
kctl = snd_ctl_find_id(card, src_id);
@ -463,10 +468,10 @@ int snd_ctl_rename_id(snd_card_t * card, snd_ctl_elem_id_t *src_id, snd_ctl_elem
* The caller must down card->controls_rwsem before calling this function
* (if the race condition can happen).
*/
snd_kcontrol_t *snd_ctl_find_numid(snd_card_t * card, unsigned int numid)
struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid)
{
struct list_head *list;
snd_kcontrol_t *kctl;
struct snd_kcontrol *kctl;
snd_assert(card != NULL && numid != 0, return NULL);
list_for_each(list, &card->controls) {
@ -489,10 +494,11 @@ snd_kcontrol_t *snd_ctl_find_numid(snd_card_t * card, unsigned int numid)
* The caller must down card->controls_rwsem before calling this function
* (if the race condition can happen).
*/
snd_kcontrol_t *snd_ctl_find_id(snd_card_t * card, snd_ctl_elem_id_t *id)
struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card,
struct snd_ctl_elem_id *id)
{
struct list_head *list;
snd_kcontrol_t *kctl;
struct snd_kcontrol *kctl;
snd_assert(card != NULL && id != NULL, return NULL);
if (id->numid != 0)
@ -516,10 +522,10 @@ snd_kcontrol_t *snd_ctl_find_id(snd_card_t * card, snd_ctl_elem_id_t *id)
return NULL;
}
static int snd_ctl_card_info(snd_card_t * card, snd_ctl_file_t * ctl,
static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl,
unsigned int cmd, void __user *arg)
{
snd_ctl_card_info_t *info;
struct snd_ctl_card_info *info;
info = kzalloc(sizeof(*info), GFP_KERNEL);
if (! info)
@ -533,7 +539,7 @@ static int snd_ctl_card_info(snd_card_t * card, snd_ctl_file_t * ctl,
strlcpy(info->mixername, card->mixername, sizeof(info->mixername));
strlcpy(info->components, card->components, sizeof(info->components));
up_read(&snd_ioctl_rwsem);
if (copy_to_user(arg, info, sizeof(snd_ctl_card_info_t))) {
if (copy_to_user(arg, info, sizeof(struct snd_ctl_card_info))) {
kfree(info);
return -EFAULT;
}
@ -541,12 +547,13 @@ static int snd_ctl_card_info(snd_card_t * card, snd_ctl_file_t * ctl,
return 0;
}
static int snd_ctl_elem_list(snd_card_t *card, snd_ctl_elem_list_t __user *_list)
static int snd_ctl_elem_list(struct snd_card *card,
struct snd_ctl_elem_list __user *_list)
{
struct list_head *plist;
snd_ctl_elem_list_t list;
snd_kcontrol_t *kctl;
snd_ctl_elem_id_t *dst, *id;
struct snd_ctl_elem_list list;
struct snd_kcontrol *kctl;
struct snd_ctl_elem_id *dst, *id;
unsigned int offset, space, first, jidx;
if (copy_from_user(&list, _list, sizeof(list)))
@ -559,7 +566,7 @@ static int snd_ctl_elem_list(snd_card_t *card, snd_ctl_elem_list_t __user *_list
return -ENOMEM;
if (space > 0) {
/* allocate temporary buffer for atomic operation */
dst = vmalloc(space * sizeof(snd_ctl_elem_id_t));
dst = vmalloc(space * sizeof(struct snd_ctl_elem_id));
if (dst == NULL)
return -ENOMEM;
down_read(&card->controls_rwsem);
@ -588,7 +595,9 @@ static int snd_ctl_elem_list(snd_card_t *card, snd_ctl_elem_list_t __user *_list
offset = 0;
}
up_read(&card->controls_rwsem);
if (list.used > 0 && copy_to_user(list.pids, dst, list.used * sizeof(snd_ctl_elem_id_t))) {
if (list.used > 0 &&
copy_to_user(list.pids, dst,
list.used * sizeof(struct snd_ctl_elem_id))) {
vfree(dst);
return -EFAULT;
}
@ -603,11 +612,12 @@ static int snd_ctl_elem_list(snd_card_t *card, snd_ctl_elem_list_t __user *_list
return 0;
}
static int snd_ctl_elem_info(snd_ctl_file_t *ctl, snd_ctl_elem_info_t *info)
static int snd_ctl_elem_info(struct snd_ctl_file *ctl,
struct snd_ctl_elem_info *info)
{
snd_card_t *card = ctl->card;
snd_kcontrol_t *kctl;
snd_kcontrol_volatile_t *vd;
struct snd_card *card = ctl->card;
struct snd_kcontrol *kctl;
struct snd_kcontrol_volatile *vd;
unsigned int index_offset;
int result;
@ -640,9 +650,10 @@ static int snd_ctl_elem_info(snd_ctl_file_t *ctl, snd_ctl_elem_info_t *info)
return result;
}
static int snd_ctl_elem_info_user(snd_ctl_file_t *ctl, snd_ctl_elem_info_t __user *_info)
static int snd_ctl_elem_info_user(struct snd_ctl_file *ctl,
struct snd_ctl_elem_info __user *_info)
{
snd_ctl_elem_info_t info;
struct snd_ctl_elem_info info;
int result;
if (copy_from_user(&info, _info, sizeof(info)))
@ -654,10 +665,10 @@ static int snd_ctl_elem_info_user(snd_ctl_file_t *ctl, snd_ctl_elem_info_t __use
return result;
}
int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t *control)
int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control)
{
snd_kcontrol_t *kctl;
snd_kcontrol_volatile_t *vd;
struct snd_kcontrol *kctl;
struct snd_kcontrol_volatile *vd;
unsigned int index_offset;
int result, indirect;
@ -684,9 +695,10 @@ int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t *control)
return result;
}
static int snd_ctl_elem_read_user(snd_card_t *card, snd_ctl_elem_value_t __user *_control)
static int snd_ctl_elem_read_user(struct snd_card *card,
struct snd_ctl_elem_value __user *_control)
{
snd_ctl_elem_value_t *control;
struct snd_ctl_elem_value *control;
int result;
control = kmalloc(sizeof(*control), GFP_KERNEL);
@ -704,10 +716,11 @@ static int snd_ctl_elem_read_user(snd_card_t *card, snd_ctl_elem_value_t __user
return result;
}
int snd_ctl_elem_write(snd_card_t *card, snd_ctl_file_t *file, snd_ctl_elem_value_t *control)
int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file,
struct snd_ctl_elem_value *control)
{
snd_kcontrol_t *kctl;
snd_kcontrol_volatile_t *vd;
struct snd_kcontrol *kctl;
struct snd_kcontrol_volatile *vd;
unsigned int index_offset;
int result, indirect;
@ -741,9 +754,10 @@ int snd_ctl_elem_write(snd_card_t *card, snd_ctl_file_t *file, snd_ctl_elem_valu
return result;
}
static int snd_ctl_elem_write_user(snd_ctl_file_t *file, snd_ctl_elem_value_t __user *_control)
static int snd_ctl_elem_write_user(struct snd_ctl_file *file,
struct snd_ctl_elem_value __user *_control)
{
snd_ctl_elem_value_t *control;
struct snd_ctl_elem_value *control;
int result;
control = kmalloc(sizeof(*control), GFP_KERNEL);
@ -761,12 +775,13 @@ static int snd_ctl_elem_write_user(snd_ctl_file_t *file, snd_ctl_elem_value_t __
return result;
}
static int snd_ctl_elem_lock(snd_ctl_file_t *file, snd_ctl_elem_id_t __user *_id)
static int snd_ctl_elem_lock(struct snd_ctl_file *file,
struct snd_ctl_elem_id __user *_id)
{
snd_card_t *card = file->card;
snd_ctl_elem_id_t id;
snd_kcontrol_t *kctl;
snd_kcontrol_volatile_t *vd;
struct snd_card *card = file->card;
struct snd_ctl_elem_id id;
struct snd_kcontrol *kctl;
struct snd_kcontrol_volatile *vd;
int result;
if (copy_from_user(&id, _id, sizeof(id)))
@ -789,12 +804,13 @@ static int snd_ctl_elem_lock(snd_ctl_file_t *file, snd_ctl_elem_id_t __user *_id
return result;
}
static int snd_ctl_elem_unlock(snd_ctl_file_t *file, snd_ctl_elem_id_t __user *_id)
static int snd_ctl_elem_unlock(struct snd_ctl_file *file,
struct snd_ctl_elem_id __user *_id)
{
snd_card_t *card = file->card;
snd_ctl_elem_id_t id;
snd_kcontrol_t *kctl;
snd_kcontrol_volatile_t *vd;
struct snd_card *card = file->card;
struct snd_ctl_elem_id id;
struct snd_kcontrol *kctl;
struct snd_kcontrol_volatile *vd;
int result;
if (copy_from_user(&id, _id, sizeof(id)))
@ -820,14 +836,15 @@ static int snd_ctl_elem_unlock(snd_ctl_file_t *file, snd_ctl_elem_id_t __user *_
}
struct user_element {
snd_ctl_elem_info_t info;
struct snd_ctl_elem_info info;
void *elem_data; /* element data */
unsigned long elem_data_size; /* size of element data in bytes */
void *priv_data; /* private data (like strings for enumerated type) */
unsigned long priv_data_size; /* size of private data in bytes */
};
static int snd_ctl_elem_user_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
static int snd_ctl_elem_user_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
struct user_element *ue = kcontrol->private_data;
@ -835,7 +852,8 @@ static int snd_ctl_elem_user_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t
return 0;
}
static int snd_ctl_elem_user_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct user_element *ue = kcontrol->private_data;
@ -843,7 +861,8 @@ static int snd_ctl_elem_user_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t
return 0;
}
static int snd_ctl_elem_user_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
static int snd_ctl_elem_user_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
int change;
struct user_element *ue = kcontrol->private_data;
@ -854,15 +873,16 @@ static int snd_ctl_elem_user_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t
return change;
}
static void snd_ctl_elem_user_free(snd_kcontrol_t * kcontrol)
static void snd_ctl_elem_user_free(struct snd_kcontrol *kcontrol)
{
kfree(kcontrol->private_data);
}
static int snd_ctl_elem_add(snd_ctl_file_t *file, snd_ctl_elem_info_t *info, int replace)
static int snd_ctl_elem_add(struct snd_ctl_file *file,
struct snd_ctl_elem_info *info, int replace)
{
snd_card_t *card = file->card;
snd_kcontrol_t kctl, *_kctl;
struct snd_card *card = file->card;
struct snd_kcontrol kctl, *_kctl;
unsigned int access;
long private_size;
struct user_element *ue;
@ -873,7 +893,8 @@ static int snd_ctl_elem_add(snd_ctl_file_t *file, snd_ctl_elem_info_t *info, int
if (info->count > 1024)
return -EINVAL;
access = info->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
(info->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE|SNDRV_CTL_ELEM_ACCESS_INACTIVE));
(info->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE|
SNDRV_CTL_ELEM_ACCESS_INACTIVE));
info->id.numid = 0;
memset(&kctl, 0, sizeof(kctl));
down_write(&card->controls_rwsem);
@ -921,7 +942,7 @@ static int snd_ctl_elem_add(snd_ctl_file_t *file, snd_ctl_elem_info_t *info, int
return -EINVAL;
break;
case SNDRV_CTL_ELEM_TYPE_IEC958:
private_size = sizeof(struct sndrv_aes_iec958);
private_size = sizeof(struct snd_aes_iec958);
if (info->count != 1)
return -EINVAL;
break;
@ -957,24 +978,26 @@ static int snd_ctl_elem_add(snd_ctl_file_t *file, snd_ctl_elem_info_t *info, int
return 0;
}
static int snd_ctl_elem_add_user(snd_ctl_file_t *file, snd_ctl_elem_info_t __user *_info, int replace)
static int snd_ctl_elem_add_user(struct snd_ctl_file *file,
struct snd_ctl_elem_info __user *_info, int replace)
{
snd_ctl_elem_info_t info;
struct snd_ctl_elem_info info;
if (copy_from_user(&info, _info, sizeof(info)))
return -EFAULT;
return snd_ctl_elem_add(file, &info, replace);
}
static int snd_ctl_elem_remove(snd_ctl_file_t *file, snd_ctl_elem_id_t __user *_id)
static int snd_ctl_elem_remove(struct snd_ctl_file *file,
struct snd_ctl_elem_id __user *_id)
{
snd_ctl_elem_id_t id;
struct snd_ctl_elem_id id;
int err;
if (copy_from_user(&id, _id, sizeof(id)))
return -EFAULT;
err = snd_ctl_remove_unlocked_id(file, &id);
if (! err) {
snd_card_t *card = file->card;
struct snd_card *card = file->card;
down_write(&card->controls_rwsem);
card->user_ctl_count--;
up_write(&card->controls_rwsem);
@ -982,7 +1005,7 @@ static int snd_ctl_elem_remove(snd_ctl_file_t *file, snd_ctl_elem_id_t __user *_
return err;
}
static int snd_ctl_subscribe_events(snd_ctl_file_t *file, int __user *ptr)
static int snd_ctl_subscribe_events(struct snd_ctl_file *file, int __user *ptr)
{
int subscribe;
if (get_user(subscribe, ptr))
@ -1003,42 +1026,12 @@ static int snd_ctl_subscribe_events(snd_ctl_file_t *file, int __user *ptr)
return 0;
}
#ifdef CONFIG_PM
/*
* change the power state
*/
static int snd_ctl_set_power_state(snd_card_t *card, unsigned int power_state)
{
switch (power_state) {
case SNDRV_CTL_POWER_D0:
if (card->power_state != power_state) {
card->pm_resume(card);
snd_power_change_state(card, power_state);
}
break;
case SNDRV_CTL_POWER_D3hot:
if (card->power_state != power_state) {
card->pm_suspend(card, PMSG_SUSPEND);
snd_power_change_state(card, power_state);
}
break;
case SNDRV_CTL_POWER_D1:
case SNDRV_CTL_POWER_D2:
case SNDRV_CTL_POWER_D3cold:
/* not supported yet */
default:
return -EINVAL;
}
return 0;
}
#endif
static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
snd_ctl_file_t *ctl;
snd_card_t *card;
struct snd_ctl_file *ctl;
struct snd_card *card;
struct list_head *list;
snd_kctl_ioctl_t *p;
struct snd_kctl_ioctl *p;
void __user *argp = (void __user *)arg;
int __user *ip = argp;
int err;
@ -1072,19 +1065,7 @@ static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg
case SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS:
return snd_ctl_subscribe_events(ctl, ip);
case SNDRV_CTL_IOCTL_POWER:
if (get_user(err, ip))
return -EFAULT;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
#ifdef CONFIG_PM
if (card->pm_suspend && card->pm_resume) {
snd_power_lock(card);
err = snd_ctl_set_power_state(card, err);
snd_power_unlock(card);
} else
#endif
err = -ENOPROTOOPT;
return err;
return -ENOPROTOOPT;
case SNDRV_CTL_IOCTL_POWER_STATE:
#ifdef CONFIG_PM
return put_user(card->power_state, ip) ? -EFAULT : 0;
@ -1094,7 +1075,7 @@ static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg
}
down_read(&snd_ioctl_rwsem);
list_for_each(list, &snd_control_ioctls) {
p = list_entry(list, snd_kctl_ioctl_t, list);
p = list_entry(list, struct snd_kctl_ioctl, list);
err = p->fioctl(card, ctl, cmd, arg);
if (err != -ENOIOCTLCMD) {
up_read(&snd_ioctl_rwsem);
@ -1106,9 +1087,10 @@ static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg
return -ENOTTY;
}
static ssize_t snd_ctl_read(struct file *file, char __user *buffer, size_t count, loff_t * offset)
static ssize_t snd_ctl_read(struct file *file, char __user *buffer,
size_t count, loff_t * offset)
{
snd_ctl_file_t *ctl;
struct snd_ctl_file *ctl;
int err = 0;
ssize_t result = 0;
@ -1116,12 +1098,12 @@ static ssize_t snd_ctl_read(struct file *file, char __user *buffer, size_t count
snd_assert(ctl != NULL && ctl->card != NULL, return -ENXIO);
if (!ctl->subscribed)
return -EBADFD;
if (count < sizeof(snd_ctl_event_t))
if (count < sizeof(struct snd_ctl_event))
return -EINVAL;
spin_lock_irq(&ctl->read_lock);
while (count >= sizeof(snd_ctl_event_t)) {
snd_ctl_event_t ev;
snd_kctl_event_t *kev;
while (count >= sizeof(struct snd_ctl_event)) {
struct snd_ctl_event ev;
struct snd_kctl_event *kev;
while (list_empty(&ctl->events)) {
wait_queue_t wait;
if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) {
@ -1145,14 +1127,14 @@ static ssize_t snd_ctl_read(struct file *file, char __user *buffer, size_t count
list_del(&kev->list);
spin_unlock_irq(&ctl->read_lock);
kfree(kev);
if (copy_to_user(buffer, &ev, sizeof(snd_ctl_event_t))) {
if (copy_to_user(buffer, &ev, sizeof(struct snd_ctl_event))) {
err = -EFAULT;
goto __end;
}
spin_lock_irq(&ctl->read_lock);
buffer += sizeof(snd_ctl_event_t);
count -= sizeof(snd_ctl_event_t);
result += sizeof(snd_ctl_event_t);
buffer += sizeof(struct snd_ctl_event);
count -= sizeof(struct snd_ctl_event);
result += sizeof(struct snd_ctl_event);
}
__end_lock:
spin_unlock_irq(&ctl->read_lock);
@ -1163,7 +1145,7 @@ static ssize_t snd_ctl_read(struct file *file, char __user *buffer, size_t count
static unsigned int snd_ctl_poll(struct file *file, poll_table * wait)
{
unsigned int mask;
snd_ctl_file_t *ctl;
struct snd_ctl_file *ctl;
ctl = file->private_data;
if (!ctl->subscribed)
@ -1183,9 +1165,9 @@ static unsigned int snd_ctl_poll(struct file *file, poll_table * wait)
*/
static int _snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn, struct list_head *lists)
{
snd_kctl_ioctl_t *pn;
struct snd_kctl_ioctl *pn;
pn = kzalloc(sizeof(snd_kctl_ioctl_t), GFP_KERNEL);
pn = kzalloc(sizeof(struct snd_kctl_ioctl), GFP_KERNEL);
if (pn == NULL)
return -ENOMEM;
pn->fioctl = fcn;
@ -1210,15 +1192,16 @@ int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn)
/*
* de-register the device-specific control-ioctls.
*/
static int _snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn, struct list_head *lists)
static int _snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn,
struct list_head *lists)
{
struct list_head *list;
snd_kctl_ioctl_t *p;
struct snd_kctl_ioctl *p;
snd_assert(fcn != NULL, return -EINVAL);
down_write(&snd_ioctl_rwsem);
list_for_each(list, lists) {
p = list_entry(list, snd_kctl_ioctl_t, list);
p = list_entry(list, struct snd_kctl_ioctl, list);
if (p->fioctl == fcn) {
list_del(&p->list);
up_write(&snd_ioctl_rwsem);
@ -1246,7 +1229,7 @@ int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn)
static int snd_ctl_fasync(int fd, struct file * file, int on)
{
snd_ctl_file_t *ctl;
struct snd_ctl_file *ctl;
int err;
ctl = file->private_data;
err = fasync_helper(fd, file, on, &ctl->fasync);
@ -1280,18 +1263,12 @@ static struct file_operations snd_ctl_f_ops =
.fasync = snd_ctl_fasync,
};
static snd_minor_t snd_ctl_reg =
{
.comment = "ctl",
.f_ops = &snd_ctl_f_ops,
};
/*
* registration of the control device
*/
static int snd_ctl_dev_register(snd_device_t *device)
static int snd_ctl_dev_register(struct snd_device *device)
{
snd_card_t *card = device->device_data;
struct snd_card *card = device->device_data;
int err, cardnum;
char name[16];
@ -1299,8 +1276,8 @@ static int snd_ctl_dev_register(snd_device_t *device)
cardnum = card->number;
snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
sprintf(name, "controlC%i", cardnum);
if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL,
card, 0, &snd_ctl_reg, name)) < 0)
if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,
&snd_ctl_f_ops, card, name)) < 0)
return err;
return 0;
}
@ -1308,11 +1285,11 @@ static int snd_ctl_dev_register(snd_device_t *device)
/*
* disconnection of the control device
*/
static int snd_ctl_dev_disconnect(snd_device_t *device)
static int snd_ctl_dev_disconnect(struct snd_device *device)
{
snd_card_t *card = device->device_data;
struct snd_card *card = device->device_data;
struct list_head *flist;
snd_ctl_file_t *ctl;
struct snd_ctl_file *ctl;
down_read(&card->controls_rwsem);
list_for_each(flist, &card->ctl_files) {
@ -1327,10 +1304,10 @@ static int snd_ctl_dev_disconnect(snd_device_t *device)
/*
* free all controls
*/
static int snd_ctl_dev_free(snd_device_t *device)
static int snd_ctl_dev_free(struct snd_device *device)
{
snd_card_t *card = device->device_data;
snd_kcontrol_t *control;
struct snd_card *card = device->device_data;
struct snd_kcontrol *control;
down_write(&card->controls_rwsem);
while (!list_empty(&card->controls)) {
@ -1344,15 +1321,16 @@ static int snd_ctl_dev_free(snd_device_t *device)
/*
* de-registration of the control device
*/
static int snd_ctl_dev_unregister(snd_device_t *device)
static int snd_ctl_dev_unregister(struct snd_device *device)
{
snd_card_t *card = device->device_data;
struct snd_card *card = device->device_data;
int err, cardnum;
snd_assert(card != NULL, return -ENXIO);
cardnum = card->number;
snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL, card, 0)) < 0)
if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL,
card, -1)) < 0)
return err;
return snd_ctl_dev_free(device);
}
@ -1361,9 +1339,9 @@ static int snd_ctl_dev_unregister(snd_device_t *device)
* create control core:
* called from init.c
*/
int snd_ctl_create(snd_card_t *card)
int snd_ctl_create(struct snd_card *card)
{
static snd_device_ops_t ops = {
static struct snd_device_ops ops = {
.dev_free = snd_ctl_dev_free,
.dev_register = snd_ctl_dev_register,
.dev_disconnect = snd_ctl_dev_disconnect,

View File

@ -22,7 +22,7 @@
#include <linux/compat.h>
struct sndrv_ctl_elem_list32 {
struct snd_ctl_elem_list32 {
u32 offset;
u32 space;
u32 used;
@ -31,9 +31,10 @@ struct sndrv_ctl_elem_list32 {
unsigned char reserved[50];
} /* don't set packed attribute here */;
static int snd_ctl_elem_list_compat(snd_card_t *card, struct sndrv_ctl_elem_list32 __user *data32)
static int snd_ctl_elem_list_compat(struct snd_card *card,
struct snd_ctl_elem_list32 __user *data32)
{
struct sndrv_ctl_elem_list __user *data;
struct snd_ctl_elem_list __user *data;
compat_caddr_t ptr;
int err;
@ -60,8 +61,8 @@ static int snd_ctl_elem_list_compat(snd_card_t *card, struct sndrv_ctl_elem_list
* it uses union, so the things are not easy..
*/
struct sndrv_ctl_elem_info32 {
struct sndrv_ctl_elem_id id; // the size of struct is same
struct snd_ctl_elem_info32 {
struct snd_ctl_elem_id id; // the size of struct is same
s32 type;
u32 access;
u32 count;
@ -87,9 +88,10 @@ struct sndrv_ctl_elem_info32 {
unsigned char reserved[64];
} __attribute__((packed));
static int snd_ctl_elem_info_compat(snd_ctl_file_t *ctl, struct sndrv_ctl_elem_info32 __user *data32)
static int snd_ctl_elem_info_compat(struct snd_ctl_file *ctl,
struct snd_ctl_elem_info32 __user *data32)
{
struct sndrv_ctl_elem_info *data;
struct snd_ctl_elem_info *data;
int err;
data = kzalloc(sizeof(*data), GFP_KERNEL);
@ -146,8 +148,8 @@ static int snd_ctl_elem_info_compat(snd_ctl_file_t *ctl, struct sndrv_ctl_elem_i
}
/* read / write */
struct sndrv_ctl_elem_value32 {
struct sndrv_ctl_elem_id id;
struct snd_ctl_elem_value32 {
struct snd_ctl_elem_id id;
unsigned int indirect; /* bit-field causes misalignment */
union {
s32 integer[128];
@ -161,10 +163,11 @@ struct sndrv_ctl_elem_value32 {
/* get the value type and count of the control */
static int get_ctl_type(snd_card_t *card, snd_ctl_elem_id_t *id, int *countp)
static int get_ctl_type(struct snd_card *card, struct snd_ctl_elem_id *id,
int *countp)
{
snd_kcontrol_t *kctl;
snd_ctl_elem_info_t info;
struct snd_kcontrol *kctl;
struct snd_ctl_elem_info info;
int err;
down_read(&card->controls_rwsem);
@ -193,15 +196,15 @@ static int get_elem_size(int type, int count)
case SNDRV_CTL_ELEM_TYPE_BYTES:
return 512;
case SNDRV_CTL_ELEM_TYPE_IEC958:
return sizeof(struct sndrv_aes_iec958);
return sizeof(struct snd_aes_iec958);
default:
return -1;
}
}
static int copy_ctl_value_from_user(snd_card_t *card,
struct sndrv_ctl_elem_value *data,
struct sndrv_ctl_elem_value32 __user *data32,
static int copy_ctl_value_from_user(struct snd_card *card,
struct snd_ctl_elem_value *data,
struct snd_ctl_elem_value32 __user *data32,
int *typep, int *countp)
{
int i, type, count, size;
@ -242,8 +245,8 @@ static int copy_ctl_value_from_user(snd_card_t *card,
}
/* restore the value to 32bit */
static int copy_ctl_value_to_user(struct sndrv_ctl_elem_value32 __user *data32,
struct sndrv_ctl_elem_value *data,
static int copy_ctl_value_to_user(struct snd_ctl_elem_value32 __user *data32,
struct snd_ctl_elem_value *data,
int type, int count)
{
int i, size;
@ -265,10 +268,10 @@ static int copy_ctl_value_to_user(struct sndrv_ctl_elem_value32 __user *data32,
return 0;
}
static int snd_ctl_elem_read_user_compat(snd_card_t *card,
struct sndrv_ctl_elem_value32 __user *data32)
static int snd_ctl_elem_read_user_compat(struct snd_card *card,
struct snd_ctl_elem_value32 __user *data32)
{
struct sndrv_ctl_elem_value *data;
struct snd_ctl_elem_value *data;
int err, type, count;
data = kzalloc(sizeof(*data), GFP_KERNEL);
@ -285,10 +288,10 @@ static int snd_ctl_elem_read_user_compat(snd_card_t *card,
return err;
}
static int snd_ctl_elem_write_user_compat(snd_ctl_file_t *file,
struct sndrv_ctl_elem_value32 __user *data32)
static int snd_ctl_elem_write_user_compat(struct snd_ctl_file *file,
struct snd_ctl_elem_value32 __user *data32)
{
struct sndrv_ctl_elem_value *data;
struct snd_ctl_elem_value *data;
int err, type, count;
data = kzalloc(sizeof(*data), GFP_KERNEL);
@ -306,11 +309,11 @@ static int snd_ctl_elem_write_user_compat(snd_ctl_file_t *file,
}
/* add or replace a user control */
static int snd_ctl_elem_add_compat(snd_ctl_file_t *file,
struct sndrv_ctl_elem_info32 __user *data32,
static int snd_ctl_elem_add_compat(struct snd_ctl_file *file,
struct snd_ctl_elem_info32 __user *data32,
int replace)
{
struct sndrv_ctl_elem_info *data;
struct snd_ctl_elem_info *data;
int err;
data = kzalloc(sizeof(*data), GFP_KERNEL);
@ -355,17 +358,17 @@ static int snd_ctl_elem_add_compat(snd_ctl_file_t *file,
}
enum {
SNDRV_CTL_IOCTL_ELEM_LIST32 = _IOWR('U', 0x10, struct sndrv_ctl_elem_list32),
SNDRV_CTL_IOCTL_ELEM_INFO32 = _IOWR('U', 0x11, struct sndrv_ctl_elem_info32),
SNDRV_CTL_IOCTL_ELEM_READ32 = _IOWR('U', 0x12, struct sndrv_ctl_elem_value32),
SNDRV_CTL_IOCTL_ELEM_WRITE32 = _IOWR('U', 0x13, struct sndrv_ctl_elem_value32),
SNDRV_CTL_IOCTL_ELEM_ADD32 = _IOWR('U', 0x17, struct sndrv_ctl_elem_info32),
SNDRV_CTL_IOCTL_ELEM_REPLACE32 = _IOWR('U', 0x18, struct sndrv_ctl_elem_info32),
SNDRV_CTL_IOCTL_ELEM_LIST32 = _IOWR('U', 0x10, struct snd_ctl_elem_list32),
SNDRV_CTL_IOCTL_ELEM_INFO32 = _IOWR('U', 0x11, struct snd_ctl_elem_info32),
SNDRV_CTL_IOCTL_ELEM_READ32 = _IOWR('U', 0x12, struct snd_ctl_elem_value32),
SNDRV_CTL_IOCTL_ELEM_WRITE32 = _IOWR('U', 0x13, struct snd_ctl_elem_value32),
SNDRV_CTL_IOCTL_ELEM_ADD32 = _IOWR('U', 0x17, struct snd_ctl_elem_info32),
SNDRV_CTL_IOCTL_ELEM_REPLACE32 = _IOWR('U', 0x18, struct snd_ctl_elem_info32),
};
static inline long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg)
{
snd_ctl_file_t *ctl;
struct snd_ctl_file *ctl;
struct list_head *list;
void __user *argp = compat_ptr(arg);
int err;
@ -398,7 +401,7 @@ static inline long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, uns
down_read(&snd_ioctl_rwsem);
list_for_each(list, &snd_control_compat_ioctls) {
snd_kctl_ioctl_t *p = list_entry(list, snd_kctl_ioctl_t, list);
struct snd_kctl_ioctl *p = list_entry(list, struct snd_kctl_ioctl, list);
if (p->fioctl) {
err = p->fioctl(ctl->card, ctl, cmd, arg);
if (err != -ENOIOCTLCMD) {

View File

@ -41,17 +41,19 @@
*
* Returns zero if successful, or a negative error code on failure.
*/
int snd_device_new(snd_card_t *card, snd_device_type_t type,
void *device_data, snd_device_ops_t *ops)
int snd_device_new(struct snd_card *card, snd_device_type_t type,
void *device_data, struct snd_device_ops *ops)
{
snd_device_t *dev;
struct snd_device *dev;
snd_assert(card != NULL, return -ENXIO);
snd_assert(device_data != NULL, return -ENXIO);
snd_assert(ops != NULL, return -ENXIO);
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (dev == NULL)
if (dev == NULL) {
snd_printk(KERN_ERR "Cannot allocate device\n");
return -ENOMEM;
}
dev->card = card;
dev->type = type;
dev->state = SNDRV_DEV_BUILD;
@ -73,10 +75,10 @@ int snd_device_new(snd_card_t *card, snd_device_type_t type,
* Returns zero if successful, or a negative error code on failure or if the
* device not found.
*/
int snd_device_free(snd_card_t *card, void *device_data)
int snd_device_free(struct snd_card *card, void *device_data)
{
struct list_head *list;
snd_device_t *dev;
struct snd_device *dev;
snd_assert(card != NULL, return -ENXIO);
snd_assert(device_data != NULL, return -ENXIO);
@ -86,7 +88,8 @@ int snd_device_free(snd_card_t *card, void *device_data)
continue;
/* unlink */
list_del(&dev->list);
if ((dev->state == SNDRV_DEV_REGISTERED || dev->state == SNDRV_DEV_DISCONNECTED) &&
if ((dev->state == SNDRV_DEV_REGISTERED ||
dev->state == SNDRV_DEV_DISCONNECTED) &&
dev->ops->dev_unregister) {
if (dev->ops->dev_unregister(dev))
snd_printk(KERN_ERR "device unregister failure\n");
@ -99,7 +102,8 @@ int snd_device_free(snd_card_t *card, void *device_data)
kfree(dev);
return 0;
}
snd_printd("device free %p (from %p), not found\n", device_data, __builtin_return_address(0));
snd_printd("device free %p (from %p), not found\n", device_data,
__builtin_return_address(0));
return -ENXIO;
}
@ -116,10 +120,10 @@ int snd_device_free(snd_card_t *card, void *device_data)
* Returns zero if successful, or a negative error code on failure or if the
* device not found.
*/
int snd_device_disconnect(snd_card_t *card, void *device_data)
int snd_device_disconnect(struct snd_card *card, void *device_data)
{
struct list_head *list;
snd_device_t *dev;
struct snd_device *dev;
snd_assert(card != NULL, return -ENXIO);
snd_assert(device_data != NULL, return -ENXIO);
@ -127,14 +131,16 @@ int snd_device_disconnect(snd_card_t *card, void *device_data)
dev = snd_device(list);
if (dev->device_data != device_data)
continue;
if (dev->state == SNDRV_DEV_REGISTERED && dev->ops->dev_disconnect) {
if (dev->state == SNDRV_DEV_REGISTERED &&
dev->ops->dev_disconnect) {
if (dev->ops->dev_disconnect(dev))
snd_printk(KERN_ERR "device disconnect failure\n");
dev->state = SNDRV_DEV_DISCONNECTED;
}
return 0;
}
snd_printd("device disconnect %p (from %p), not found\n", device_data, __builtin_return_address(0));
snd_printd("device disconnect %p (from %p), not found\n", device_data,
__builtin_return_address(0));
return -ENXIO;
}
@ -151,10 +157,10 @@ int snd_device_disconnect(snd_card_t *card, void *device_data)
* Returns zero if successful, or a negative error code on failure or if the
* device not found.
*/
int snd_device_register(snd_card_t *card, void *device_data)
int snd_device_register(struct snd_card *card, void *device_data)
{
struct list_head *list;
snd_device_t *dev;
struct snd_device *dev;
int err;
snd_assert(card != NULL, return -ENXIO);
@ -169,6 +175,7 @@ int snd_device_register(snd_card_t *card, void *device_data)
dev->state = SNDRV_DEV_REGISTERED;
return 0;
}
snd_printd("snd_device_register busy\n");
return -EBUSY;
}
snd_BUG();
@ -179,10 +186,10 @@ int snd_device_register(snd_card_t *card, void *device_data)
* register all the devices on the card.
* called from init.c
*/
int snd_device_register_all(snd_card_t *card)
int snd_device_register_all(struct snd_card *card)
{
struct list_head *list;
snd_device_t *dev;
struct snd_device *dev;
int err;
snd_assert(card != NULL, return -ENXIO);
@ -201,9 +208,9 @@ int snd_device_register_all(snd_card_t *card)
* disconnect all the devices on the card.
* called from init.c
*/
int snd_device_disconnect_all(snd_card_t *card)
int snd_device_disconnect_all(struct snd_card *card)
{
snd_device_t *dev;
struct snd_device *dev;
struct list_head *list;
int err = 0;
@ -220,9 +227,9 @@ int snd_device_disconnect_all(snd_card_t *card)
* release all the devices on the card.
* called from init.c
*/
int snd_device_free_all(snd_card_t *card, snd_device_cmd_t cmd)
int snd_device_free_all(struct snd_card *card, snd_device_cmd_t cmd)
{
snd_device_t *dev;
struct snd_device *dev;
struct list_head *list;
int err;
unsigned int range_low, range_high;

View File

@ -35,38 +35,49 @@ MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
MODULE_DESCRIPTION("Hardware dependent layer");
MODULE_LICENSE("GPL");
static snd_hwdep_t *snd_hwdep_devices[SNDRV_CARDS * SNDRV_MINOR_HWDEPS];
static LIST_HEAD(snd_hwdep_devices);
static DECLARE_MUTEX(register_mutex);
static int snd_hwdep_free(snd_hwdep_t *hwdep);
static int snd_hwdep_dev_free(snd_device_t *device);
static int snd_hwdep_dev_register(snd_device_t *device);
static int snd_hwdep_dev_unregister(snd_device_t *device);
static int snd_hwdep_free(struct snd_hwdep *hwdep);
static int snd_hwdep_dev_free(struct snd_device *device);
static int snd_hwdep_dev_register(struct snd_device *device);
static int snd_hwdep_dev_unregister(struct snd_device *device);
/*
*/
static struct snd_hwdep *snd_hwdep_search(struct snd_card *card, int device)
{
struct list_head *p;
struct snd_hwdep *hwdep;
list_for_each(p, &snd_hwdep_devices) {
hwdep = list_entry(p, struct snd_hwdep, list);
if (hwdep->card == card && hwdep->device == device)
return hwdep;
}
return NULL;
}
static loff_t snd_hwdep_llseek(struct file * file, loff_t offset, int orig)
{
snd_hwdep_t *hw = file->private_data;
struct snd_hwdep *hw = file->private_data;
if (hw->ops.llseek)
return hw->ops.llseek(hw, file, offset, orig);
return -ENXIO;
}
static ssize_t snd_hwdep_read(struct file * file, char __user *buf, size_t count, loff_t *offset)
static ssize_t snd_hwdep_read(struct file * file, char __user *buf,
size_t count, loff_t *offset)
{
snd_hwdep_t *hw = file->private_data;
struct snd_hwdep *hw = file->private_data;
if (hw->ops.read)
return hw->ops.read(hw, buf, count, offset);
return -ENXIO;
}
static ssize_t snd_hwdep_write(struct file * file, const char __user *buf, size_t count, loff_t *offset)
static ssize_t snd_hwdep_write(struct file * file, const char __user *buf,
size_t count, loff_t *offset)
{
snd_hwdep_t *hw = file->private_data;
struct snd_hwdep *hw = file->private_data;
if (hw->ops.write)
return hw->ops.write(hw, buf, count, offset);
return -ENXIO;
@ -75,34 +86,25 @@ static ssize_t snd_hwdep_write(struct file * file, const char __user *buf, size_
static int snd_hwdep_open(struct inode *inode, struct file * file)
{
int major = imajor(inode);
int cardnum;
int device;
snd_hwdep_t *hw;
struct snd_hwdep *hw;
int err;
wait_queue_t wait;
if (major == snd_major) {
cardnum = SNDRV_MINOR_CARD(iminor(inode));
device = SNDRV_MINOR_DEVICE(iminor(inode)) - SNDRV_MINOR_HWDEP;
hw = snd_lookup_minor_data(iminor(inode),
SNDRV_DEVICE_TYPE_HWDEP);
#ifdef CONFIG_SND_OSSEMUL
} else if (major == SOUND_MAJOR) {
cardnum = SNDRV_MINOR_OSS_CARD(iminor(inode));
device = 0;
hw = snd_lookup_oss_minor_data(iminor(inode),
SNDRV_OSS_DEVICE_TYPE_DMFM);
#endif
} else
return -ENXIO;
cardnum %= SNDRV_CARDS;
device %= SNDRV_MINOR_HWDEPS;
hw = snd_hwdep_devices[(cardnum * SNDRV_MINOR_HWDEPS) + device];
if (hw == NULL)
return -ENODEV;
if (!hw->ops.open)
return -ENXIO;
#ifdef CONFIG_SND_OSSEMUL
if (major == SOUND_MAJOR && hw->oss_type < 0)
return -ENXIO;
#endif
if (!try_module_get(hw->card->module))
return -EFAULT;
@ -154,7 +156,7 @@ static int snd_hwdep_open(struct inode *inode, struct file * file)
static int snd_hwdep_release(struct inode *inode, struct file * file)
{
int err = -ENXIO;
snd_hwdep_t *hw = file->private_data;
struct snd_hwdep *hw = file->private_data;
down(&hw->open_mutex);
if (hw->ops.release) {
err = hw->ops.release(hw, file);
@ -170,15 +172,16 @@ static int snd_hwdep_release(struct inode *inode, struct file * file)
static unsigned int snd_hwdep_poll(struct file * file, poll_table * wait)
{
snd_hwdep_t *hw = file->private_data;
struct snd_hwdep *hw = file->private_data;
if (hw->ops.poll)
return hw->ops.poll(hw, file, wait);
return 0;
}
static int snd_hwdep_info(snd_hwdep_t *hw, snd_hwdep_info_t __user *_info)
static int snd_hwdep_info(struct snd_hwdep *hw,
struct snd_hwdep_info __user *_info)
{
snd_hwdep_info_t info;
struct snd_hwdep_info info;
memset(&info, 0, sizeof(info));
info.card = hw->card->number;
@ -190,9 +193,10 @@ static int snd_hwdep_info(snd_hwdep_t *hw, snd_hwdep_info_t __user *_info)
return 0;
}
static int snd_hwdep_dsp_status(snd_hwdep_t *hw, snd_hwdep_dsp_status_t __user *_info)
static int snd_hwdep_dsp_status(struct snd_hwdep *hw,
struct snd_hwdep_dsp_status __user *_info)
{
snd_hwdep_dsp_status_t info;
struct snd_hwdep_dsp_status info;
int err;
if (! hw->ops.dsp_status)
@ -206,9 +210,10 @@ static int snd_hwdep_dsp_status(snd_hwdep_t *hw, snd_hwdep_dsp_status_t __user *
return 0;
}
static int snd_hwdep_dsp_load(snd_hwdep_t *hw, snd_hwdep_dsp_image_t __user *_info)
static int snd_hwdep_dsp_load(struct snd_hwdep *hw,
struct snd_hwdep_dsp_image __user *_info)
{
snd_hwdep_dsp_image_t info;
struct snd_hwdep_dsp_image info;
int err;
if (! hw->ops.dsp_load)
@ -228,9 +233,10 @@ static int snd_hwdep_dsp_load(snd_hwdep_t *hw, snd_hwdep_dsp_image_t __user *_in
return 0;
}
static long snd_hwdep_ioctl(struct file * file, unsigned int cmd, unsigned long arg)
static long snd_hwdep_ioctl(struct file * file, unsigned int cmd,
unsigned long arg)
{
snd_hwdep_t *hw = file->private_data;
struct snd_hwdep *hw = file->private_data;
void __user *argp = (void __user *)arg;
switch (cmd) {
case SNDRV_HWDEP_IOCTL_PVERSION:
@ -249,18 +255,16 @@ static long snd_hwdep_ioctl(struct file * file, unsigned int cmd, unsigned long
static int snd_hwdep_mmap(struct file * file, struct vm_area_struct * vma)
{
snd_hwdep_t *hw = file->private_data;
struct snd_hwdep *hw = file->private_data;
if (hw->ops.mmap)
return hw->ops.mmap(hw, file, vma);
return -ENXIO;
}
static int snd_hwdep_control_ioctl(snd_card_t * card, snd_ctl_file_t * control,
static int snd_hwdep_control_ioctl(struct snd_card *card,
struct snd_ctl_file * control,
unsigned int cmd, unsigned long arg)
{
unsigned int tmp;
tmp = card->number * SNDRV_MINOR_HWDEPS;
switch (cmd) {
case SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE:
{
@ -268,32 +272,36 @@ static int snd_hwdep_control_ioctl(snd_card_t * card, snd_ctl_file_t * control,
if (get_user(device, (int __user *)arg))
return -EFAULT;
down(&register_mutex);
device = device < 0 ? 0 : device + 1;
while (device < SNDRV_MINOR_HWDEPS) {
if (snd_hwdep_devices[tmp + device])
if (snd_hwdep_search(card, device))
break;
device++;
}
if (device >= SNDRV_MINOR_HWDEPS)
device = -1;
up(&register_mutex);
if (put_user(device, (int __user *)arg))
return -EFAULT;
return 0;
}
case SNDRV_CTL_IOCTL_HWDEP_INFO:
{
snd_hwdep_info_t __user *info = (snd_hwdep_info_t __user *)arg;
int device;
snd_hwdep_t *hwdep;
struct snd_hwdep_info __user *info = (struct snd_hwdep_info __user *)arg;
int device, err;
struct snd_hwdep *hwdep;
if (get_user(device, &info->device))
return -EFAULT;
if (device < 0 || device >= SNDRV_MINOR_HWDEPS)
return -ENXIO;
hwdep = snd_hwdep_devices[tmp + device];
if (hwdep == NULL)
return -ENXIO;
return snd_hwdep_info(hwdep, info);
down(&register_mutex);
hwdep = snd_hwdep_search(card, device);
if (hwdep)
err = snd_hwdep_info(hwdep, info);
else
err = -ENXIO;
up(&register_mutex);
return err;
}
}
return -ENOIOCTLCMD;
@ -323,12 +331,6 @@ static struct file_operations snd_hwdep_f_ops =
.mmap = snd_hwdep_mmap,
};
static snd_minor_t snd_hwdep_reg =
{
.comment = "hardware dependent",
.f_ops = &snd_hwdep_f_ops,
};
/**
* snd_hwdep_new - create a new hwdep instance
* @card: the card instance
@ -342,11 +344,12 @@ static snd_minor_t snd_hwdep_reg =
*
* Returns zero if successful, or a negative error code on failure.
*/
int snd_hwdep_new(snd_card_t * card, char *id, int device, snd_hwdep_t ** rhwdep)
int snd_hwdep_new(struct snd_card *card, char *id, int device,
struct snd_hwdep **rhwdep)
{
snd_hwdep_t *hwdep;
struct snd_hwdep *hwdep;
int err;
static snd_device_ops_t ops = {
static struct snd_device_ops ops = {
.dev_free = snd_hwdep_dev_free,
.dev_register = snd_hwdep_dev_register,
.dev_unregister = snd_hwdep_dev_unregister
@ -356,13 +359,14 @@ int snd_hwdep_new(snd_card_t * card, char *id, int device, snd_hwdep_t ** rhwdep
*rhwdep = NULL;
snd_assert(card != NULL, return -ENXIO);
hwdep = kzalloc(sizeof(*hwdep), GFP_KERNEL);
if (hwdep == NULL)
if (hwdep == NULL) {
snd_printk(KERN_ERR "hwdep: cannot allocate\n");
return -ENOMEM;
}
hwdep->card = card;
hwdep->device = device;
if (id) {
if (id)
strlcpy(hwdep->id, id, sizeof(hwdep->id));
}
#ifdef CONFIG_SND_OSSEMUL
hwdep->oss_type = -1;
#endif
@ -376,7 +380,7 @@ int snd_hwdep_new(snd_card_t * card, char *id, int device, snd_hwdep_t ** rhwdep
return 0;
}
static int snd_hwdep_free(snd_hwdep_t *hwdep)
static int snd_hwdep_free(struct snd_hwdep *hwdep)
{
snd_assert(hwdep != NULL, return -ENXIO);
if (hwdep->private_free)
@ -385,32 +389,31 @@ static int snd_hwdep_free(snd_hwdep_t *hwdep)
return 0;
}
static int snd_hwdep_dev_free(snd_device_t *device)
static int snd_hwdep_dev_free(struct snd_device *device)
{
snd_hwdep_t *hwdep = device->device_data;
struct snd_hwdep *hwdep = device->device_data;
return snd_hwdep_free(hwdep);
}
static int snd_hwdep_dev_register(snd_device_t *device)
static int snd_hwdep_dev_register(struct snd_device *device)
{
snd_hwdep_t *hwdep = device->device_data;
int idx, err;
struct snd_hwdep *hwdep = device->device_data;
int err;
char name[32];
down(&register_mutex);
idx = (hwdep->card->number * SNDRV_MINOR_HWDEPS) + hwdep->device;
if (snd_hwdep_devices[idx]) {
if (snd_hwdep_search(hwdep->card, hwdep->device)) {
up(&register_mutex);
return -EBUSY;
}
snd_hwdep_devices[idx] = hwdep;
list_add_tail(&hwdep->list, &snd_hwdep_devices);
sprintf(name, "hwC%iD%i", hwdep->card->number, hwdep->device);
if ((err = snd_register_device(SNDRV_DEVICE_TYPE_HWDEP,
hwdep->card, hwdep->device,
&snd_hwdep_reg, name)) < 0) {
&snd_hwdep_f_ops, hwdep, name)) < 0) {
snd_printk(KERN_ERR "unable to register hardware dependent device %i:%i\n",
hwdep->card->number, hwdep->device);
snd_hwdep_devices[idx] = NULL;
list_del(&hwdep->list);
up(&register_mutex);
return err;
}
@ -422,7 +425,8 @@ static int snd_hwdep_dev_register(snd_device_t *device)
} else {
if (snd_register_oss_device(hwdep->oss_type,
hwdep->card, hwdep->device,
&snd_hwdep_reg, hwdep->oss_dev) < 0) {
&snd_hwdep_f_ops, hwdep,
hwdep->oss_dev) < 0) {
snd_printk(KERN_ERR "unable to register OSS compatibility device %i:%i\n",
hwdep->card->number, hwdep->device);
} else
@ -434,15 +438,13 @@ static int snd_hwdep_dev_register(snd_device_t *device)
return 0;
}
static int snd_hwdep_dev_unregister(snd_device_t *device)
static int snd_hwdep_dev_unregister(struct snd_device *device)
{
snd_hwdep_t *hwdep = device->device_data;
int idx;
struct snd_hwdep *hwdep = device->device_data;
snd_assert(hwdep != NULL, return -ENXIO);
down(&register_mutex);
idx = (hwdep->card->number * SNDRV_MINOR_HWDEPS) + hwdep->device;
if (snd_hwdep_devices[idx] != hwdep) {
if (snd_hwdep_search(hwdep->card, hwdep->device) != hwdep) {
up(&register_mutex);
return -EINVAL;
}
@ -451,47 +453,39 @@ static int snd_hwdep_dev_unregister(snd_device_t *device)
snd_unregister_oss_device(hwdep->oss_type, hwdep->card, hwdep->device);
#endif
snd_unregister_device(SNDRV_DEVICE_TYPE_HWDEP, hwdep->card, hwdep->device);
snd_hwdep_devices[idx] = NULL;
list_del(&hwdep->list);
up(&register_mutex);
return snd_hwdep_free(hwdep);
}
#ifdef CONFIG_PROC_FS
/*
* Info interface
*/
static void snd_hwdep_proc_read(snd_info_entry_t *entry,
snd_info_buffer_t * buffer)
static void snd_hwdep_proc_read(struct snd_info_entry *entry,
struct snd_info_buffer *buffer)
{
int idx;
snd_hwdep_t *hwdep;
struct list_head *p;
struct snd_hwdep *hwdep;
down(&register_mutex);
for (idx = 0; idx < SNDRV_CARDS * SNDRV_MINOR_HWDEPS; idx++) {
hwdep = snd_hwdep_devices[idx];
if (hwdep == NULL)
continue;
list_for_each(p, &snd_hwdep_devices) {
hwdep = list_entry(p, struct snd_hwdep, list);
snd_iprintf(buffer, "%02i-%02i: %s\n",
idx / SNDRV_MINOR_HWDEPS,
idx % SNDRV_MINOR_HWDEPS,
hwdep->name);
hwdep->card->number, hwdep->device, hwdep->name);
}
up(&register_mutex);
}
/*
* ENTRY functions
*/
static struct snd_info_entry *snd_hwdep_proc_entry;
static snd_info_entry_t *snd_hwdep_proc_entry = NULL;
static int __init alsa_hwdep_init(void)
static void __init snd_hwdep_proc_init(void)
{
snd_info_entry_t *entry;
struct snd_info_entry *entry;
memset(snd_hwdep_devices, 0, sizeof(snd_hwdep_devices));
if ((entry = snd_info_create_module_entry(THIS_MODULE, "hwdep", NULL)) != NULL) {
entry->c.text.read_size = 512;
entry->c.text.read_size = PAGE_SIZE;
entry->c.text.read = snd_hwdep_proc_read;
if (snd_info_register(entry) < 0) {
snd_info_free_entry(entry);
@ -499,6 +493,25 @@ static int __init alsa_hwdep_init(void)
}
}
snd_hwdep_proc_entry = entry;
}
static void __exit snd_hwdep_proc_done(void)
{
snd_info_unregister(snd_hwdep_proc_entry);
}
#else /* !CONFIG_PROC_FS */
#define snd_hwdep_proc_init()
#define snd_hwdep_proc_done()
#endif /* CONFIG_PROC_FS */
/*
* ENTRY functions
*/
static int __init alsa_hwdep_init(void)
{
snd_hwdep_proc_init();
snd_ctl_register_ioctl(snd_hwdep_control_ioctl);
snd_ctl_register_ioctl_compat(snd_hwdep_control_ioctl);
return 0;
@ -508,10 +521,7 @@ static void __exit alsa_hwdep_exit(void)
{
snd_ctl_unregister_ioctl(snd_hwdep_control_ioctl);
snd_ctl_unregister_ioctl_compat(snd_hwdep_control_ioctl);
if (snd_hwdep_proc_entry) {
snd_info_unregister(snd_hwdep_proc_entry);
snd_hwdep_proc_entry = NULL;
}
snd_hwdep_proc_done();
}
module_init(alsa_hwdep_init)

View File

@ -22,7 +22,7 @@
#include <linux/compat.h>
struct sndrv_hwdep_dsp_image32 {
struct snd_hwdep_dsp_image32 {
u32 index;
unsigned char name[64];
u32 image; /* pointer */
@ -30,10 +30,10 @@ struct sndrv_hwdep_dsp_image32 {
u32 driver_data;
} /* don't set packed attribute here */;
static int snd_hwdep_dsp_load_compat(snd_hwdep_t *hw,
struct sndrv_hwdep_dsp_image32 __user *src)
static int snd_hwdep_dsp_load_compat(struct snd_hwdep *hw,
struct snd_hwdep_dsp_image32 __user *src)
{
struct sndrv_hwdep_dsp_image *dst;
struct snd_hwdep_dsp_image *dst;
compat_caddr_t ptr;
u32 val;
@ -56,12 +56,13 @@ static int snd_hwdep_dsp_load_compat(snd_hwdep_t *hw,
}
enum {
SNDRV_HWDEP_IOCTL_DSP_LOAD32 = _IOW('H', 0x03, struct sndrv_hwdep_dsp_image32)
SNDRV_HWDEP_IOCTL_DSP_LOAD32 = _IOW('H', 0x03, struct snd_hwdep_dsp_image32)
};
static long snd_hwdep_ioctl_compat(struct file * file, unsigned int cmd, unsigned long arg)
static long snd_hwdep_ioctl_compat(struct file * file, unsigned int cmd,
unsigned long arg)
{
snd_hwdep_t *hw = file->private_data;
struct snd_hwdep *hw = file->private_data;
void __user *argp = compat_ptr(arg);
switch (cmd) {
case SNDRV_HWDEP_IOCTL_PVERSION:

View File

@ -37,6 +37,8 @@
*
*/
#ifdef CONFIG_PROC_FS
int snd_info_check_reserved_words(const char *str)
{
static char *reserved[] =
@ -66,16 +68,14 @@ int snd_info_check_reserved_words(const char *str)
return 1;
}
#ifdef CONFIG_PROC_FS
static DECLARE_MUTEX(info_mutex);
typedef struct _snd_info_private_data {
snd_info_buffer_t *rbuffer;
snd_info_buffer_t *wbuffer;
snd_info_entry_t *entry;
struct snd_info_private_data {
struct snd_info_buffer *rbuffer;
struct snd_info_buffer *wbuffer;
struct snd_info_entry *entry;
void *file_private_data;
} snd_info_private_data_t;
};
static int snd_info_version_init(void);
static int snd_info_version_done(void);
@ -90,7 +90,7 @@ static int snd_info_version_done(void);
*
* Returns the size of output string.
*/
int snd_iprintf(snd_info_buffer_t * buffer, char *fmt,...)
int snd_iprintf(struct snd_info_buffer *buffer, char *fmt,...)
{
va_list args;
int len, res;
@ -115,9 +115,9 @@ int snd_iprintf(snd_info_buffer_t * buffer, char *fmt,...)
*/
static struct proc_dir_entry *snd_proc_root = NULL;
snd_info_entry_t *snd_seq_root = NULL;
struct snd_info_entry *snd_seq_root = NULL;
#ifdef CONFIG_SND_OSSEMUL
snd_info_entry_t *snd_oss_root = NULL;
struct snd_info_entry *snd_oss_root = NULL;
#endif
static inline void snd_info_entry_prepare(struct proc_dir_entry *de)
@ -134,7 +134,7 @@ static void snd_remove_proc_entry(struct proc_dir_entry *parent,
static loff_t snd_info_entry_llseek(struct file *file, loff_t offset, int orig)
{
snd_info_private_data_t *data;
struct snd_info_private_data *data;
struct snd_info_entry *entry;
loff_t ret;
@ -176,9 +176,9 @@ static loff_t snd_info_entry_llseek(struct file *file, loff_t offset, int orig)
static ssize_t snd_info_entry_read(struct file *file, char __user *buffer,
size_t count, loff_t * offset)
{
snd_info_private_data_t *data;
struct snd_info_private_data *data;
struct snd_info_entry *entry;
snd_info_buffer_t *buf;
struct snd_info_buffer *buf;
size_t size = 0;
loff_t pos;
@ -217,9 +217,9 @@ static ssize_t snd_info_entry_read(struct file *file, char __user *buffer,
static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer,
size_t count, loff_t * offset)
{
snd_info_private_data_t *data;
struct snd_info_private_data *data;
struct snd_info_entry *entry;
snd_info_buffer_t *buf;
struct snd_info_buffer *buf;
size_t size = 0;
loff_t pos;
@ -259,15 +259,15 @@ static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer
static int snd_info_entry_open(struct inode *inode, struct file *file)
{
snd_info_entry_t *entry;
snd_info_private_data_t *data;
snd_info_buffer_t *buffer;
struct snd_info_entry *entry;
struct snd_info_private_data *data;
struct snd_info_buffer *buffer;
struct proc_dir_entry *p;
int mode, err;
down(&info_mutex);
p = PDE(inode);
entry = p == NULL ? NULL : (snd_info_entry_t *)p->data;
entry = p == NULL ? NULL : (struct snd_info_entry *)p->data;
if (entry == NULL || entry->disconnected) {
up(&info_mutex);
return -ENODEV;
@ -381,8 +381,8 @@ static int snd_info_entry_open(struct inode *inode, struct file *file)
static int snd_info_entry_release(struct inode *inode, struct file *file)
{
snd_info_entry_t *entry;
snd_info_private_data_t *data;
struct snd_info_entry *entry;
struct snd_info_private_data *data;
int mode;
mode = file->f_flags & O_ACCMODE;
@ -420,7 +420,7 @@ static int snd_info_entry_release(struct inode *inode, struct file *file)
static unsigned int snd_info_entry_poll(struct file *file, poll_table * wait)
{
snd_info_private_data_t *data;
struct snd_info_private_data *data;
struct snd_info_entry *entry;
unsigned int mask;
@ -447,7 +447,7 @@ static unsigned int snd_info_entry_poll(struct file *file, poll_table * wait)
static inline int _snd_info_entry_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
snd_info_private_data_t *data;
struct snd_info_private_data *data;
struct snd_info_entry *entry;
data = file->private_data;
@ -479,7 +479,7 @@ static int snd_info_entry_ioctl(struct inode *inode, struct file *file,
static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)
{
struct inode *inode = file->f_dentry->d_inode;
snd_info_private_data_t *data;
struct snd_info_private_data *data;
struct snd_info_entry *entry;
data = file->private_data;
@ -541,7 +541,7 @@ int __init snd_info_init(void)
snd_proc_root = p;
#ifdef CONFIG_SND_OSSEMUL
{
snd_info_entry_t *entry;
struct snd_info_entry *entry;
if ((entry = snd_info_create_module_entry(THIS_MODULE, "oss", NULL)) == NULL)
return -ENOMEM;
entry->mode = S_IFDIR | S_IRUGO | S_IXUGO;
@ -554,7 +554,7 @@ int __init snd_info_init(void)
#endif
#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
{
snd_info_entry_t *entry;
struct snd_info_entry *entry;
if ((entry = snd_info_create_module_entry(THIS_MODULE, "seq", NULL)) == NULL)
return -ENOMEM;
entry->mode = S_IFDIR | S_IRUGO | S_IXUGO;
@ -580,12 +580,10 @@ int __exit snd_info_done(void)
snd_info_version_done();
if (snd_proc_root) {
#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
if (snd_seq_root)
snd_info_unregister(snd_seq_root);
snd_info_unregister(snd_seq_root);
#endif
#ifdef CONFIG_SND_OSSEMUL
if (snd_oss_root)
snd_info_unregister(snd_oss_root);
snd_info_unregister(snd_oss_root);
#endif
snd_remove_proc_entry(&proc_root, snd_proc_root);
}
@ -601,10 +599,10 @@ int __exit snd_info_done(void)
* create a card proc file
* called from init.c
*/
int snd_info_card_create(snd_card_t * card)
int snd_info_card_create(struct snd_card *card)
{
char str[8];
snd_info_entry_t *entry;
struct snd_info_entry *entry;
snd_assert(card != NULL, return -ENXIO);
@ -624,7 +622,7 @@ int snd_info_card_create(snd_card_t * card)
* register the card proc file
* called from init.c
*/
int snd_info_card_register(snd_card_t * card)
int snd_info_card_register(struct snd_card *card)
{
struct proc_dir_entry *p;
@ -644,7 +642,7 @@ int snd_info_card_register(snd_card_t * card)
* de-register the card proc file
* called from init.c
*/
int snd_info_card_free(snd_card_t * card)
int snd_info_card_free(struct snd_card *card)
{
snd_assert(card != NULL, return -ENXIO);
if (card->proc_root_link) {
@ -669,7 +667,7 @@ int snd_info_card_free(snd_card_t * card)
*
* Returns zero if successful, or 1 if error or EOF.
*/
int snd_info_get_line(snd_info_buffer_t * buffer, char *line, int len)
int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len)
{
int c = -1;
@ -747,9 +745,9 @@ char *snd_info_get_str(char *dest, char *src, int len)
*
* Returns the pointer of the new instance, or NULL on failure.
*/
static snd_info_entry_t *snd_info_create_entry(const char *name)
static struct snd_info_entry *snd_info_create_entry(const char *name)
{
snd_info_entry_t *entry;
struct snd_info_entry *entry;
entry = kzalloc(sizeof(*entry), GFP_KERNEL);
if (entry == NULL)
return NULL;
@ -774,11 +772,11 @@ static snd_info_entry_t *snd_info_create_entry(const char *name)
*
* Returns the pointer of the new instance, or NULL on failure.
*/
snd_info_entry_t *snd_info_create_module_entry(struct module * module,
struct snd_info_entry *snd_info_create_module_entry(struct module * module,
const char *name,
snd_info_entry_t *parent)
struct snd_info_entry *parent)
{
snd_info_entry_t *entry = snd_info_create_entry(name);
struct snd_info_entry *entry = snd_info_create_entry(name);
if (entry) {
entry->module = module;
entry->parent = parent;
@ -796,11 +794,11 @@ snd_info_entry_t *snd_info_create_module_entry(struct module * module,
*
* Returns the pointer of the new instance, or NULL on failure.
*/
snd_info_entry_t *snd_info_create_card_entry(snd_card_t * card,
struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card,
const char *name,
snd_info_entry_t * parent)
struct snd_info_entry * parent)
{
snd_info_entry_t *entry = snd_info_create_entry(name);
struct snd_info_entry *entry = snd_info_create_entry(name);
if (entry) {
entry->module = card->module;
entry->card = card;
@ -809,29 +807,29 @@ snd_info_entry_t *snd_info_create_card_entry(snd_card_t * card,
return entry;
}
static int snd_info_dev_free_entry(snd_device_t *device)
static int snd_info_dev_free_entry(struct snd_device *device)
{
snd_info_entry_t *entry = device->device_data;
struct snd_info_entry *entry = device->device_data;
snd_info_free_entry(entry);
return 0;
}
static int snd_info_dev_register_entry(snd_device_t *device)
static int snd_info_dev_register_entry(struct snd_device *device)
{
snd_info_entry_t *entry = device->device_data;
struct snd_info_entry *entry = device->device_data;
return snd_info_register(entry);
}
static int snd_info_dev_disconnect_entry(snd_device_t *device)
static int snd_info_dev_disconnect_entry(struct snd_device *device)
{
snd_info_entry_t *entry = device->device_data;
struct snd_info_entry *entry = device->device_data;
entry->disconnected = 1;
return 0;
}
static int snd_info_dev_unregister_entry(snd_device_t *device)
static int snd_info_dev_unregister_entry(struct snd_device *device)
{
snd_info_entry_t *entry = device->device_data;
struct snd_info_entry *entry = device->device_data;
return snd_info_unregister(entry);
}
@ -855,16 +853,16 @@ static int snd_info_dev_unregister_entry(snd_device_t *device)
*
* Returns zero if successful, or a negative error code on failure.
*/
int snd_card_proc_new(snd_card_t *card, const char *name,
snd_info_entry_t **entryp)
int snd_card_proc_new(struct snd_card *card, const char *name,
struct snd_info_entry **entryp)
{
static snd_device_ops_t ops = {
static struct snd_device_ops ops = {
.dev_free = snd_info_dev_free_entry,
.dev_register = snd_info_dev_register_entry,
.dev_disconnect = snd_info_dev_disconnect_entry,
.dev_unregister = snd_info_dev_unregister_entry
};
snd_info_entry_t *entry;
struct snd_info_entry *entry;
int err;
entry = snd_info_create_card_entry(card, name, card->proc_root);
@ -885,7 +883,7 @@ int snd_card_proc_new(snd_card_t *card, const char *name,
*
* Releases the info entry. Don't call this after registered.
*/
void snd_info_free_entry(snd_info_entry_t * entry)
void snd_info_free_entry(struct snd_info_entry * entry)
{
if (entry == NULL)
return;
@ -903,7 +901,7 @@ void snd_info_free_entry(snd_info_entry_t * entry)
*
* Returns zero if successful, or a negative error code on failure.
*/
int snd_info_register(snd_info_entry_t * entry)
int snd_info_register(struct snd_info_entry * entry)
{
struct proc_dir_entry *root, *p = NULL;
@ -933,11 +931,12 @@ int snd_info_register(snd_info_entry_t * entry)
*
* Returns zero if successful, or a negative error code on failure.
*/
int snd_info_unregister(snd_info_entry_t * entry)
int snd_info_unregister(struct snd_info_entry * entry)
{
struct proc_dir_entry *root;
snd_assert(entry != NULL, return -ENXIO);
if (! entry)
return 0;
snd_assert(entry->p != NULL, return -ENXIO);
root = entry->parent == NULL ? snd_proc_root : entry->parent->p;
snd_assert(root, return -ENXIO);
@ -952,9 +951,9 @@ int snd_info_unregister(snd_info_entry_t * entry)
*/
static snd_info_entry_t *snd_info_version_entry = NULL;
static struct snd_info_entry *snd_info_version_entry = NULL;
static void snd_info_version_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer)
static void snd_info_version_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
{
snd_iprintf(buffer,
"Advanced Linux Sound Architecture Driver Version "
@ -964,7 +963,7 @@ static void snd_info_version_read(snd_info_entry_t *entry, snd_info_buffer_t * b
static int __init snd_info_version_init(void)
{
snd_info_entry_t *entry;
struct snd_info_entry *entry;
entry = snd_info_create_module_entry(THIS_MODULE, "version", NULL);
if (entry == NULL)

View File

@ -37,7 +37,7 @@
static DECLARE_MUTEX(strings);
static char *snd_sndstat_strings[SNDRV_CARDS][SNDRV_OSS_INFO_DEV_COUNT];
static snd_info_entry_t *snd_sndstat_proc_entry;
static struct snd_info_entry *snd_sndstat_proc_entry;
int snd_oss_info_register(int dev, int num, char *string)
{
@ -63,9 +63,9 @@ int snd_oss_info_register(int dev, int num, char *string)
return 0;
}
extern void snd_card_info_read_oss(snd_info_buffer_t * buffer);
extern void snd_card_info_read_oss(struct snd_info_buffer *buffer);
static int snd_sndstat_show_strings(snd_info_buffer_t * buf, char *id, int dev)
static int snd_sndstat_show_strings(struct snd_info_buffer *buf, char *id, int dev)
{
int idx, ok = -1;
char *str;
@ -88,7 +88,8 @@ static int snd_sndstat_show_strings(snd_info_buffer_t * buf, char *id, int dev)
return ok;
}
static void snd_sndstat_proc_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer)
static void snd_sndstat_proc_read(struct snd_info_entry *entry,
struct snd_info_buffer *buffer)
{
snd_iprintf(buffer, "Sound Driver:3.8.1a-980706 (ALSA v" CONFIG_SND_VERSION " emulation code)\n");
snd_iprintf(buffer, "Kernel: %s %s %s %s %s\n",
@ -111,7 +112,7 @@ static void snd_sndstat_proc_read(snd_info_entry_t *entry, snd_info_buffer_t * b
int snd_info_minor_register(void)
{
snd_info_entry_t *entry;
struct snd_info_entry *entry;
memset(snd_sndstat_strings, 0, sizeof(snd_sndstat_strings));
if ((entry = snd_info_create_module_entry(THIS_MODULE, "sndstat", snd_oss_root)) != NULL) {

View File

@ -28,7 +28,6 @@
#include <linux/ctype.h>
#include <linux/pci.h>
#include <linux/pm.h>
#include <linux/platform_device.h>
#include <sound/core.h>
#include <sound/control.h>
@ -40,18 +39,46 @@ struct snd_shutdown_f_ops {
};
unsigned int snd_cards_lock = 0; /* locked for registering/using */
snd_card_t *snd_cards[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = NULL};
struct snd_card *snd_cards[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = NULL};
DEFINE_RWLOCK(snd_card_rwlock);
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
int (*snd_mixer_oss_notify_callback)(snd_card_t *card, int free_flag);
int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
#endif
static void snd_card_id_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer)
#ifdef CONFIG_PROC_FS
static void snd_card_id_read(struct snd_info_entry *entry,
struct snd_info_buffer *buffer)
{
snd_iprintf(buffer, "%s\n", entry->card->id);
}
static inline int init_info_for_card(struct snd_card *card)
{
int err;
struct snd_info_entry *entry;
if ((err = snd_info_card_register(card)) < 0) {
snd_printd("unable to create card info\n");
return err;
}
if ((entry = snd_info_create_card_entry(card, "id", card->proc_root)) == NULL) {
snd_printd("unable to create card entry\n");
return err;
}
entry->c.text.read_size = PAGE_SIZE;
entry->c.text.read = snd_card_id_read;
if (snd_info_register(entry) < 0) {
snd_info_free_entry(entry);
entry = NULL;
}
card->proc_id = entry;
return 0;
}
#else /* !CONFIG_PROC_FS */
#define init_info_for_card(card)
#endif
static void snd_card_free_thread(void * __card);
/**
@ -63,13 +90,13 @@ static void snd_card_free_thread(void * __card);
*
* Creates and initializes a soundcard structure.
*
* Returns kmallocated snd_card_t structure. Creates the ALSA control interface
* Returns kmallocated snd_card structure. Creates the ALSA control interface
* (which is blocked until snd_card_register function is called).
*/
snd_card_t *snd_card_new(int idx, const char *xid,
struct snd_card *snd_card_new(int idx, const char *xid,
struct module *module, int extra_size)
{
snd_card_t *card;
struct snd_card *card;
int err;
if (extra_size < 0)
@ -132,7 +159,7 @@ snd_card_t *snd_card_new(int idx, const char *xid,
goto __error_ctl;
}
if (extra_size > 0)
card->private_data = (char *)card + sizeof(snd_card_t);
card->private_data = (char *)card + sizeof(struct snd_card);
return card;
__error_ctl:
@ -158,7 +185,7 @@ static unsigned int snd_disconnect_poll(struct file * file, poll_table * wait)
* Note: The current implementation replaces all active file->f_op with special
* dummy file operations (they do nothing except release).
*/
int snd_card_disconnect(snd_card_t * card)
int snd_card_disconnect(struct snd_card *card)
{
struct snd_monitor_file *mfile;
struct file *file;
@ -228,12 +255,6 @@ int snd_card_disconnect(snd_card_t * card)
return 0;
}
#ifdef CONFIG_SND_GENERIC_DRIVER
static void snd_generic_device_unregister(snd_card_t *card);
#else
#define snd_generic_device_unregister(x) /*NOP*/
#endif
/**
* snd_card_free - frees given soundcard structure
* @card: soundcard structure
@ -245,7 +266,7 @@ static void snd_generic_device_unregister(snd_card_t *card);
* Returns zero. Frees all associated devices and frees the control
* interface associated to given soundcard.
*/
int snd_card_free(snd_card_t * card)
int snd_card_free(struct snd_card *card)
{
struct snd_shutdown_f_ops *s_f_ops;
@ -279,13 +300,11 @@ int snd_card_free(snd_card_t * card)
}
if (card->private_free)
card->private_free(card);
if (card->proc_id)
snd_info_unregister(card->proc_id);
snd_info_unregister(card->proc_id);
if (snd_info_card_free(card) < 0) {
snd_printk(KERN_WARNING "unable to free card info\n");
/* Not fatal error */
}
snd_generic_device_unregister(card);
while (card->s_f_ops) {
s_f_ops = card->s_f_ops;
card->s_f_ops = s_f_ops->next;
@ -300,7 +319,7 @@ int snd_card_free(snd_card_t * card)
static void snd_card_free_thread(void * __card)
{
snd_card_t *card = __card;
struct snd_card *card = __card;
struct module * module = card->module;
if (!try_module_get(module)) {
@ -327,7 +346,7 @@ static void snd_card_free_thread(void * __card)
*
* Returns - zero otherwise a negative error code if the start of thread failed.
*/
int snd_card_free_in_thread(snd_card_t * card)
int snd_card_free_in_thread(struct snd_card *card)
{
if (card->files == NULL) {
snd_card_free(card);
@ -343,9 +362,9 @@ int snd_card_free_in_thread(snd_card_t * card)
return -EFAULT;
}
static void choose_default_id(snd_card_t * card)
static void choose_default_id(struct snd_card *card)
{
int i, len, idx_flag = 0, loops = 8;
int i, len, idx_flag = 0, loops = SNDRV_CARDS;
char *id, *spos;
id = spos = card->shortname;
@ -387,9 +406,12 @@ static void choose_default_id(snd_card_t * card)
__change:
len = strlen(id);
if (idx_flag)
id[len-1]++;
else if ((size_t)len <= sizeof(card->id) - 3) {
if (idx_flag) {
if (id[len-1] != '9')
id[len-1]++;
else
id[len-1] = 'A';
} else if ((size_t)len <= sizeof(card->id) - 3) {
strcat(id, "_1");
idx_flag++;
} else {
@ -415,10 +437,9 @@ static void choose_default_id(snd_card_t * card)
*
* Returns zero otherwise a negative error code if the registrain failed.
*/
int snd_card_register(snd_card_t * card)
int snd_card_register(struct snd_card *card)
{
int err;
snd_info_entry_t *entry;
snd_assert(card != NULL, return -EINVAL);
if ((err = snd_device_register_all(card)) < 0)
@ -433,22 +454,7 @@ int snd_card_register(snd_card_t * card)
choose_default_id(card);
snd_cards[card->number] = card;
write_unlock(&snd_card_rwlock);
if ((err = snd_info_card_register(card)) < 0) {
snd_printd("unable to create card info\n");
goto __skip_info;
}
if ((entry = snd_info_create_card_entry(card, "id", card->proc_root)) == NULL) {
snd_printd("unable to create card entry\n");
goto __skip_info;
}
entry->c.text.read_size = PAGE_SIZE;
entry->c.text.read = snd_card_id_read;
if (snd_info_register(entry) < 0) {
snd_info_free_entry(entry);
entry = NULL;
}
card->proc_id = entry;
__skip_info:
init_info_for_card(card);
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
if (snd_mixer_oss_notify_callback)
snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER);
@ -456,23 +462,25 @@ int snd_card_register(snd_card_t * card)
return 0;
}
static snd_info_entry_t *snd_card_info_entry = NULL;
#ifdef CONFIG_PROC_FS
static struct snd_info_entry *snd_card_info_entry = NULL;
static void snd_card_info_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer)
static void snd_card_info_read(struct snd_info_entry *entry,
struct snd_info_buffer *buffer)
{
int idx, count;
snd_card_t *card;
struct snd_card *card;
for (idx = count = 0; idx < SNDRV_CARDS; idx++) {
read_lock(&snd_card_rwlock);
if ((card = snd_cards[idx]) != NULL) {
count++;
snd_iprintf(buffer, "%i [%-15s]: %s - %s\n",
snd_iprintf(buffer, "%2i [%-15s]: %s - %s\n",
idx,
card->id,
card->driver,
card->shortname);
snd_iprintf(buffer, " %s\n",
snd_iprintf(buffer, " %s\n",
card->longname);
}
read_unlock(&snd_card_rwlock);
@ -481,12 +489,12 @@ static void snd_card_info_read(snd_info_entry_t *entry, snd_info_buffer_t * buff
snd_iprintf(buffer, "--- no soundcards ---\n");
}
#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_PROC_FS)
#ifdef CONFIG_SND_OSSEMUL
void snd_card_info_read_oss(snd_info_buffer_t * buffer)
void snd_card_info_read_oss(struct snd_info_buffer *buffer)
{
int idx, count;
snd_card_t *card;
struct snd_card *card;
for (idx = count = 0; idx < SNDRV_CARDS; idx++) {
read_lock(&snd_card_rwlock);
@ -504,16 +512,18 @@ void snd_card_info_read_oss(snd_info_buffer_t * buffer)
#endif
#ifdef MODULE
static snd_info_entry_t *snd_card_module_info_entry;
static void snd_card_module_info_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer)
static struct snd_info_entry *snd_card_module_info_entry;
static void snd_card_module_info_read(struct snd_info_entry *entry,
struct snd_info_buffer *buffer)
{
int idx;
snd_card_t *card;
struct snd_card *card;
for (idx = 0; idx < SNDRV_CARDS; idx++) {
read_lock(&snd_card_rwlock);
if ((card = snd_cards[idx]) != NULL)
snd_iprintf(buffer, "%i %s\n", idx, card->module->name);
snd_iprintf(buffer, "%2i %s\n",
idx, card->module->name);
read_unlock(&snd_card_rwlock);
}
}
@ -521,7 +531,7 @@ static void snd_card_module_info_read(snd_info_entry_t *entry, snd_info_buffer_t
int __init snd_card_info_init(void)
{
snd_info_entry_t *entry;
struct snd_info_entry *entry;
entry = snd_info_create_module_entry(THIS_MODULE, "cards", NULL);
if (! entry)
@ -551,15 +561,15 @@ int __init snd_card_info_init(void)
int __exit snd_card_info_done(void)
{
if (snd_card_info_entry)
snd_info_unregister(snd_card_info_entry);
snd_info_unregister(snd_card_info_entry);
#ifdef MODULE
if (snd_card_module_info_entry)
snd_info_unregister(snd_card_module_info_entry);
snd_info_unregister(snd_card_module_info_entry);
#endif
return 0;
}
#endif /* CONFIG_PROC_FS */
/**
* snd_component_add - add a component string
* @card: soundcard structure
@ -571,7 +581,7 @@ int __exit snd_card_info_done(void)
* Returns zero otherwise a negative error code.
*/
int snd_component_add(snd_card_t *card, const char *component)
int snd_component_add(struct snd_card *card, const char *component)
{
char *ptr;
int len = strlen(component);
@ -602,7 +612,7 @@ int snd_component_add(snd_card_t *card, const char *component)
*
* Returns zero or a negative error code.
*/
int snd_card_file_add(snd_card_t *card, struct file *file)
int snd_card_file_add(struct snd_card *card, struct file *file)
{
struct snd_monitor_file *mfile;
@ -636,7 +646,7 @@ int snd_card_file_add(snd_card_t *card, struct file *file)
*
* Returns zero or a negative error code.
*/
int snd_card_file_remove(snd_card_t *card, struct file *file)
int snd_card_file_remove(struct snd_card *card, struct file *file)
{
struct snd_monitor_file *mfile, *pfile = NULL;
@ -664,97 +674,6 @@ int snd_card_file_remove(snd_card_t *card, struct file *file)
return 0;
}
#ifdef CONFIG_SND_GENERIC_DRIVER
/*
* generic device without a proper bus using platform_device
* (e.g. ISA)
*/
struct snd_generic_device {
struct platform_device pdev;
snd_card_t *card;
};
#define get_snd_generic_card(dev) container_of(dev, struct snd_generic_device, pdev)->card
#define SND_GENERIC_NAME "snd_generic"
#ifdef CONFIG_PM
static int snd_generic_suspend(struct platform_device *dev, pm_message_t state);
static int snd_generic_resume(struct platform_device *dev);
#endif
/* initialized in sound.c */
struct platform_driver snd_generic_driver = {
#ifdef CONFIG_PM
.suspend = snd_generic_suspend,
.resume = snd_generic_resume,
#endif
.driver = {
.name = SND_GENERIC_NAME,
},
};
void snd_generic_device_release(struct device *dev)
{
}
static int snd_generic_device_register(snd_card_t *card)
{
struct snd_generic_device *dev;
int err;
if (card->generic_dev)
return 0; /* already registered */
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (! dev) {
snd_printk(KERN_ERR "can't allocate generic_device\n");
return -ENOMEM;
}
dev->pdev.name = SND_GENERIC_NAME;
dev->pdev.id = card->number;
dev->pdev.dev.release = snd_generic_device_release;
dev->card = card;
if ((err = platform_device_register(&dev->pdev)) < 0) {
kfree(dev);
return err;
}
card->generic_dev = dev;
return 0;
}
static void snd_generic_device_unregister(snd_card_t *card)
{
struct snd_generic_device *dev = card->generic_dev;
if (dev) {
platform_device_unregister(&dev->pdev);
kfree(dev);
card->generic_dev = NULL;
}
}
/**
* snd_card_set_generic_dev - assign the generic device to the card
* @card: soundcard structure
*
* Assigns a generic device to the card. This function is provided as the
* last resort, for devices without any proper bus. Thus this won't override
* the device already assigned to the card.
*
* Returns zero if successful, or a negative error code.
*/
int snd_card_set_generic_dev(snd_card_t *card)
{
int err;
if ((err = snd_generic_device_register(card)) < 0)
return err;
if (! card->dev)
snd_card_set_dev(card, &card->generic_dev->pdev.dev);
return 0;
}
#endif /* CONFIG_SND_GENERIC_DRIVER */
#ifdef CONFIG_PM
/**
* snd_power_wait - wait until the power-state is changed.
@ -766,7 +685,7 @@ int snd_card_set_generic_dev(snd_card_t *card)
*
* Note: the power lock must be active before call.
*/
int snd_power_wait(snd_card_t *card, unsigned int power_state, struct file *file)
int snd_power_wait(struct snd_card *card, unsigned int power_state, struct file *file)
{
wait_queue_t wait;
int result = 0;
@ -798,107 +717,4 @@ int snd_power_wait(snd_card_t *card, unsigned int power_state, struct file *file
return result;
}
/**
* snd_card_set_pm_callback - set the PCI power-management callbacks
* @card: soundcard structure
* @suspend: suspend callback function
* @resume: resume callback function
* @private_data: private data to pass to the callback functions
*
* Sets the power-management callback functions of the card.
* These callbacks are called from ALSA's common PCI suspend/resume
* handler and from the control API.
*/
int snd_card_set_pm_callback(snd_card_t *card,
int (*suspend)(snd_card_t *, pm_message_t),
int (*resume)(snd_card_t *),
void *private_data)
{
card->pm_suspend = suspend;
card->pm_resume = resume;
card->pm_private_data = private_data;
return 0;
}
#ifdef CONFIG_SND_GENERIC_DRIVER
/* suspend/resume callbacks for snd_generic platform device */
static int snd_generic_suspend(struct platform_device *dev, pm_message_t state)
{
snd_card_t *card;
card = get_snd_generic_card(dev);
if (card->power_state == SNDRV_CTL_POWER_D3hot)
return 0;
if (card->pm_suspend)
card->pm_suspend(card, PMSG_SUSPEND);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
return 0;
}
static int snd_generic_resume(struct platform_device *dev)
{
snd_card_t *card;
card = get_snd_generic_card(dev);
if (card->power_state == SNDRV_CTL_POWER_D0)
return 0;
if (card->pm_resume)
card->pm_resume(card);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}
/**
* snd_card_set_generic_pm_callback - set the generic power-management callbacks
* @card: soundcard structure
* @suspend: suspend callback function
* @resume: resume callback function
* @private_data: private data to pass to the callback functions
*
* Registers the power-management and sets the lowlevel callbacks for
* the given card. These callbacks are called from the ALSA's common
* PM handler and from the control API.
*/
int snd_card_set_generic_pm_callback(snd_card_t *card,
int (*suspend)(snd_card_t *, pm_message_t),
int (*resume)(snd_card_t *),
void *private_data)
{
int err;
if ((err = snd_generic_device_register(card)) < 0)
return err;
return snd_card_set_pm_callback(card, suspend, resume, private_data);
}
#endif /* CONFIG_SND_GENERIC_DRIVER */
#ifdef CONFIG_PCI
int snd_card_pci_suspend(struct pci_dev *dev, pm_message_t state)
{
snd_card_t *card = pci_get_drvdata(dev);
int err;
if (! card || ! card->pm_suspend)
return 0;
if (card->power_state == SNDRV_CTL_POWER_D3hot)
return 0;
err = card->pm_suspend(card, PMSG_SUSPEND);
pci_save_state(dev);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
return err;
}
int snd_card_pci_resume(struct pci_dev *dev)
{
snd_card_t *card = pci_get_drvdata(dev);
if (! card || ! card->pm_resume)
return 0;
if (card->power_state == SNDRV_CTL_POWER_D0)
return 0;
/* restore the PCI config space */
pci_restore_state(dev);
card->pm_resume(card);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}
#endif
#endif /* CONFIG_PM */

View File

@ -43,10 +43,6 @@ MODULE_DESCRIPTION("Memory allocator for ALSA system.");
MODULE_LICENSE("GPL");
#ifndef SNDRV_CARDS
#define SNDRV_CARDS 8
#endif
/*
*/

View File

@ -25,9 +25,9 @@
#include <sound/pcm.h>
#include "pcm_plugin.h"
static snd_pcm_sframes_t copy_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_channel_t *src_channels,
snd_pcm_plugin_channel_t *dst_channels,
static snd_pcm_sframes_t copy_transfer(struct snd_pcm_plugin *plugin,
const struct snd_pcm_plugin_channel *src_channels,
struct snd_pcm_plugin_channel *dst_channels,
snd_pcm_uframes_t frames)
{
unsigned int channel;
@ -58,13 +58,13 @@ static snd_pcm_sframes_t copy_transfer(snd_pcm_plugin_t *plugin,
return frames;
}
int snd_pcm_plugin_build_copy(snd_pcm_plug_t *plug,
snd_pcm_plugin_format_t *src_format,
snd_pcm_plugin_format_t *dst_format,
snd_pcm_plugin_t **r_plugin)
int snd_pcm_plugin_build_copy(struct snd_pcm_substream *plug,
struct snd_pcm_plugin_format *src_format,
struct snd_pcm_plugin_format *dst_format,
struct snd_pcm_plugin **r_plugin)
{
int err;
snd_pcm_plugin_t *plugin;
struct snd_pcm_plugin *plugin;
int width;
snd_assert(r_plugin != NULL, return -ENXIO);

Some files were not shown because too many files have changed in this diff Show More