Creation of Cybook 2416 (actually Gen4) repository
This commit is contained in:
10
include/sound/Kbuild
Normal file
10
include/sound/Kbuild
Normal file
@@ -0,0 +1,10 @@
|
||||
header-y += asound_fm.h
|
||||
header-y += hdsp.h
|
||||
header-y += hdspm.h
|
||||
header-y += sfnt_info.h
|
||||
header-y += sscape_ioctl.h
|
||||
|
||||
unifdef-y += asequencer.h
|
||||
unifdef-y += asound.h
|
||||
unifdef-y += emu10k1.h
|
||||
unifdef-y += sb16_csp.h
|
||||
641
include/sound/ac97_codec.h
Normal file
641
include/sound/ac97_codec.h
Normal file
@@ -0,0 +1,641 @@
|
||||
#ifndef __SOUND_AC97_CODEC_H
|
||||
#define __SOUND_AC97_CODEC_H
|
||||
|
||||
/*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
* Universal interface for Audio Codec '97
|
||||
*
|
||||
* For more details look to AC '97 component specification revision 2.1
|
||||
* by Intel Corporation (http://developer.intel.com).
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include "pcm.h"
|
||||
#include "control.h"
|
||||
#include "info.h"
|
||||
|
||||
/*
|
||||
* AC'97 codec registers
|
||||
*/
|
||||
|
||||
#define AC97_RESET 0x00 /* Reset */
|
||||
#define AC97_MASTER 0x02 /* Master Volume */
|
||||
#define AC97_HEADPHONE 0x04 /* Headphone Volume (optional) */
|
||||
#define AC97_MASTER_MONO 0x06 /* Master Volume Mono (optional) */
|
||||
#define AC97_MASTER_TONE 0x08 /* Master Tone (Bass & Treble) (optional) */
|
||||
#define AC97_PC_BEEP 0x0a /* PC Beep Volume (optinal) */
|
||||
#define AC97_PHONE 0x0c /* Phone Volume (optional) */
|
||||
#define AC97_MIC 0x0e /* MIC Volume */
|
||||
#define AC97_LINE 0x10 /* Line In Volume */
|
||||
#define AC97_CD 0x12 /* CD Volume */
|
||||
#define AC97_VIDEO 0x14 /* Video Volume (optional) */
|
||||
#define AC97_AUX 0x16 /* AUX Volume (optional) */
|
||||
#define AC97_PCM 0x18 /* PCM Volume */
|
||||
#define AC97_REC_SEL 0x1a /* Record Select */
|
||||
#define AC97_REC_GAIN 0x1c /* Record Gain */
|
||||
#define AC97_REC_GAIN_MIC 0x1e /* Record Gain MIC (optional) */
|
||||
#define AC97_GENERAL_PURPOSE 0x20 /* General Purpose (optional) */
|
||||
#define AC97_3D_CONTROL 0x22 /* 3D Control (optional) */
|
||||
#define AC97_INT_PAGING 0x24 /* Audio Interrupt & Paging (AC'97 2.3) */
|
||||
#define AC97_POWERDOWN 0x26 /* Powerdown control / status */
|
||||
/* range 0x28-0x3a - AUDIO AC'97 2.0 extensions */
|
||||
#define AC97_EXTENDED_ID 0x28 /* Extended Audio ID */
|
||||
#define AC97_EXTENDED_STATUS 0x2a /* Extended Audio Status and Control */
|
||||
#define AC97_PCM_FRONT_DAC_RATE 0x2c /* PCM Front DAC Rate */
|
||||
#define AC97_PCM_SURR_DAC_RATE 0x2e /* PCM Surround DAC Rate */
|
||||
#define AC97_PCM_LFE_DAC_RATE 0x30 /* PCM LFE DAC Rate */
|
||||
#define AC97_PCM_LR_ADC_RATE 0x32 /* PCM LR ADC Rate */
|
||||
#define AC97_PCM_MIC_ADC_RATE 0x34 /* PCM MIC ADC Rate */
|
||||
#define AC97_CENTER_LFE_MASTER 0x36 /* Center + LFE Master Volume */
|
||||
#define AC97_SURROUND_MASTER 0x38 /* Surround (Rear) Master Volume */
|
||||
#define AC97_SPDIF 0x3a /* S/PDIF control */
|
||||
/* range 0x3c-0x58 - MODEM */
|
||||
#define AC97_EXTENDED_MID 0x3c /* Extended Modem ID */
|
||||
#define AC97_EXTENDED_MSTATUS 0x3e /* Extended Modem Status and Control */
|
||||
#define AC97_LINE1_RATE 0x40 /* Line1 DAC/ADC Rate */
|
||||
#define AC97_LINE2_RATE 0x42 /* Line2 DAC/ADC Rate */
|
||||
#define AC97_HANDSET_RATE 0x44 /* Handset DAC/ADC Rate */
|
||||
#define AC97_LINE1_LEVEL 0x46 /* Line1 DAC/ADC Level */
|
||||
#define AC97_LINE2_LEVEL 0x48 /* Line2 DAC/ADC Level */
|
||||
#define AC97_HANDSET_LEVEL 0x4a /* Handset DAC/ADC Level */
|
||||
#define AC97_GPIO_CFG 0x4c /* GPIO Configuration */
|
||||
#define AC97_GPIO_POLARITY 0x4e /* GPIO Pin Polarity/Type, 0=low, 1=high active */
|
||||
#define AC97_GPIO_STICKY 0x50 /* GPIO Pin Sticky, 0=not, 1=sticky */
|
||||
#define AC97_GPIO_WAKEUP 0x52 /* GPIO Pin Wakeup, 0=no int, 1=yes int */
|
||||
#define AC97_GPIO_STATUS 0x54 /* GPIO Pin Status, slot 12 */
|
||||
#define AC97_MISC_AFE 0x56 /* Miscellaneous Modem AFE Status and Control */
|
||||
/* range 0x5a-0x7b - Vendor Specific */
|
||||
#define AC97_VENDOR_ID1 0x7c /* Vendor ID1 */
|
||||
#define AC97_VENDOR_ID2 0x7e /* Vendor ID2 / revision */
|
||||
/* range 0x60-0x6f (page 1) - extended codec registers */
|
||||
#define AC97_CODEC_CLASS_REV 0x60 /* Codec Class/Revision */
|
||||
#define AC97_PCI_SVID 0x62 /* PCI Subsystem Vendor ID */
|
||||
#define AC97_PCI_SID 0x64 /* PCI Subsystem ID */
|
||||
#define AC97_FUNC_SELECT 0x66 /* Function Select */
|
||||
#define AC97_FUNC_INFO 0x68 /* Function Information */
|
||||
#define AC97_SENSE_INFO 0x6a /* Sense Details */
|
||||
|
||||
/* slot allocation */
|
||||
#define AC97_SLOT_TAG 0
|
||||
#define AC97_SLOT_CMD_ADDR 1
|
||||
#define AC97_SLOT_CMD_DATA 2
|
||||
#define AC97_SLOT_PCM_LEFT 3
|
||||
#define AC97_SLOT_PCM_RIGHT 4
|
||||
#define AC97_SLOT_MODEM_LINE1 5
|
||||
#define AC97_SLOT_PCM_CENTER 6
|
||||
#define AC97_SLOT_MIC 6 /* input */
|
||||
#define AC97_SLOT_SPDIF_LEFT1 6
|
||||
#define AC97_SLOT_PCM_SLEFT 7 /* surround left */
|
||||
#define AC97_SLOT_PCM_LEFT_0 7 /* double rate operation */
|
||||
#define AC97_SLOT_SPDIF_LEFT 7
|
||||
#define AC97_SLOT_PCM_SRIGHT 8 /* surround right */
|
||||
#define AC97_SLOT_PCM_RIGHT_0 8 /* double rate operation */
|
||||
#define AC97_SLOT_SPDIF_RIGHT 8
|
||||
#define AC97_SLOT_LFE 9
|
||||
#define AC97_SLOT_SPDIF_RIGHT1 9
|
||||
#define AC97_SLOT_MODEM_LINE2 10
|
||||
#define AC97_SLOT_PCM_LEFT_1 10 /* double rate operation */
|
||||
#define AC97_SLOT_SPDIF_LEFT2 10
|
||||
#define AC97_SLOT_HANDSET 11 /* output */
|
||||
#define AC97_SLOT_PCM_RIGHT_1 11 /* double rate operation */
|
||||
#define AC97_SLOT_SPDIF_RIGHT2 11
|
||||
#define AC97_SLOT_MODEM_GPIO 12 /* modem GPIO */
|
||||
#define AC97_SLOT_PCM_CENTER_1 12 /* double rate operation */
|
||||
|
||||
/* basic capabilities (reset register) */
|
||||
#define AC97_BC_DEDICATED_MIC 0x0001 /* Dedicated Mic PCM In Channel */
|
||||
#define AC97_BC_RESERVED1 0x0002 /* Reserved (was Modem Line Codec support) */
|
||||
#define AC97_BC_BASS_TREBLE 0x0004 /* Bass & Treble Control */
|
||||
#define AC97_BC_SIM_STEREO 0x0008 /* Simulated stereo */
|
||||
#define AC97_BC_HEADPHONE 0x0010 /* Headphone Out Support */
|
||||
#define AC97_BC_LOUDNESS 0x0020 /* Loudness (bass boost) Support */
|
||||
#define AC97_BC_16BIT_DAC 0x0000 /* 16-bit DAC resolution */
|
||||
#define AC97_BC_18BIT_DAC 0x0040 /* 18-bit DAC resolution */
|
||||
#define AC97_BC_20BIT_DAC 0x0080 /* 20-bit DAC resolution */
|
||||
#define AC97_BC_DAC_MASK 0x00c0
|
||||
#define AC97_BC_16BIT_ADC 0x0000 /* 16-bit ADC resolution */
|
||||
#define AC97_BC_18BIT_ADC 0x0100 /* 18-bit ADC resolution */
|
||||
#define AC97_BC_20BIT_ADC 0x0200 /* 20-bit ADC resolution */
|
||||
#define AC97_BC_ADC_MASK 0x0300
|
||||
|
||||
/* general purpose */
|
||||
#define AC97_GP_DRSS_MASK 0x0c00 /* double rate slot select */
|
||||
#define AC97_GP_DRSS_1011 0x0000 /* LR(C) 10+11(+12) */
|
||||
#define AC97_GP_DRSS_78 0x0400 /* LR 7+8 */
|
||||
|
||||
/* powerdown bits */
|
||||
#define AC97_PD_ADC_STATUS 0x0001 /* ADC status (RO) */
|
||||
#define AC97_PD_DAC_STATUS 0x0002 /* DAC status (RO) */
|
||||
#define AC97_PD_MIXER_STATUS 0x0004 /* Analog mixer status (RO) */
|
||||
#define AC97_PD_VREF_STATUS 0x0008 /* Vref status (RO) */
|
||||
#define AC97_PD_PR0 0x0100 /* Power down PCM ADCs and input MUX */
|
||||
#define AC97_PD_PR1 0x0200 /* Power down PCM front DAC */
|
||||
#define AC97_PD_PR2 0x0400 /* Power down Mixer (Vref still on) */
|
||||
#define AC97_PD_PR3 0x0800 /* Power down Mixer (Vref off) */
|
||||
#define AC97_PD_PR4 0x1000 /* Power down AC-Link */
|
||||
#define AC97_PD_PR5 0x2000 /* Disable internal clock usage */
|
||||
#define AC97_PD_PR6 0x4000 /* Headphone amplifier */
|
||||
#define AC97_PD_EAPD 0x8000 /* External Amplifer Power Down (EAPD) */
|
||||
|
||||
/* extended audio ID bit defines */
|
||||
#define AC97_EI_VRA 0x0001 /* Variable bit rate supported */
|
||||
#define AC97_EI_DRA 0x0002 /* Double rate supported */
|
||||
#define AC97_EI_SPDIF 0x0004 /* S/PDIF out supported */
|
||||
#define AC97_EI_VRM 0x0008 /* Variable bit rate supported for MIC */
|
||||
#define AC97_EI_DACS_SLOT_MASK 0x0030 /* DACs slot assignment */
|
||||
#define AC97_EI_DACS_SLOT_SHIFT 4
|
||||
#define AC97_EI_CDAC 0x0040 /* PCM Center DAC available */
|
||||
#define AC97_EI_SDAC 0x0080 /* PCM Surround DACs available */
|
||||
#define AC97_EI_LDAC 0x0100 /* PCM LFE DAC available */
|
||||
#define AC97_EI_AMAP 0x0200 /* indicates optional slot/DAC mapping based on codec ID */
|
||||
#define AC97_EI_REV_MASK 0x0c00 /* AC'97 revision mask */
|
||||
#define AC97_EI_REV_22 0x0400 /* AC'97 revision 2.2 */
|
||||
#define AC97_EI_REV_23 0x0800 /* AC'97 revision 2.3 */
|
||||
#define AC97_EI_REV_SHIFT 10
|
||||
#define AC97_EI_ADDR_MASK 0xc000 /* physical codec ID (address) */
|
||||
#define AC97_EI_ADDR_SHIFT 14
|
||||
|
||||
/* extended audio status and control bit defines */
|
||||
#define AC97_EA_VRA 0x0001 /* Variable bit rate enable bit */
|
||||
#define AC97_EA_DRA 0x0002 /* Double-rate audio enable bit */
|
||||
#define AC97_EA_SPDIF 0x0004 /* S/PDIF out enable bit */
|
||||
#define AC97_EA_VRM 0x0008 /* Variable bit rate for MIC enable bit */
|
||||
#define AC97_EA_SPSA_SLOT_MASK 0x0030 /* Mask for slot assignment bits */
|
||||
#define AC97_EA_SPSA_SLOT_SHIFT 4
|
||||
#define AC97_EA_SPSA_3_4 0x0000 /* Slot assigned to 3 & 4 */
|
||||
#define AC97_EA_SPSA_7_8 0x0010 /* Slot assigned to 7 & 8 */
|
||||
#define AC97_EA_SPSA_6_9 0x0020 /* Slot assigned to 6 & 9 */
|
||||
#define AC97_EA_SPSA_10_11 0x0030 /* Slot assigned to 10 & 11 */
|
||||
#define AC97_EA_CDAC 0x0040 /* PCM Center DAC is ready (Read only) */
|
||||
#define AC97_EA_SDAC 0x0080 /* PCM Surround DACs are ready (Read only) */
|
||||
#define AC97_EA_LDAC 0x0100 /* PCM LFE DAC is ready (Read only) */
|
||||
#define AC97_EA_MDAC 0x0200 /* MIC ADC is ready (Read only) */
|
||||
#define AC97_EA_SPCV 0x0400 /* S/PDIF configuration valid (Read only) */
|
||||
#define AC97_EA_PRI 0x0800 /* Turns the PCM Center DAC off */
|
||||
#define AC97_EA_PRJ 0x1000 /* Turns the PCM Surround DACs off */
|
||||
#define AC97_EA_PRK 0x2000 /* Turns the PCM LFE DAC off */
|
||||
#define AC97_EA_PRL 0x4000 /* Turns the MIC ADC off */
|
||||
|
||||
/* S/PDIF control bit defines */
|
||||
#define AC97_SC_PRO 0x0001 /* Professional status */
|
||||
#define AC97_SC_NAUDIO 0x0002 /* Non audio stream */
|
||||
#define AC97_SC_COPY 0x0004 /* Copyright status */
|
||||
#define AC97_SC_PRE 0x0008 /* Preemphasis status */
|
||||
#define AC97_SC_CC_MASK 0x07f0 /* Category Code mask */
|
||||
#define AC97_SC_CC_SHIFT 4
|
||||
#define AC97_SC_L 0x0800 /* Generation Level status */
|
||||
#define AC97_SC_SPSR_MASK 0x3000 /* S/PDIF Sample Rate bits */
|
||||
#define AC97_SC_SPSR_SHIFT 12
|
||||
#define AC97_SC_SPSR_44K 0x0000 /* Use 44.1kHz Sample rate */
|
||||
#define AC97_SC_SPSR_48K 0x2000 /* Use 48kHz Sample rate */
|
||||
#define AC97_SC_SPSR_32K 0x3000 /* Use 32kHz Sample rate */
|
||||
#define AC97_SC_DRS 0x4000 /* Double Rate S/PDIF */
|
||||
#define AC97_SC_V 0x8000 /* Validity status */
|
||||
|
||||
/* Interrupt and Paging bit defines (AC'97 2.3) */
|
||||
#define AC97_PAGE_MASK 0x000f /* Page Selector */
|
||||
#define AC97_PAGE_VENDOR 0 /* Vendor-specific registers */
|
||||
#define AC97_PAGE_1 1 /* Extended Codec Registers page 1 */
|
||||
#define AC97_INT_ENABLE 0x0800 /* Interrupt Enable */
|
||||
#define AC97_INT_SENSE 0x1000 /* Sense Cycle */
|
||||
#define AC97_INT_CAUSE_SENSE 0x2000 /* Sense Cycle Completed (RO) */
|
||||
#define AC97_INT_CAUSE_GPIO 0x4000 /* GPIO bits changed (RO) */
|
||||
#define AC97_INT_STATUS 0x8000 /* Interrupt Status */
|
||||
|
||||
/* extended modem ID bit defines */
|
||||
#define AC97_MEI_LINE1 0x0001 /* Line1 present */
|
||||
#define AC97_MEI_LINE2 0x0002 /* Line2 present */
|
||||
#define AC97_MEI_HANDSET 0x0004 /* Handset present */
|
||||
#define AC97_MEI_CID1 0x0008 /* caller ID decode for Line1 is supported */
|
||||
#define AC97_MEI_CID2 0x0010 /* caller ID decode for Line2 is supported */
|
||||
#define AC97_MEI_ADDR_MASK 0xc000 /* physical codec ID (address) */
|
||||
#define AC97_MEI_ADDR_SHIFT 14
|
||||
|
||||
/* extended modem status and control bit defines */
|
||||
#define AC97_MEA_GPIO 0x0001 /* GPIO is ready (ro) */
|
||||
#define AC97_MEA_MREF 0x0002 /* Vref is up to nominal level (ro) */
|
||||
#define AC97_MEA_ADC1 0x0004 /* ADC1 operational (ro) */
|
||||
#define AC97_MEA_DAC1 0x0008 /* DAC1 operational (ro) */
|
||||
#define AC97_MEA_ADC2 0x0010 /* ADC2 operational (ro) */
|
||||
#define AC97_MEA_DAC2 0x0020 /* DAC2 operational (ro) */
|
||||
#define AC97_MEA_HADC 0x0040 /* HADC operational (ro) */
|
||||
#define AC97_MEA_HDAC 0x0080 /* HDAC operational (ro) */
|
||||
#define AC97_MEA_PRA 0x0100 /* GPIO power down (high) */
|
||||
#define AC97_MEA_PRB 0x0200 /* reserved */
|
||||
#define AC97_MEA_PRC 0x0400 /* ADC1 power down (high) */
|
||||
#define AC97_MEA_PRD 0x0800 /* DAC1 power down (high) */
|
||||
#define AC97_MEA_PRE 0x1000 /* ADC2 power down (high) */
|
||||
#define AC97_MEA_PRF 0x2000 /* DAC2 power down (high) */
|
||||
#define AC97_MEA_PRG 0x4000 /* HADC power down (high) */
|
||||
#define AC97_MEA_PRH 0x8000 /* HDAC power down (high) */
|
||||
|
||||
/* modem gpio status defines */
|
||||
#define AC97_GPIO_LINE1_OH 0x0001 /* Off Hook Line1 */
|
||||
#define AC97_GPIO_LINE1_RI 0x0002 /* Ring Detect Line1 */
|
||||
#define AC97_GPIO_LINE1_CID 0x0004 /* Caller ID path enable Line1 */
|
||||
#define AC97_GPIO_LINE1_LCS 0x0008 /* Loop Current Sense Line1 */
|
||||
#define AC97_GPIO_LINE1_PULSE 0x0010 /* Opt./ Pulse Dial Line1 (out) */
|
||||
#define AC97_GPIO_LINE1_HL1R 0x0020 /* Opt./ Handset to Line1 relay control (out) */
|
||||
#define AC97_GPIO_LINE1_HOHD 0x0040 /* Opt./ Handset off hook detect Line1 (in) */
|
||||
#define AC97_GPIO_LINE12_AC 0x0080 /* Opt./ Int.bit 1 / Line1/2 AC (out) */
|
||||
#define AC97_GPIO_LINE12_DC 0x0100 /* Opt./ Int.bit 2 / Line1/2 DC (out) */
|
||||
#define AC97_GPIO_LINE12_RS 0x0200 /* Opt./ Int.bit 3 / Line1/2 RS (out) */
|
||||
#define AC97_GPIO_LINE2_OH 0x0400 /* Off Hook Line2 */
|
||||
#define AC97_GPIO_LINE2_RI 0x0800 /* Ring Detect Line2 */
|
||||
#define AC97_GPIO_LINE2_CID 0x1000 /* Caller ID path enable Line2 */
|
||||
#define AC97_GPIO_LINE2_LCS 0x2000 /* Loop Current Sense Line2 */
|
||||
#define AC97_GPIO_LINE2_PULSE 0x4000 /* Opt./ Pulse Dial Line2 (out) */
|
||||
#define AC97_GPIO_LINE2_HL1R 0x8000 /* Opt./ Handset to Line2 relay control (out) */
|
||||
|
||||
/* specific - SigmaTel */
|
||||
#define AC97_SIGMATEL_OUTSEL 0x64 /* Output Select, STAC9758 */
|
||||
#define AC97_SIGMATEL_INSEL 0x66 /* Input Select, STAC9758 */
|
||||
#define AC97_SIGMATEL_IOMISC 0x68 /* STAC9758 */
|
||||
#define AC97_SIGMATEL_ANALOG 0x6c /* Analog Special */
|
||||
#define AC97_SIGMATEL_DAC2INVERT 0x6e
|
||||
#define AC97_SIGMATEL_BIAS1 0x70
|
||||
#define AC97_SIGMATEL_BIAS2 0x72
|
||||
#define AC97_SIGMATEL_VARIOUS 0x72 /* STAC9758 */
|
||||
#define AC97_SIGMATEL_MULTICHN 0x74 /* Multi-Channel programming */
|
||||
#define AC97_SIGMATEL_CIC1 0x76
|
||||
#define AC97_SIGMATEL_CIC2 0x78
|
||||
|
||||
/* specific - Analog Devices */
|
||||
#define AC97_AD_TEST 0x5a /* test register */
|
||||
#define AC97_AD_TEST2 0x5c /* undocumented test register 2 */
|
||||
#define AC97_AD_CODEC_CFG 0x70 /* codec configuration */
|
||||
#define AC97_AD_JACK_SPDIF 0x72 /* Jack Sense & S/PDIF */
|
||||
#define AC97_AD_SERIAL_CFG 0x74 /* Serial Configuration */
|
||||
#define AC97_AD_MISC 0x76 /* Misc Control Bits */
|
||||
|
||||
/* specific - Cirrus Logic */
|
||||
#define AC97_CSR_ACMODE 0x5e /* AC Mode Register */
|
||||
#define AC97_CSR_MISC_CRYSTAL 0x60 /* Misc Crystal Control */
|
||||
#define AC97_CSR_SPDIF 0x68 /* S/PDIF Register */
|
||||
#define AC97_CSR_SERIAL 0x6a /* Serial Port Control */
|
||||
#define AC97_CSR_SPECF_ADDR 0x6c /* Special Feature Address */
|
||||
#define AC97_CSR_SPECF_DATA 0x6e /* Special Feature Data */
|
||||
#define AC97_CSR_BDI_STATUS 0x7a /* BDI Status */
|
||||
|
||||
/* specific - Conexant */
|
||||
#define AC97_CXR_AUDIO_MISC 0x5c
|
||||
#define AC97_CXR_SPDIFEN (1<<3)
|
||||
#define AC97_CXR_COPYRGT (1<<2)
|
||||
#define AC97_CXR_SPDIF_MASK (3<<0)
|
||||
#define AC97_CXR_SPDIF_PCM 0x0
|
||||
#define AC97_CXR_SPDIF_AC3 0x2
|
||||
|
||||
/* specific - ALC */
|
||||
#define AC97_ALC650_SPDIF_INPUT_STATUS1 0x60
|
||||
/* S/PDIF input status 1 bit defines */
|
||||
#define AC97_ALC650_PRO 0x0001 /* Professional status */
|
||||
#define AC97_ALC650_NAUDIO 0x0002 /* Non audio stream */
|
||||
#define AC97_ALC650_COPY 0x0004 /* Copyright status */
|
||||
#define AC97_ALC650_PRE 0x0038 /* Preemphasis status */
|
||||
#define AC97_ALC650_PRE_SHIFT 3
|
||||
#define AC97_ALC650_MODE 0x00C0 /* Preemphasis status */
|
||||
#define AC97_ALC650_MODE_SHIFT 6
|
||||
#define AC97_ALC650_CC_MASK 0x7f00 /* Category Code mask */
|
||||
#define AC97_ALC650_CC_SHIFT 8
|
||||
#define AC97_ALC650_L 0x8000 /* Generation Level status */
|
||||
|
||||
#define AC97_ALC650_SPDIF_INPUT_STATUS2 0x62
|
||||
/* S/PDIF input status 2 bit defines */
|
||||
#define AC97_ALC650_SOUCE_MASK 0x000f /* Source number */
|
||||
#define AC97_ALC650_CHANNEL_MASK 0x00f0 /* Channel number */
|
||||
#define AC97_ALC650_CHANNEL_SHIFT 4
|
||||
#define AC97_ALC650_SPSR_MASK 0x0f00 /* S/PDIF Sample Rate bits */
|
||||
#define AC97_ALC650_SPSR_SHIFT 8
|
||||
#define AC97_ALC650_SPSR_44K 0x0000 /* Use 44.1kHz Sample rate */
|
||||
#define AC97_ALC650_SPSR_48K 0x0200 /* Use 48kHz Sample rate */
|
||||
#define AC97_ALC650_SPSR_32K 0x0300 /* Use 32kHz Sample rate */
|
||||
#define AC97_ALC650_CLOCK_ACCURACY 0x3000 /* Clock accuracy */
|
||||
#define AC97_ALC650_CLOCK_SHIFT 12
|
||||
#define AC97_ALC650_CLOCK_LOCK 0x4000 /* Clock locked status */
|
||||
#define AC97_ALC650_V 0x8000 /* Validity status */
|
||||
|
||||
#define AC97_ALC650_SURR_DAC_VOL 0x64
|
||||
#define AC97_ALC650_LFE_DAC_VOL 0x66
|
||||
#define AC97_ALC650_UNKNOWN1 0x68
|
||||
#define AC97_ALC650_MULTICH 0x6a
|
||||
#define AC97_ALC650_UNKNOWN2 0x6c
|
||||
#define AC97_ALC650_REVISION 0x6e
|
||||
#define AC97_ALC650_UNKNOWN3 0x70
|
||||
#define AC97_ALC650_UNKNOWN4 0x72
|
||||
#define AC97_ALC650_MISC 0x74
|
||||
#define AC97_ALC650_GPIO_SETUP 0x76
|
||||
#define AC97_ALC650_GPIO_STATUS 0x78
|
||||
#define AC97_ALC650_CLOCK 0x7a
|
||||
|
||||
/* specific - Yamaha YMF753 */
|
||||
#define AC97_YMF753_DIT_CTRL2 0x66 /* DIT Control 2 */
|
||||
#define AC97_YMF753_3D_MODE_SEL 0x68 /* 3D Mode Select */
|
||||
|
||||
/* specific - C-Media */
|
||||
#define AC97_CM9738_VENDOR_CTRL 0x5a
|
||||
#define AC97_CM9739_MULTI_CHAN 0x64
|
||||
#define AC97_CM9739_SPDIF_IN_STATUS 0x68 /* 32bit */
|
||||
#define AC97_CM9739_SPDIF_CTRL 0x6c
|
||||
|
||||
/* specific - wolfson */
|
||||
#define AC97_WM97XX_FMIXER_VOL 0x72
|
||||
#define AC97_WM9704_RMIXER_VOL 0x74
|
||||
#define AC97_WM9704_TEST 0x5a
|
||||
#define AC97_WM9704_RPCM_VOL 0x70
|
||||
#define AC97_WM9711_OUT3VOL 0x16
|
||||
|
||||
|
||||
/* ac97->scaps */
|
||||
#define AC97_SCAP_AUDIO (1<<0) /* audio codec 97 */
|
||||
#define AC97_SCAP_MODEM (1<<1) /* modem codec 97 */
|
||||
#define AC97_SCAP_SURROUND_DAC (1<<2) /* surround L&R DACs are present */
|
||||
#define AC97_SCAP_CENTER_LFE_DAC (1<<3) /* center and LFE DACs are present */
|
||||
#define AC97_SCAP_SKIP_AUDIO (1<<4) /* skip audio part of codec */
|
||||
#define AC97_SCAP_SKIP_MODEM (1<<5) /* skip modem part of codec */
|
||||
#define AC97_SCAP_INDEP_SDIN (1<<6) /* independent SDIN */
|
||||
#define AC97_SCAP_INV_EAPD (1<<7) /* inverted EAPD */
|
||||
#define AC97_SCAP_DETECT_BY_VENDOR (1<<8) /* use vendor registers for read tests */
|
||||
#define AC97_SCAP_NO_SPDIF (1<<9) /* don't build SPDIF controls */
|
||||
#define AC97_SCAP_EAPD_LED (1<<10) /* EAPD as mute LED */
|
||||
#define AC97_SCAP_POWER_SAVE (1<<11) /* capable for aggresive power-saving */
|
||||
|
||||
/* ac97->flags */
|
||||
#define AC97_HAS_PC_BEEP (1<<0) /* force PC Speaker usage */
|
||||
#define AC97_AD_MULTI (1<<1) /* Analog Devices - multi codecs */
|
||||
#define AC97_CS_SPDIF (1<<2) /* Cirrus Logic uses funky SPDIF */
|
||||
#define AC97_CX_SPDIF (1<<3) /* Conexant's spdif interface */
|
||||
#define AC97_STEREO_MUTES (1<<4) /* has stereo mute bits */
|
||||
#define AC97_DOUBLE_RATE (1<<5) /* supports double rate playback */
|
||||
#define AC97_HAS_NO_MASTER_VOL (1<<6) /* no Master volume */
|
||||
#define AC97_HAS_NO_PCM_VOL (1<<7) /* no PCM volume */
|
||||
#define AC97_DEFAULT_POWER_OFF (1<<8) /* no RESET write */
|
||||
#define AC97_MODEM_PATCH (1<<9) /* modem patch */
|
||||
#define AC97_HAS_NO_REC_GAIN (1<<10) /* no Record gain */
|
||||
#define AC97_HAS_NO_PHONE (1<<11) /* no PHONE volume */
|
||||
#define AC97_HAS_NO_PC_BEEP (1<<12) /* no PC Beep volume */
|
||||
#define AC97_HAS_NO_VIDEO (1<<13) /* no Video volume */
|
||||
#define AC97_HAS_NO_CD (1<<14) /* no CD volume */
|
||||
#define AC97_HAS_NO_MIC (1<<15) /* no MIC volume */
|
||||
#define AC97_HAS_NO_TONE (1<<16) /* no Tone volume */
|
||||
#define AC97_HAS_NO_STD_PCM (1<<17) /* no standard AC97 PCM volume and mute */
|
||||
#define AC97_HAS_NO_AUX (1<<18) /* no standard AC97 AUX volume and mute */
|
||||
|
||||
/* rates indexes */
|
||||
#define AC97_RATES_FRONT_DAC 0
|
||||
#define AC97_RATES_SURR_DAC 1
|
||||
#define AC97_RATES_LFE_DAC 2
|
||||
#define AC97_RATES_ADC 3
|
||||
#define AC97_RATES_MIC_ADC 4
|
||||
#define AC97_RATES_SPDIF 5
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
struct snd_ac97;
|
||||
|
||||
struct snd_ac97_build_ops {
|
||||
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) (struct snd_ac97 *ac97);
|
||||
void (*resume) (struct snd_ac97 *ac97);
|
||||
#endif
|
||||
void (*update_jacks) (struct snd_ac97 *ac97); /* for jack-sharing */
|
||||
};
|
||||
|
||||
struct snd_ac97_bus_ops {
|
||||
void (*reset) (struct snd_ac97 *ac97);
|
||||
void (*warm_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 {
|
||||
/* -- lowlevel (hardware) driver specific -- */
|
||||
struct snd_ac97_bus_ops *ops;
|
||||
void *private_data;
|
||||
void (*private_free) (struct snd_ac97_bus *bus);
|
||||
/* --- */
|
||||
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 */
|
||||
isdin: 1;/* independent SDIN */
|
||||
unsigned int clock; /* AC'97 base clock (usually 48000Hz) */
|
||||
spinlock_t bus_lock; /* used mainly for slot allocation */
|
||||
unsigned short used_slots[2][4]; /* actually used PCM slots */
|
||||
unsigned short pcms_count; /* count of PCMs */
|
||||
struct ac97_pcm *pcms;
|
||||
struct snd_ac97 *codec[4];
|
||||
struct snd_info_entry *proc;
|
||||
};
|
||||
|
||||
/* static resolution table */
|
||||
struct snd_ac97_res_table {
|
||||
unsigned short reg; /* register */
|
||||
unsigned short bits; /* resolution bitmask */
|
||||
};
|
||||
|
||||
struct snd_ac97_template {
|
||||
void *private_data;
|
||||
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] */
|
||||
unsigned int scaps; /* driver capabilities */
|
||||
const struct snd_ac97_res_table *res_table; /* static resolution */
|
||||
};
|
||||
|
||||
struct snd_ac97 {
|
||||
/* -- lowlevel (hardware) driver specific -- */
|
||||
struct snd_ac97_build_ops * build_ops;
|
||||
void *private_data;
|
||||
void (*private_free) (struct snd_ac97 *ac97);
|
||||
/* --- */
|
||||
struct snd_ac97_bus *bus;
|
||||
struct pci_dev *pci; /* assigned PCI device - used for quirks */
|
||||
struct snd_info_entry *proc;
|
||||
struct snd_info_entry *proc_regs;
|
||||
unsigned short subsystem_vendor;
|
||||
unsigned short subsystem_device;
|
||||
struct mutex reg_mutex;
|
||||
struct mutex page_mutex; /* mutex for AD18xx multi-codecs and paging (2.3) */
|
||||
unsigned short num; /* number of codec: 0 = primary, 1 = secondary */
|
||||
unsigned short addr; /* physical address of codec [0-3] */
|
||||
unsigned int id; /* identification of codec */
|
||||
unsigned short caps; /* capabilities (register 0) */
|
||||
unsigned short ext_id; /* extended feature identification (register 28) */
|
||||
unsigned short ext_mid; /* extended modem ID (register 3C) */
|
||||
const struct snd_ac97_res_table *res_table; /* static resolution */
|
||||
unsigned int scaps; /* driver capabilities */
|
||||
unsigned int flags; /* specific code */
|
||||
unsigned int rates[6]; /* see AC97_RATES_* defines */
|
||||
unsigned int spdif_status;
|
||||
unsigned short regs[0x80]; /* register cache */
|
||||
DECLARE_BITMAP(reg_accessed, 0x80); /* bit flags */
|
||||
union { /* vendor specific code */
|
||||
struct {
|
||||
unsigned short unchained[3]; // 0 = C34, 1 = C79, 2 = C69
|
||||
unsigned short chained[3]; // 0 = C34, 1 = C79, 2 = C69
|
||||
unsigned short id[3]; // codec IDs (lower 16-bit word)
|
||||
unsigned short pcmreg[3]; // PCM registers
|
||||
unsigned short codec_cfg[3]; // CODEC_CFG bits
|
||||
unsigned char swap_mic_linein; // AD1986/AD1986A only
|
||||
} ad18xx;
|
||||
unsigned int dev_flags; /* device specific */
|
||||
} spec;
|
||||
/* jack-sharing info */
|
||||
unsigned char indep_surround;
|
||||
unsigned char channel_mode;
|
||||
|
||||
#ifdef CONFIG_SND_AC97_POWER_SAVE
|
||||
unsigned int power_up; /* power states */
|
||||
struct delayed_work power_work;
|
||||
#endif
|
||||
struct device dev;
|
||||
};
|
||||
|
||||
#define to_ac97_t(d) container_of(d, struct snd_ac97, dev)
|
||||
|
||||
/* conditions */
|
||||
static inline int ac97_is_audio(struct snd_ac97 * ac97)
|
||||
{
|
||||
return (ac97->scaps & AC97_SCAP_AUDIO);
|
||||
}
|
||||
static inline int ac97_is_modem(struct snd_ac97 * ac97)
|
||||
{
|
||||
return (ac97->scaps & AC97_SCAP_MODEM);
|
||||
}
|
||||
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(struct snd_ac97 * ac97)
|
||||
{
|
||||
return (ac97->ext_id & AC97_EI_AMAP) != 0;
|
||||
}
|
||||
static inline int ac97_can_spdif(struct snd_ac97 * ac97)
|
||||
{
|
||||
return (ac97->ext_id & AC97_EI_SPDIF) != 0;
|
||||
}
|
||||
|
||||
/* functions */
|
||||
/* 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(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_SND_AC97_POWER_SAVE
|
||||
int snd_ac97_update_power(struct snd_ac97 *ac97, int reg, int powerup);
|
||||
#else
|
||||
static inline int snd_ac97_update_power(struct snd_ac97 *ac97, int reg,
|
||||
int powerup)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_PM
|
||||
void snd_ac97_suspend(struct snd_ac97 *ac97);
|
||||
void snd_ac97_resume(struct snd_ac97 *ac97);
|
||||
#endif
|
||||
|
||||
/* quirk types */
|
||||
enum {
|
||||
AC97_TUNE_DEFAULT = -1, /* use default from quirk list (not valid in list) */
|
||||
AC97_TUNE_NONE = 0, /* nothing extra to do */
|
||||
AC97_TUNE_HP_ONLY, /* headphone (true line-out) control as master only */
|
||||
AC97_TUNE_SWAP_HP, /* swap headphone and master controls */
|
||||
AC97_TUNE_SWAP_SURROUND, /* swap master and surround controls */
|
||||
AC97_TUNE_AD_SHARING, /* for AD1985, turn on OMS bit and use headphone */
|
||||
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 {
|
||||
unsigned short subvendor; /* PCI subsystem vendor id */
|
||||
unsigned short subdevice; /* PCI sybsystem device id */
|
||||
unsigned short mask; /* device id bit mask, 0 = accept all */
|
||||
unsigned int codec_id; /* codec id (if any), 0 = accept all */
|
||||
const char *name; /* name shown as info */
|
||||
int type; /* quirk type above */
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
/*
|
||||
* 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 short cur_dbl; /* current double-rate state */
|
||||
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(struct snd_pcm_runtime *runtime);
|
||||
|
||||
/* ad hoc AC97 device driver access */
|
||||
extern struct bus_type ac97_bus_type;
|
||||
|
||||
#endif /* __SOUND_AC97_CODEC_H */
|
||||
173
include/sound/ad1816a.h
Normal file
173
include/sound/ad1816a.h
Normal file
@@ -0,0 +1,173 @@
|
||||
#ifndef __SOUND_AD1816A_H
|
||||
#define __SOUND_AD1816A_H
|
||||
|
||||
/*
|
||||
ad1816a.h - definitions for ADI SoundPort AD1816A chip.
|
||||
Copyright (C) 1999-2000 by Massimo Piccioni <dafastidio@libero.it>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "control.h"
|
||||
#include "pcm.h"
|
||||
#include "timer.h"
|
||||
|
||||
#define AD1816A_REG(r) (chip->port + r)
|
||||
|
||||
#define AD1816A_CHIP_STATUS 0x00
|
||||
#define AD1816A_INDIR_ADDR 0x00
|
||||
#define AD1816A_INTERRUPT_STATUS 0x01
|
||||
#define AD1816A_INDIR_DATA_LOW 0x02
|
||||
#define AD1816A_INDIR_DATA_HIGH 0x03
|
||||
#define AD1816A_PIO_DEBUG 0x04
|
||||
#define AD1816A_PIO_STATUS 0x05
|
||||
#define AD1816A_PIO_DATA 0x06
|
||||
#define AD1816A_RESERVED_7 0x07
|
||||
#define AD1816A_PLAYBACK_CONFIG 0x08
|
||||
#define AD1816A_CAPTURE_CONFIG 0x09
|
||||
#define AD1816A_RESERVED_10 0x0a
|
||||
#define AD1816A_RESERVED_11 0x0b
|
||||
#define AD1816A_JOYSTICK_RAW_DATA 0x0c
|
||||
#define AD1816A_JOYSTICK_CTRL 0x0d
|
||||
#define AD1816A_JOY_POS_DATA_LOW 0x0e
|
||||
#define AD1816A_JOY_POS_DATA_HIGH 0x0f
|
||||
|
||||
#define AD1816A_LOW_BYTE_TMP 0x00
|
||||
#define AD1816A_INTERRUPT_ENABLE 0x01
|
||||
#define AD1816A_EXTERNAL_CTRL 0x01
|
||||
#define AD1816A_PLAYBACK_SAMPLE_RATE 0x02
|
||||
#define AD1816A_CAPTURE_SAMPLE_RATE 0x03
|
||||
#define AD1816A_VOICE_ATT 0x04
|
||||
#define AD1816A_FM_ATT 0x05
|
||||
#define AD1816A_I2S_1_ATT 0x06
|
||||
#define AD1816A_I2S_0_ATT 0x07
|
||||
#define AD1816A_PLAYBACK_BASE_COUNT 0x08
|
||||
#define AD1816A_PLAYBACK_CURR_COUNT 0x09
|
||||
#define AD1816A_CAPTURE_BASE_COUNT 0x0a
|
||||
#define AD1816A_CAPTURE_CURR_COUNT 0x0b
|
||||
#define AD1816A_TIMER_BASE_COUNT 0x0c
|
||||
#define AD1816A_TIMER_CURR_COUNT 0x0d
|
||||
#define AD1816A_MASTER_ATT 0x0e
|
||||
#define AD1816A_CD_GAIN_ATT 0x0f
|
||||
#define AD1816A_SYNTH_GAIN_ATT 0x10
|
||||
#define AD1816A_VID_GAIN_ATT 0x11
|
||||
#define AD1816A_LINE_GAIN_ATT 0x12
|
||||
#define AD1816A_MIC_GAIN_ATT 0x13
|
||||
#define AD1816A_PHONE_IN_GAIN_ATT 0x13
|
||||
#define AD1816A_ADC_SOURCE_SEL 0x14
|
||||
#define AD1816A_ADC_PGA 0x14
|
||||
#define AD1816A_CHIP_CONFIG 0x20
|
||||
#define AD1816A_DSP_CONFIG 0x21
|
||||
#define AD1816A_FM_SAMPLE_RATE 0x22
|
||||
#define AD1816A_I2S_1_SAMPLE_RATE 0x23
|
||||
#define AD1816A_I2S_0_SAMPLE_RATE 0x24
|
||||
#define AD1816A_RESERVED_37 0x25
|
||||
#define AD1816A_PROGRAM_CLOCK_RATE 0x26
|
||||
#define AD1816A_3D_PHAT_CTRL 0x27
|
||||
#define AD1816A_PHONE_OUT_ATT 0x27
|
||||
#define AD1816A_RESERVED_40 0x28
|
||||
#define AD1816A_HW_VOL_BUT 0x29
|
||||
#define AD1816A_DSP_MAILBOX_0 0x2a
|
||||
#define AD1816A_DSP_MAILBOX_1 0x2b
|
||||
#define AD1816A_POWERDOWN_CTRL 0x2c
|
||||
#define AD1816A_TIMER_CTRL 0x2c
|
||||
#define AD1816A_VERSION_ID 0x2d
|
||||
#define AD1816A_RESERVED_46 0x2e
|
||||
|
||||
#define AD1816A_READY 0x80
|
||||
|
||||
#define AD1816A_PLAYBACK_IRQ_PENDING 0x80
|
||||
#define AD1816A_CAPTURE_IRQ_PENDING 0x40
|
||||
#define AD1816A_TIMER_IRQ_PENDING 0x20
|
||||
|
||||
#define AD1816A_PLAYBACK_ENABLE 0x01
|
||||
#define AD1816A_PLAYBACK_PIO 0x02
|
||||
#define AD1816A_CAPTURE_ENABLE 0x01
|
||||
#define AD1816A_CAPTURE_PIO 0x02
|
||||
|
||||
#define AD1816A_FMT_LINEAR_8 0x00
|
||||
#define AD1816A_FMT_ULAW_8 0x08
|
||||
#define AD1816A_FMT_LINEAR_16_LIT 0x10
|
||||
#define AD1816A_FMT_ALAW_8 0x18
|
||||
#define AD1816A_FMT_LINEAR_16_BIG 0x30
|
||||
#define AD1816A_FMT_ALL 0x38
|
||||
#define AD1816A_FMT_STEREO 0x04
|
||||
|
||||
#define AD1816A_PLAYBACK_IRQ_ENABLE 0x8000
|
||||
#define AD1816A_CAPTURE_IRQ_ENABLE 0x4000
|
||||
#define AD1816A_TIMER_IRQ_ENABLE 0x2000
|
||||
#define AD1816A_TIMER_ENABLE 0x0080
|
||||
|
||||
#define AD1816A_SRC_LINE 0x00
|
||||
#define AD1816A_SRC_OUT 0x10
|
||||
#define AD1816A_SRC_CD 0x20
|
||||
#define AD1816A_SRC_SYNTH 0x30
|
||||
#define AD1816A_SRC_VIDEO 0x40
|
||||
#define AD1816A_SRC_MIC 0x50
|
||||
#define AD1816A_SRC_MONO 0x50
|
||||
#define AD1816A_SRC_PHONE_IN 0x60
|
||||
#define AD1816A_SRC_MASK 0x70
|
||||
|
||||
#define AD1816A_CAPTURE_NOT_EQUAL 0x1000
|
||||
#define AD1816A_WSS_ENABLE 0x8000
|
||||
|
||||
struct snd_ad1816a {
|
||||
unsigned long port;
|
||||
struct resource *res_port;
|
||||
int irq;
|
||||
int dma1;
|
||||
int dma2;
|
||||
|
||||
unsigned short hardware;
|
||||
unsigned short version;
|
||||
|
||||
spinlock_t lock;
|
||||
|
||||
unsigned short mode;
|
||||
unsigned int clock_freq;
|
||||
|
||||
struct snd_card *card;
|
||||
struct snd_pcm *pcm;
|
||||
|
||||
struct snd_pcm_substream *playback_substream;
|
||||
struct snd_pcm_substream *capture_substream;
|
||||
unsigned int p_dma_size;
|
||||
unsigned int c_dma_size;
|
||||
|
||||
struct snd_timer *timer;
|
||||
};
|
||||
|
||||
|
||||
#define AD1816A_HW_AUTO 0
|
||||
#define AD1816A_HW_AD1816A 1
|
||||
#define AD1816A_HW_AD1815 2
|
||||
#define AD1816A_HW_AD18MAX10 3
|
||||
|
||||
#define AD1816A_MODE_PLAYBACK 0x01
|
||||
#define AD1816A_MODE_CAPTURE 0x02
|
||||
#define AD1816A_MODE_TIMER 0x04
|
||||
#define AD1816A_MODE_OPEN (AD1816A_MODE_PLAYBACK | \
|
||||
AD1816A_MODE_CAPTURE | \
|
||||
AD1816A_MODE_TIMER)
|
||||
|
||||
|
||||
extern int snd_ad1816a_create(struct snd_card *card, unsigned long port,
|
||||
int irq, int dma1, int dma2,
|
||||
struct snd_ad1816a **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 */
|
||||
219
include/sound/ad1848.h
Normal file
219
include/sound/ad1848.h
Normal file
@@ -0,0 +1,219 @@
|
||||
#ifndef __SOUND_AD1848_H
|
||||
#define __SOUND_AD1848_H
|
||||
|
||||
/*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
* Definitions for AD1847/AD1848/CS4248 chips
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "pcm.h"
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
/* IO ports */
|
||||
|
||||
#define AD1848P( codec, x ) ( (chip) -> port + c_d_c_AD1848##x )
|
||||
|
||||
#define c_d_c_AD1848REGSEL 0
|
||||
#define c_d_c_AD1848REG 1
|
||||
#define c_d_c_AD1848STATUS 2
|
||||
#define c_d_c_AD1848PIO 3
|
||||
|
||||
/* codec registers */
|
||||
|
||||
#define AD1848_LEFT_INPUT 0x00 /* left input control */
|
||||
#define AD1848_RIGHT_INPUT 0x01 /* right input control */
|
||||
#define AD1848_AUX1_LEFT_INPUT 0x02 /* left AUX1 input control */
|
||||
#define AD1848_AUX1_RIGHT_INPUT 0x03 /* right AUX1 input control */
|
||||
#define AD1848_AUX2_LEFT_INPUT 0x04 /* left AUX2 input control */
|
||||
#define AD1848_AUX2_RIGHT_INPUT 0x05 /* right AUX2 input control */
|
||||
#define AD1848_LEFT_OUTPUT 0x06 /* left output control register */
|
||||
#define AD1848_RIGHT_OUTPUT 0x07 /* right output control register */
|
||||
#define AD1848_DATA_FORMAT 0x08 /* clock and data format - playback/capture - bits 7-0 MCE */
|
||||
#define AD1848_IFACE_CTRL 0x09 /* interface control - bits 7-2 MCE */
|
||||
#define AD1848_PIN_CTRL 0x0a /* pin control */
|
||||
#define AD1848_TEST_INIT 0x0b /* test and initialization */
|
||||
#define AD1848_MISC_INFO 0x0c /* miscellaneaous information */
|
||||
#define AD1848_LOOPBACK 0x0d /* loopback control */
|
||||
#define AD1848_DATA_UPR_CNT 0x0e /* playback/capture upper base count */
|
||||
#define AD1848_DATA_LWR_CNT 0x0f /* playback/capture lower base count */
|
||||
|
||||
/* definitions for codec register select port - CODECP( REGSEL ) */
|
||||
|
||||
#define AD1848_INIT 0x80 /* CODEC is initializing */
|
||||
#define AD1848_MCE 0x40 /* mode change enable */
|
||||
#define AD1848_TRD 0x20 /* transfer request disable */
|
||||
|
||||
/* definitions for codec status register - CODECP( STATUS ) */
|
||||
|
||||
#define AD1848_GLOBALIRQ 0x01 /* IRQ is active */
|
||||
|
||||
/* definitions for AD1848_LEFT_INPUT and AD1848_RIGHT_INPUT registers */
|
||||
|
||||
#define AD1848_ENABLE_MIC_GAIN 0x20
|
||||
|
||||
#define AD1848_MIXS_LINE1 0x00
|
||||
#define AD1848_MIXS_AUX1 0x40
|
||||
#define AD1848_MIXS_LINE2 0x80
|
||||
#define AD1848_MIXS_ALL 0xc0
|
||||
|
||||
/* definitions for clock and data format register - AD1848_PLAYBK_FORMAT */
|
||||
|
||||
#define AD1848_LINEAR_8 0x00 /* 8-bit unsigned data */
|
||||
#define AD1848_ALAW_8 0x60 /* 8-bit A-law companded */
|
||||
#define AD1848_ULAW_8 0x20 /* 8-bit U-law companded */
|
||||
#define AD1848_LINEAR_16 0x40 /* 16-bit twos complement data - little endian */
|
||||
#define AD1848_STEREO 0x10 /* stereo mode */
|
||||
/* bits 3-1 define frequency divisor */
|
||||
#define AD1848_XTAL1 0x00 /* 24.576 crystal */
|
||||
#define AD1848_XTAL2 0x01 /* 16.9344 crystal */
|
||||
|
||||
/* definitions for interface control register - AD1848_IFACE_CTRL */
|
||||
|
||||
#define AD1848_CAPTURE_PIO 0x80 /* capture PIO enable */
|
||||
#define AD1848_PLAYBACK_PIO 0x40 /* playback PIO enable */
|
||||
#define AD1848_CALIB_MODE 0x18 /* calibration mode bits */
|
||||
#define AD1848_AUTOCALIB 0x08 /* auto calibrate */
|
||||
#define AD1848_SINGLE_DMA 0x04 /* use single DMA channel */
|
||||
#define AD1848_CAPTURE_ENABLE 0x02 /* capture enable */
|
||||
#define AD1848_PLAYBACK_ENABLE 0x01 /* playback enable */
|
||||
|
||||
/* definitions for pin control register - AD1848_PIN_CTRL */
|
||||
|
||||
#define AD1848_IRQ_ENABLE 0x02 /* enable IRQ */
|
||||
#define AD1848_XCTL1 0x40 /* external control #1 */
|
||||
#define AD1848_XCTL0 0x80 /* external control #0 */
|
||||
|
||||
/* definitions for test and init register - AD1848_TEST_INIT */
|
||||
|
||||
#define AD1848_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */
|
||||
#define AD1848_DMA_REQUEST 0x10 /* DMA request in progress */
|
||||
|
||||
/* defines for codec.mode */
|
||||
|
||||
#define AD1848_MODE_NONE 0x0000
|
||||
#define AD1848_MODE_PLAY 0x0001
|
||||
#define AD1848_MODE_CAPTURE 0x0002
|
||||
#define AD1848_MODE_TIMER 0x0004
|
||||
#define AD1848_MODE_OPEN (AD1848_MODE_PLAY|AD1848_MODE_CAPTURE|AD1848_MODE_TIMER)
|
||||
#define AD1848_MODE_RUNNING 0x0010
|
||||
|
||||
/* defines for codec.hardware */
|
||||
|
||||
#define AD1848_HW_DETECT 0x0000 /* let AD1848 driver detect chip */
|
||||
#define AD1848_HW_AD1847 0x0001 /* AD1847 chip */
|
||||
#define AD1848_HW_AD1848 0x0002 /* AD1848 chip */
|
||||
#define AD1848_HW_CS4248 0x0003 /* CS4248 chip */
|
||||
#define AD1848_HW_CMI8330 0x0004 /* CMI8330 chip */
|
||||
#define AD1848_HW_THINKPAD 0x0005 /* Thinkpad 360/750/755 */
|
||||
|
||||
/* IBM Thinkpad specific stuff */
|
||||
#define AD1848_THINKPAD_CTL_PORT1 0x15e8
|
||||
#define AD1848_THINKPAD_CTL_PORT2 0x15e9
|
||||
#define AD1848_THINKPAD_CS4248_ENABLE_BIT 0x02
|
||||
|
||||
struct snd_ad1848 {
|
||||
unsigned long port; /* i/o port */
|
||||
struct resource *res_port;
|
||||
int irq; /* IRQ line */
|
||||
int dma; /* data DMA */
|
||||
unsigned short version; /* version of CODEC chip */
|
||||
unsigned short mode; /* see to AD1848_MODE_XXXX */
|
||||
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 */
|
||||
|
||||
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;
|
||||
int calibrate_mute;
|
||||
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 mutex open_mutex;
|
||||
};
|
||||
|
||||
/* exported functions */
|
||||
|
||||
void snd_ad1848_out(struct snd_ad1848 *chip, unsigned char reg, unsigned char value);
|
||||
|
||||
int snd_ad1848_create(struct snd_card *card,
|
||||
unsigned long port,
|
||||
int irq, int dma,
|
||||
unsigned short hardware,
|
||||
struct snd_ad1848 ** 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 };
|
||||
|
||||
#define AD1848_MIXVAL_SINGLE(reg, shift, mask, invert) \
|
||||
((reg) | ((shift) << 8) | ((mask) << 16) | ((invert) << 24))
|
||||
#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))
|
||||
|
||||
/* for ease of use */
|
||||
struct ad1848_mix_elem {
|
||||
const char *name;
|
||||
int index;
|
||||
int type;
|
||||
unsigned long private_value;
|
||||
const unsigned int *tlv;
|
||||
};
|
||||
|
||||
#define AD1848_SINGLE(xname, xindex, reg, shift, mask, invert) \
|
||||
{ .name = xname, \
|
||||
.index = xindex, \
|
||||
.type = AD1848_MIX_SINGLE, \
|
||||
.private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert) }
|
||||
|
||||
#define AD1848_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \
|
||||
{ .name = xname, \
|
||||
.index = xindex, \
|
||||
.type = AD1848_MIX_SINGLE, \
|
||||
.private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert), \
|
||||
.tlv = xtlv }
|
||||
|
||||
#define AD1848_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
|
||||
{ .name = xname, \
|
||||
.index = xindex, \
|
||||
.type = AD1848_MIX_DOUBLE, \
|
||||
.private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert) }
|
||||
|
||||
#define AD1848_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
|
||||
{ .name = xname, \
|
||||
.index = xindex, \
|
||||
.type = AD1848_MIX_DOUBLE, \
|
||||
.private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert), \
|
||||
.tlv = xtlv }
|
||||
|
||||
int snd_ad1848_add_ctl_elem(struct snd_ad1848 *chip, const struct ad1848_mix_elem *c);
|
||||
|
||||
#endif /* __SOUND_AD1848_H */
|
||||
134
include/sound/ainstr_fm.h
Normal file
134
include/sound/ainstr_fm.h
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Advanced Linux Sound Architecture
|
||||
*
|
||||
* FM (OPL2/3) Instrument Format
|
||||
* Copyright (c) 2000 Uros Bizjak <uros@kss-loka.si>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_AINSTR_FM_H
|
||||
#define __SOUND_AINSTR_FM_H
|
||||
|
||||
#ifndef __KERNEL__
|
||||
#include <asm/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* share types (share ID 1)
|
||||
*/
|
||||
|
||||
#define FM_SHARE_FILE 0
|
||||
|
||||
/*
|
||||
* 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;
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument
|
||||
*/
|
||||
|
||||
#define FM_PATCH_OPL2 0x01 /* OPL2 2 operators FM instrument */
|
||||
#define FM_PATCH_OPL3 0x02 /* OPL3 4 operators FM instrument */
|
||||
|
||||
struct fm_instrument {
|
||||
unsigned int share_id[4]; /* share id - zero = no sharing */
|
||||
unsigned char type; /* instrument type */
|
||||
|
||||
struct fm_operator op[4];
|
||||
unsigned char feedback_connection[2];
|
||||
|
||||
unsigned char echo_delay;
|
||||
unsigned char echo_atten;
|
||||
unsigned char chorus_spread;
|
||||
unsigned char trnsps;
|
||||
unsigned char fix_dur;
|
||||
unsigned char modes;
|
||||
unsigned char fix_key;
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
* Kernel <-> user space
|
||||
* Hardware (CPU) independent section
|
||||
*
|
||||
* * = zero or more
|
||||
* + = one or more
|
||||
*
|
||||
* fm_xinstrument FM_STRU_INSTR
|
||||
*
|
||||
*/
|
||||
|
||||
#define FM_STRU_INSTR __cpu_to_be32(('I'<<24)|('N'<<16)|('S'<<8)|'T')
|
||||
|
||||
/*
|
||||
* FM operator
|
||||
*/
|
||||
|
||||
struct fm_xoperator {
|
||||
__u8 am_vib;
|
||||
__u8 ksl_level;
|
||||
__u8 attack_decay;
|
||||
__u8 sustain_release;
|
||||
__u8 wave_select;
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument
|
||||
*/
|
||||
|
||||
struct fm_xinstrument {
|
||||
__u32 stype; /* structure type */
|
||||
|
||||
__u32 share_id[4]; /* share id - zero = no sharing */
|
||||
__u8 type; /* instrument type */
|
||||
|
||||
struct fm_xoperator op[4]; /* fm operators */
|
||||
__u8 feedback_connection[2];
|
||||
|
||||
__u8 echo_delay;
|
||||
__u8 echo_atten;
|
||||
__u8 chorus_spread;
|
||||
__u8 trnsps;
|
||||
__u8 fix_dur;
|
||||
__u8 modes;
|
||||
__u8 fix_key;
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include "seq_instr.h"
|
||||
|
||||
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 */
|
||||
229
include/sound/ainstr_gf1.h
Normal file
229
include/sound/ainstr_gf1.h
Normal file
@@ -0,0 +1,229 @@
|
||||
/*
|
||||
* Advanced Linux Sound Architecture
|
||||
*
|
||||
* GF1 (GUS) Patch Instrument Format
|
||||
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_AINSTR_GF1_H
|
||||
#define __SOUND_AINSTR_GF1_H
|
||||
|
||||
#ifndef __KERNEL__
|
||||
#include <asm/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* share types (share ID 1)
|
||||
*/
|
||||
|
||||
#define GF1_SHARE_FILE 0
|
||||
|
||||
/*
|
||||
* wave formats
|
||||
*/
|
||||
|
||||
#define GF1_WAVE_16BIT 0x0001 /* 16-bit wave */
|
||||
#define GF1_WAVE_UNSIGNED 0x0002 /* unsigned wave */
|
||||
#define GF1_WAVE_INVERT 0x0002 /* same as unsigned wave */
|
||||
#define GF1_WAVE_BACKWARD 0x0004 /* backward mode (maybe used for reverb or ping-ping loop) */
|
||||
#define GF1_WAVE_LOOP 0x0008 /* loop mode */
|
||||
#define GF1_WAVE_BIDIR 0x0010 /* bidirectional mode */
|
||||
#define GF1_WAVE_STEREO 0x0100 /* stereo mode */
|
||||
#define GF1_WAVE_ULAW 0x0200 /* uLaw compression mode */
|
||||
|
||||
/*
|
||||
* Wavetable definitions
|
||||
*/
|
||||
|
||||
struct gf1_wave {
|
||||
unsigned int share_id[4]; /* share id - zero = no sharing */
|
||||
unsigned int format; /* wave format */
|
||||
|
||||
struct {
|
||||
unsigned int number; /* some other ID for this instrument */
|
||||
unsigned int memory; /* begin of waveform in onboard memory */
|
||||
unsigned char *ptr; /* pointer to waveform in system memory */
|
||||
} address;
|
||||
|
||||
unsigned int size; /* size of waveform in samples */
|
||||
unsigned int start; /* start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned int loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned int loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned short loop_repeat; /* loop repeat - 0 = forever */
|
||||
|
||||
unsigned char flags; /* GF1 patch flags */
|
||||
unsigned char pad;
|
||||
unsigned int sample_rate; /* sample rate in Hz */
|
||||
unsigned int low_frequency; /* low frequency range */
|
||||
unsigned int high_frequency; /* high frequency range */
|
||||
unsigned int root_frequency; /* root frequency range */
|
||||
signed short tune;
|
||||
unsigned char balance;
|
||||
unsigned char envelope_rate[6];
|
||||
unsigned char envelope_offset[6];
|
||||
unsigned char tremolo_sweep;
|
||||
unsigned char tremolo_rate;
|
||||
unsigned char tremolo_depth;
|
||||
unsigned char vibrato_sweep;
|
||||
unsigned char vibrato_rate;
|
||||
unsigned char vibrato_depth;
|
||||
unsigned short scale_frequency;
|
||||
unsigned short scale_factor; /* 0-2048 or 0-2 */
|
||||
|
||||
struct gf1_wave *next;
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument
|
||||
*/
|
||||
|
||||
#define IWFFFF_EXCLUDE_NONE 0x0000 /* exclusion mode - none */
|
||||
#define IWFFFF_EXCLUDE_SINGLE 0x0001 /* exclude single - single note from the instrument group */
|
||||
#define IWFFFF_EXCLUDE_MULTIPLE 0x0002 /* exclude multiple - stop only same note from this instrument */
|
||||
|
||||
#define IWFFFF_EFFECT_NONE 0
|
||||
#define IWFFFF_EFFECT_REVERB 1
|
||||
#define IWFFFF_EFFECT_CHORUS 2
|
||||
#define IWFFFF_EFFECT_ECHO 3
|
||||
|
||||
struct gf1_instrument {
|
||||
unsigned short exclusion;
|
||||
unsigned short exclusion_group; /* 0 - none, 1-65535 */
|
||||
|
||||
unsigned char effect1; /* effect 1 */
|
||||
unsigned char effect1_depth; /* 0-127 */
|
||||
unsigned char effect2; /* effect 2 */
|
||||
unsigned char effect2_depth; /* 0-127 */
|
||||
|
||||
struct gf1_wave *wave; /* first waveform */
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
* Kernel <-> user space
|
||||
* Hardware (CPU) independent section
|
||||
*
|
||||
* * = zero or more
|
||||
* + = one or more
|
||||
*
|
||||
* gf1_xinstrument IWFFFF_STRU_INSTR
|
||||
* +gf1_xwave IWFFFF_STRU_WAVE
|
||||
*
|
||||
*/
|
||||
|
||||
#define GF1_STRU_WAVE __cpu_to_be32(('W'<<24)|('A'<<16)|('V'<<8)|'E')
|
||||
#define GF1_STRU_INSTR __cpu_to_be32(('I'<<24)|('N'<<16)|('S'<<8)|'T')
|
||||
|
||||
/*
|
||||
* Wavetable definitions
|
||||
*/
|
||||
|
||||
struct gf1_xwave {
|
||||
__u32 stype; /* structure type */
|
||||
|
||||
__u32 share_id[4]; /* share id - zero = no sharing */
|
||||
__u32 format; /* wave format */
|
||||
|
||||
__u32 size; /* size of waveform in samples */
|
||||
__u32 start; /* start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u32 loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u32 loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u16 loop_repeat; /* loop repeat - 0 = forever */
|
||||
|
||||
__u8 flags; /* GF1 patch flags */
|
||||
__u8 pad;
|
||||
__u32 sample_rate; /* sample rate in Hz */
|
||||
__u32 low_frequency; /* low frequency range */
|
||||
__u32 high_frequency; /* high frequency range */
|
||||
__u32 root_frequency; /* root frequency range */
|
||||
__s16 tune;
|
||||
__u8 balance;
|
||||
__u8 envelope_rate[6];
|
||||
__u8 envelope_offset[6];
|
||||
__u8 tremolo_sweep;
|
||||
__u8 tremolo_rate;
|
||||
__u8 tremolo_depth;
|
||||
__u8 vibrato_sweep;
|
||||
__u8 vibrato_rate;
|
||||
__u8 vibrato_depth;
|
||||
__u16 scale_frequency;
|
||||
__u16 scale_factor; /* 0-2048 or 0-2 */
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument
|
||||
*/
|
||||
|
||||
struct gf1_xinstrument {
|
||||
__u32 stype;
|
||||
|
||||
__u16 exclusion;
|
||||
__u16 exclusion_group; /* 0 - none, 1-65535 */
|
||||
|
||||
__u8 effect1; /* effect 1 */
|
||||
__u8 effect1_depth; /* 0-127 */
|
||||
__u8 effect2; /* effect 2 */
|
||||
__u8 effect2_depth; /* 0-127 */
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument info
|
||||
*/
|
||||
|
||||
#define GF1_INFO_ENVELOPE (1<<0)
|
||||
#define GF1_INFO_TREMOLO (1<<1)
|
||||
#define GF1_INFO_VIBRATO (1<<2)
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include "seq_instr.h"
|
||||
|
||||
struct snd_gf1_ops {
|
||||
void *private_data;
|
||||
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, struct gf1_wave *wave,
|
||||
char __user *data, long len, int atomic);
|
||||
int (*remove_sample)(void *private_data, struct gf1_wave *wave,
|
||||
int atomic);
|
||||
void (*notify)(void *private_data, struct snd_seq_kinstr *instr, int what);
|
||||
struct snd_seq_kinstr_ops kops;
|
||||
};
|
||||
|
||||
int snd_seq_gf1_init(struct snd_gf1_ops *ops,
|
||||
void *private_data,
|
||||
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 */
|
||||
384
include/sound/ainstr_iw.h
Normal file
384
include/sound/ainstr_iw.h
Normal file
@@ -0,0 +1,384 @@
|
||||
/*
|
||||
* Advanced Linux Sound Architecture
|
||||
*
|
||||
* InterWave FFFF Instrument Format
|
||||
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_AINSTR_IW_H
|
||||
#define __SOUND_AINSTR_IW_H
|
||||
|
||||
#ifndef __KERNEL__
|
||||
#include <asm/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* share types (share ID 1)
|
||||
*/
|
||||
|
||||
#define IWFFFF_SHARE_FILE 0
|
||||
|
||||
/*
|
||||
* wave formats
|
||||
*/
|
||||
|
||||
#define IWFFFF_WAVE_16BIT 0x0001 /* 16-bit wave */
|
||||
#define IWFFFF_WAVE_UNSIGNED 0x0002 /* unsigned wave */
|
||||
#define IWFFFF_WAVE_INVERT 0x0002 /* same as unsigned wave */
|
||||
#define IWFFFF_WAVE_BACKWARD 0x0004 /* backward mode (maybe used for reverb or ping-ping loop) */
|
||||
#define IWFFFF_WAVE_LOOP 0x0008 /* loop mode */
|
||||
#define IWFFFF_WAVE_BIDIR 0x0010 /* bidirectional mode */
|
||||
#define IWFFFF_WAVE_ULAW 0x0020 /* uLaw compressed wave */
|
||||
#define IWFFFF_WAVE_RAM 0x0040 /* wave is _preloaded_ in RAM (it is used for ROM simulation) */
|
||||
#define IWFFFF_WAVE_ROM 0x0080 /* wave is in ROM */
|
||||
#define IWFFFF_WAVE_STEREO 0x0100 /* wave is stereo */
|
||||
|
||||
/*
|
||||
* Wavetable definitions
|
||||
*/
|
||||
|
||||
struct iwffff_wave {
|
||||
unsigned int share_id[4]; /* share id - zero = no sharing */
|
||||
unsigned int format; /* wave format */
|
||||
|
||||
struct {
|
||||
unsigned int number; /* some other ID for this wave */
|
||||
unsigned int memory; /* begin of waveform in onboard memory */
|
||||
unsigned char *ptr; /* pointer to waveform in system memory */
|
||||
} address;
|
||||
|
||||
unsigned int size; /* size of waveform in samples */
|
||||
unsigned int start; /* start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned int loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned int loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned short loop_repeat; /* loop repeat - 0 = forever */
|
||||
unsigned int sample_ratio; /* sample ratio (44100 * 1024 / rate) */
|
||||
unsigned char attenuation; /* 0 - 127 (no corresponding midi controller) */
|
||||
unsigned char low_note; /* lower frequency range for this waveform */
|
||||
unsigned char high_note; /* higher frequency range for this waveform */
|
||||
unsigned char pad;
|
||||
|
||||
struct iwffff_wave *next;
|
||||
};
|
||||
|
||||
/*
|
||||
* Layer
|
||||
*/
|
||||
|
||||
#define IWFFFF_LFO_SHAPE_TRIANGLE 0
|
||||
#define IWFFFF_LFO_SHAPE_POSTRIANGLE 1
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
#define IWFFFF_ENV_FLAG_RETRIGGER 0x0001 /* flag - retrigger */
|
||||
|
||||
#define IWFFFF_ENV_MODE_ONE_SHOT 0x0001 /* mode - one shot */
|
||||
#define IWFFFF_ENV_MODE_SUSTAIN 0x0002 /* mode - sustain */
|
||||
#define IWFFFF_ENV_MODE_NO_SUSTAIN 0x0003 /* mode - no sustain */
|
||||
|
||||
#define IWFFFF_ENV_INDEX_VELOCITY 0x0001 /* index - velocity */
|
||||
#define IWFFFF_ENV_INDEX_FREQUENCY 0x0002 /* index - frequency */
|
||||
|
||||
struct iwffff_env_point {
|
||||
unsigned short offset;
|
||||
unsigned short rate;
|
||||
};
|
||||
|
||||
struct iwffff_env_record {
|
||||
unsigned short nattack;
|
||||
unsigned short nrelease;
|
||||
unsigned short sustain_offset;
|
||||
unsigned short sustain_rate;
|
||||
unsigned short release_rate;
|
||||
unsigned char hirange;
|
||||
unsigned char pad;
|
||||
struct iwffff_env_record *next;
|
||||
/* points are stored here */
|
||||
/* count of points = nattack + nrelease */
|
||||
};
|
||||
|
||||
struct iwffff_env {
|
||||
unsigned char flags;
|
||||
unsigned char mode;
|
||||
unsigned char index;
|
||||
unsigned char pad;
|
||||
struct iwffff_env_record *record;
|
||||
};
|
||||
|
||||
#define IWFFFF_LAYER_FLAG_RETRIGGER 0x0001 /* retrigger */
|
||||
|
||||
#define IWFFFF_LAYER_VELOCITY_TIME 0x0000 /* velocity mode = time */
|
||||
#define IWFFFF_LAYER_VELOCITY_RATE 0x0001 /* velocity mode = rate */
|
||||
|
||||
#define IWFFFF_LAYER_EVENT_KUP 0x0000 /* layer event - key up */
|
||||
#define IWFFFF_LAYER_EVENT_KDOWN 0x0001 /* layer event - key down */
|
||||
#define IWFFFF_LAYER_EVENT_RETRIG 0x0002 /* layer event - retrigger */
|
||||
#define IWFFFF_LAYER_EVENT_LEGATO 0x0003 /* layer event - legato */
|
||||
|
||||
struct iwffff_layer {
|
||||
unsigned char flags;
|
||||
unsigned char velocity_mode;
|
||||
unsigned char layer_event;
|
||||
unsigned char low_range; /* range for layer based */
|
||||
unsigned char high_range; /* on either velocity or frequency */
|
||||
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) */
|
||||
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;
|
||||
struct iwffff_env penv; /* pitch envelope */
|
||||
struct iwffff_env venv; /* volume envelope */
|
||||
|
||||
struct iwffff_wave *wave;
|
||||
struct iwffff_layer *next;
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument
|
||||
*/
|
||||
|
||||
#define IWFFFF_EXCLUDE_NONE 0x0000 /* exclusion mode - none */
|
||||
#define IWFFFF_EXCLUDE_SINGLE 0x0001 /* exclude single - single note from the instrument group */
|
||||
#define IWFFFF_EXCLUDE_MULTIPLE 0x0002 /* exclude multiple - stop only same note from this instrument */
|
||||
|
||||
#define IWFFFF_LAYER_NONE 0x0000 /* not layered */
|
||||
#define IWFFFF_LAYER_ON 0x0001 /* layered */
|
||||
#define IWFFFF_LAYER_VELOCITY 0x0002 /* layered by velocity */
|
||||
#define IWFFFF_LAYER_FREQUENCY 0x0003 /* layered by frequency */
|
||||
|
||||
#define IWFFFF_EFFECT_NONE 0
|
||||
#define IWFFFF_EFFECT_REVERB 1
|
||||
#define IWFFFF_EFFECT_CHORUS 2
|
||||
#define IWFFFF_EFFECT_ECHO 3
|
||||
|
||||
struct iwffff_instrument {
|
||||
unsigned short exclusion;
|
||||
unsigned short layer_type;
|
||||
unsigned short exclusion_group; /* 0 - none, 1-65535 */
|
||||
|
||||
unsigned char effect1; /* effect 1 */
|
||||
unsigned char effect1_depth; /* 0-127 */
|
||||
unsigned char effect2; /* effect 2 */
|
||||
unsigned char effect2_depth; /* 0-127 */
|
||||
|
||||
struct iwffff_layer *layer; /* first layer */
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
* Kernel <-> user space
|
||||
* Hardware (CPU) independent section
|
||||
*
|
||||
* * = zero or more
|
||||
* + = one or more
|
||||
*
|
||||
* iwffff_xinstrument IWFFFF_STRU_INSTR
|
||||
* +iwffff_xlayer IWFFFF_STRU_LAYER
|
||||
* *iwffff_xenv_record IWFFFF_STRU_ENV_RECT (tremolo)
|
||||
* *iwffff_xenv_record IWFFFF_STRU_EVN_RECT (vibrato)
|
||||
* +iwffff_xwave IWFFFF_STRU_WAVE
|
||||
*
|
||||
*/
|
||||
|
||||
#define IWFFFF_STRU_WAVE __cpu_to_be32(('W'<<24)|('A'<<16)|('V'<<8)|'E')
|
||||
#define IWFFFF_STRU_ENV_RECP __cpu_to_be32(('E'<<24)|('N'<<16)|('R'<<8)|'P')
|
||||
#define IWFFFF_STRU_ENV_RECV __cpu_to_be32(('E'<<24)|('N'<<16)|('R'<<8)|'V')
|
||||
#define IWFFFF_STRU_LAYER __cpu_to_be32(('L'<<24)|('A'<<16)|('Y'<<8)|'R')
|
||||
#define IWFFFF_STRU_INSTR __cpu_to_be32(('I'<<24)|('N'<<16)|('S'<<8)|'T')
|
||||
|
||||
/*
|
||||
* Wavetable definitions
|
||||
*/
|
||||
|
||||
struct iwffff_xwave {
|
||||
__u32 stype; /* structure type */
|
||||
|
||||
__u32 share_id[4]; /* share id - zero = no sharing */
|
||||
|
||||
__u32 format; /* wave format */
|
||||
__u32 offset; /* offset to ROM (address) */
|
||||
|
||||
__u32 size; /* size of waveform in samples */
|
||||
__u32 start; /* start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u32 loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u32 loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u16 loop_repeat; /* loop repeat - 0 = forever */
|
||||
__u32 sample_ratio; /* sample ratio (44100 * 1024 / rate) */
|
||||
__u8 attenuation; /* 0 - 127 (no corresponding midi controller) */
|
||||
__u8 low_note; /* lower frequency range for this waveform */
|
||||
__u8 high_note; /* higher frequency range for this waveform */
|
||||
__u8 pad;
|
||||
};
|
||||
|
||||
/*
|
||||
* Layer
|
||||
*/
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
struct iwffff_xenv_point {
|
||||
__u16 offset;
|
||||
__u16 rate;
|
||||
};
|
||||
|
||||
struct iwffff_xenv_record {
|
||||
__u32 stype;
|
||||
__u16 nattack;
|
||||
__u16 nrelease;
|
||||
__u16 sustain_offset;
|
||||
__u16 sustain_rate;
|
||||
__u16 release_rate;
|
||||
__u8 hirange;
|
||||
__u8 pad;
|
||||
/* points are stored here.. */
|
||||
/* count of points = nattack + nrelease */
|
||||
};
|
||||
|
||||
struct iwffff_xenv {
|
||||
__u8 flags;
|
||||
__u8 mode;
|
||||
__u8 index;
|
||||
__u8 pad;
|
||||
};
|
||||
|
||||
struct iwffff_xlayer {
|
||||
__u32 stype;
|
||||
__u8 flags;
|
||||
__u8 velocity_mode;
|
||||
__u8 layer_event;
|
||||
__u8 low_range; /* range for layer based */
|
||||
__u8 high_range; /* on either velocity or frequency */
|
||||
__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) */
|
||||
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;
|
||||
struct iwffff_xenv penv; /* pitch envelope */
|
||||
struct iwffff_xenv venv; /* volume envelope */
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument
|
||||
*/
|
||||
|
||||
struct iwffff_xinstrument {
|
||||
__u32 stype;
|
||||
|
||||
__u16 exclusion;
|
||||
__u16 layer_type;
|
||||
__u16 exclusion_group; /* 0 - none, 1-65535 */
|
||||
|
||||
__u8 effect1; /* effect 1 */
|
||||
__u8 effect1_depth; /* 0-127 */
|
||||
__u8 effect2; /* effect 2 */
|
||||
__u8 effect2_depth; /* 0-127 */
|
||||
};
|
||||
|
||||
/*
|
||||
* ROM support
|
||||
* InterWave ROMs are Little-Endian (x86)
|
||||
*/
|
||||
|
||||
#define IWFFFF_ROM_HDR_SIZE 512
|
||||
|
||||
struct iwffff_rom_header {
|
||||
__u8 iwave[8];
|
||||
__u8 revision;
|
||||
__u8 series_number;
|
||||
__u8 series_name[16];
|
||||
__u8 date[10];
|
||||
__u16 vendor_revision_major;
|
||||
__u16 vendor_revision_minor;
|
||||
__u32 rom_size;
|
||||
__u8 copyright[128];
|
||||
__u8 vendor_name[64];
|
||||
__u8 description[128];
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument info
|
||||
*/
|
||||
|
||||
#define IWFFFF_INFO_LFO_VIBRATO (1<<0)
|
||||
#define IWFFFF_INFO_LFO_VIBRATO_SHAPE (1<<1)
|
||||
#define IWFFFF_INFO_LFO_TREMOLO (1<<2)
|
||||
#define IWFFFF_INFO_LFO_TREMOLO_SHAPE (1<<3)
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include "seq_instr.h"
|
||||
|
||||
struct snd_iwffff_ops {
|
||||
void *private_data;
|
||||
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, struct iwffff_wave *wave,
|
||||
char __user *data, long len, int atomic);
|
||||
int (*remove_sample)(void *private_data, struct iwffff_wave *wave,
|
||||
int atomic);
|
||||
void (*notify)(void *private_data, struct snd_seq_kinstr *instr, int what);
|
||||
struct snd_seq_kinstr_ops kops;
|
||||
};
|
||||
|
||||
int snd_seq_iwffff_init(struct snd_iwffff_ops *ops,
|
||||
void *private_data,
|
||||
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 */
|
||||
159
include/sound/ainstr_simple.h
Normal file
159
include/sound/ainstr_simple.h
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* Advanced Linux Sound Architecture
|
||||
*
|
||||
* Simple (MOD player) Instrument Format
|
||||
* Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_AINSTR_SIMPLE_H
|
||||
#define __SOUND_AINSTR_SIMPLE_H
|
||||
|
||||
#ifndef __KERNEL__
|
||||
#include <asm/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* share types (share ID 1)
|
||||
*/
|
||||
|
||||
#define SIMPLE_SHARE_FILE 0
|
||||
|
||||
/*
|
||||
* wave formats
|
||||
*/
|
||||
|
||||
#define SIMPLE_WAVE_16BIT 0x0001 /* 16-bit wave */
|
||||
#define SIMPLE_WAVE_UNSIGNED 0x0002 /* unsigned wave */
|
||||
#define SIMPLE_WAVE_INVERT 0x0002 /* same as unsigned wave */
|
||||
#define SIMPLE_WAVE_BACKWARD 0x0004 /* backward mode (maybe used for reverb or ping-ping loop) */
|
||||
#define SIMPLE_WAVE_LOOP 0x0008 /* loop mode */
|
||||
#define SIMPLE_WAVE_BIDIR 0x0010 /* bidirectional mode */
|
||||
#define SIMPLE_WAVE_STEREO 0x0100 /* stereo wave */
|
||||
#define SIMPLE_WAVE_ULAW 0x0200 /* uLaw compression mode */
|
||||
|
||||
/*
|
||||
* instrument effects
|
||||
*/
|
||||
|
||||
#define SIMPLE_EFFECT_NONE 0
|
||||
#define SIMPLE_EFFECT_REVERB 1
|
||||
#define SIMPLE_EFFECT_CHORUS 2
|
||||
#define SIMPLE_EFFECT_ECHO 3
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
};
|
||||
|
||||
/*
|
||||
* Instrument
|
||||
*/
|
||||
|
||||
struct simple_instrument {
|
||||
unsigned int share_id[4]; /* share id - zero = no sharing */
|
||||
unsigned int format; /* wave format */
|
||||
|
||||
struct {
|
||||
unsigned int number; /* some other ID for this instrument */
|
||||
unsigned int memory; /* begin of waveform in onboard memory */
|
||||
unsigned char *ptr; /* pointer to waveform in system memory */
|
||||
} address;
|
||||
|
||||
unsigned int size; /* size of waveform in samples */
|
||||
unsigned int start; /* start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned int loop_start; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned int loop_end; /* loop end offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
unsigned short loop_repeat; /* loop repeat - 0 = forever */
|
||||
|
||||
unsigned char effect1; /* effect 1 */
|
||||
unsigned char effect1_depth; /* 0-127 */
|
||||
unsigned char effect2; /* effect 2 */
|
||||
unsigned char effect2_depth; /* 0-127 */
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
* Kernel <-> user space
|
||||
* Hardware (CPU) independent section
|
||||
*
|
||||
* * = zero or more
|
||||
* + = one or more
|
||||
*
|
||||
* simple_xinstrument SIMPLE_STRU_INSTR
|
||||
*
|
||||
*/
|
||||
|
||||
#define SIMPLE_STRU_INSTR __cpu_to_be32(('I'<<24)|('N'<<16)|('S'<<8)|'T')
|
||||
|
||||
/*
|
||||
* Instrument
|
||||
*/
|
||||
|
||||
struct simple_xinstrument {
|
||||
__u32 stype;
|
||||
|
||||
__u32 share_id[4]; /* share id - zero = no sharing */
|
||||
__u32 format; /* wave format */
|
||||
|
||||
__u32 size; /* size of waveform in samples */
|
||||
__u32 start; /* start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u32 loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u32 loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
|
||||
__u16 loop_repeat; /* loop repeat - 0 = forever */
|
||||
|
||||
__u8 effect1; /* effect 1 */
|
||||
__u8 effect1_depth; /* 0-127 */
|
||||
__u8 effect2; /* effect 2 */
|
||||
__u8 effect2_depth; /* 0-127 */
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include "seq_instr.h"
|
||||
|
||||
struct snd_simple_ops {
|
||||
void *private_data;
|
||||
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, struct simple_instrument *instr,
|
||||
char __user *data, long len, int atomic);
|
||||
int (*remove_sample)(void *private_data, struct simple_instrument *instr,
|
||||
int atomic);
|
||||
void (*notify)(void *private_data, struct snd_seq_kinstr *instr, int what);
|
||||
struct snd_seq_kinstr_ops kops;
|
||||
};
|
||||
|
||||
int snd_seq_simple_init(struct snd_simple_ops *ops,
|
||||
void *private_data,
|
||||
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 */
|
||||
202
include/sound/ak4114.h
Normal file
202
include/sound/ak4114.h
Normal file
@@ -0,0 +1,202 @@
|
||||
#ifndef __SOUND_AK4114_H
|
||||
#define __SOUND_AK4114_H
|
||||
|
||||
/*
|
||||
* Routines for Asahi Kasei AK4114
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/* AK4114 registers */
|
||||
#define AK4114_REG_PWRDN 0x00 /* power down */
|
||||
#define AK4114_REG_FORMAT 0x01 /* format control */
|
||||
#define AK4114_REG_IO0 0x02 /* input/output control */
|
||||
#define AK4114_REG_IO1 0x03 /* input/output control */
|
||||
#define AK4114_REG_INT0_MASK 0x04 /* interrupt0 mask */
|
||||
#define AK4114_REG_INT1_MASK 0x05 /* interrupt1 mask */
|
||||
#define AK4114_REG_RCS0 0x06 /* receiver status 0 */
|
||||
#define AK4114_REG_RCS1 0x07 /* receiver status 1 */
|
||||
#define AK4114_REG_RXCSB0 0x08 /* RX channel status byte 0 */
|
||||
#define AK4114_REG_RXCSB1 0x09 /* RX channel status byte 1 */
|
||||
#define AK4114_REG_RXCSB2 0x0a /* RX channel status byte 2 */
|
||||
#define AK4114_REG_RXCSB3 0x0b /* RX channel status byte 3 */
|
||||
#define AK4114_REG_RXCSB4 0x0c /* RX channel status byte 4 */
|
||||
#define AK4114_REG_TXCSB0 0x0d /* TX channel status byte 0 */
|
||||
#define AK4114_REG_TXCSB1 0x0e /* TX channel status byte 1 */
|
||||
#define AK4114_REG_TXCSB2 0x0f /* TX channel status byte 2 */
|
||||
#define AK4114_REG_TXCSB3 0x10 /* TX channel status byte 3 */
|
||||
#define AK4114_REG_TXCSB4 0x11 /* TX channel status byte 4 */
|
||||
#define AK4114_REG_Pc0 0x12 /* burst preamble Pc byte 0 */
|
||||
#define AK4114_REG_Pc1 0x13 /* burst preamble Pc byte 1 */
|
||||
#define AK4114_REG_Pd0 0x14 /* burst preamble Pd byte 0 */
|
||||
#define AK4114_REG_Pd1 0x15 /* burst preamble Pd byte 1 */
|
||||
#define AK4114_REG_QSUB_ADDR 0x16 /* Q-subcode address + control */
|
||||
#define AK4114_REG_QSUB_TRACK 0x17 /* Q-subcode track */
|
||||
#define AK4114_REG_QSUB_INDEX 0x18 /* Q-subcode index */
|
||||
#define AK4114_REG_QSUB_MINUTE 0x19 /* Q-subcode minute */
|
||||
#define AK4114_REG_QSUB_SECOND 0x1a /* Q-subcode second */
|
||||
#define AK4114_REG_QSUB_FRAME 0x1b /* Q-subcode frame */
|
||||
#define AK4114_REG_QSUB_ZERO 0x1c /* Q-subcode zero */
|
||||
#define AK4114_REG_QSUB_ABSMIN 0x1d /* Q-subcode absolute minute */
|
||||
#define AK4114_REG_QSUB_ABSSEC 0x1e /* Q-subcode absolute second */
|
||||
#define AK4114_REG_QSUB_ABSFRM 0x1f /* Q-subcode absolute frame */
|
||||
|
||||
/* sizes */
|
||||
#define AK4114_REG_RXCSB_SIZE ((AK4114_REG_RXCSB4-AK4114_REG_RXCSB0)+1)
|
||||
#define AK4114_REG_TXCSB_SIZE ((AK4114_REG_TXCSB4-AK4114_REG_TXCSB0)+1)
|
||||
#define AK4114_REG_QSUB_SIZE ((AK4114_REG_QSUB_ABSFRM-AK4114_REG_QSUB_ADDR)+1)
|
||||
|
||||
/* AK4117_REG_PWRDN bits */
|
||||
#define AK4114_CS12 (1<<7) /* Channel Status Select */
|
||||
#define AK4114_BCU (1<<6) /* Block Start & C/U Output Mode */
|
||||
#define AK4114_CM1 (1<<5) /* Master Clock Operation Select */
|
||||
#define AK4114_CM0 (1<<4) /* Master Clock Operation Select */
|
||||
#define AK4114_OCKS1 (1<<3) /* Master Clock Frequency Select */
|
||||
#define AK4114_OCKS0 (1<<2) /* Master Clock Frequency Select */
|
||||
#define AK4114_PWN (1<<1) /* 0 = power down, 1 = normal operation */
|
||||
#define AK4114_RST (1<<0) /* 0 = reset & initialize (except this register), 1 = normal operation */
|
||||
|
||||
/* AK4114_REQ_FORMAT bits */
|
||||
#define AK4114_MONO (1<<7) /* Double Sampling Frequency Mode: 0 = stereo, 1 = mono */
|
||||
#define AK4114_DIF2 (1<<6) /* Audio Data Control */
|
||||
#define AK4114_DIF1 (1<<5) /* Audio Data Control */
|
||||
#define AK4114_DIF0 (1<<4) /* Audio Data Control */
|
||||
#define AK4114_DIF_16R (0) /* STDO: 16-bit, right justified */
|
||||
#define AK4114_DIF_18R (AK4114_DIF0) /* STDO: 18-bit, right justified */
|
||||
#define AK4114_DIF_20R (AK4114_DIF1) /* STDO: 20-bit, right justified */
|
||||
#define AK4114_DIF_24R (AK4114_DIF1|AK4114_DIF0) /* STDO: 24-bit, right justified */
|
||||
#define AK4114_DIF_24L (AK4114_DIF2) /* STDO: 24-bit, left justified */
|
||||
#define AK4114_DIF_24I2S (AK4114_DIF2|AK4114_DIF0) /* STDO: I2S */
|
||||
#define AK4114_DIF_I24L (AK4114_DIF2|AK4114_DIF1) /* STDO: 24-bit, left justified; LRCLK, BICK = Input */
|
||||
#define AK4114_DIF_I24I2S (AK4114_DIF2|AK4114_DIF1|AK4114_DIF0) /* STDO: I2S; LRCLK, BICK = Input */
|
||||
#define AK4114_DEAU (1<<3) /* Deemphasis Autodetect Enable (1 = enable) */
|
||||
#define AK4114_DEM1 (1<<2) /* 32kHz-48kHz Deemphasis Control */
|
||||
#define AK4114_DEM0 (1<<1) /* 32kHz-48kHz Deemphasis Control */
|
||||
#define AK4114_DEM_44KHZ (0)
|
||||
#define AK4114_DEM_48KHZ (AK4114_DEM1)
|
||||
#define AK4114_DEM_32KHZ (AK4114_DEM0|AK4114_DEM1)
|
||||
#define AK4114_DEM_96KHZ (AK4114_DEM1) /* DFS must be set */
|
||||
#define AK4114_DFS (1<<0) /* 96kHz Deemphasis Control */
|
||||
|
||||
/* AK4114_REG_IO0 */
|
||||
#define AK4114_TX1E (1<<7) /* TX1 Output Enable (1 = enable) */
|
||||
#define AK4114_OPS12 (1<<2) /* Output Though Data Selector for TX1 pin */
|
||||
#define AK4114_OPS11 (1<<1) /* Output Though Data Selector for TX1 pin */
|
||||
#define AK4114_OPS10 (1<<0) /* Output Though Data Selector for TX1 pin */
|
||||
#define AK4114_TX0E (1<<3) /* TX0 Output Enable (1 = enable) */
|
||||
#define AK4114_OPS02 (1<<2) /* Output Though Data Selector for TX0 pin */
|
||||
#define AK4114_OPS01 (1<<1) /* Output Though Data Selector for TX0 pin */
|
||||
#define AK4114_OPS00 (1<<0) /* Output Though Data Selector for TX0 pin */
|
||||
|
||||
/* AK4114_REG_IO1 */
|
||||
#define AK4114_EFH1 (1<<7) /* Interrupt 0 pin Hold */
|
||||
#define AK4114_EFH0 (1<<6) /* Interrupt 0 pin Hold */
|
||||
#define AK4114_EFH_512 (0)
|
||||
#define AK4114_EFH_1024 (AK4114_EFH0)
|
||||
#define AK4114_EFH_2048 (AK4114_EFH1)
|
||||
#define AK4114_EFH_4096 (AK4114_EFH1|AK4114_EFH0)
|
||||
#define AK4114_UDIT (1<<5) /* U-bit Control for DIT (0 = fixed '0', 1 = recovered) */
|
||||
#define AK4114_TLR (1<<4) /* Double Sampling Frequency Select for DIT (0 = L channel, 1 = R channel) */
|
||||
#define AK4114_DIT (1<<3) /* TX1 out: 0 = Through Data (RX data), 1 = Transmit Data (DAUX data) */
|
||||
#define AK4114_IPS2 (1<<2) /* Input Recovery Data Select */
|
||||
#define AK4114_IPS1 (1<<1) /* Input Recovery Data Select */
|
||||
#define AK4114_IPS0 (1<<0) /* Input Recovery Data Select */
|
||||
#define AK4114_IPS(x) ((x)&7)
|
||||
|
||||
/* AK4114_REG_INT0_MASK && AK4114_REG_INT1_MASK*/
|
||||
#define AK4117_MQI (1<<7) /* mask enable for QINT bit */
|
||||
#define AK4117_MAT (1<<6) /* mask enable for AUTO bit */
|
||||
#define AK4117_MCI (1<<5) /* mask enable for CINT bit */
|
||||
#define AK4117_MUL (1<<4) /* mask enable for UNLOCK bit */
|
||||
#define AK4117_MDTS (1<<3) /* mask enable for DTSCD bit */
|
||||
#define AK4117_MPE (1<<2) /* mask enable for PEM bit */
|
||||
#define AK4117_MAN (1<<1) /* mask enable for AUDN bit */
|
||||
#define AK4117_MPR (1<<0) /* mask enable for PAR bit */
|
||||
|
||||
/* AK4114_REG_RCS0 */
|
||||
#define AK4114_QINT (1<<7) /* Q-subcode buffer interrupt, 0 = no change, 1 = changed */
|
||||
#define AK4114_AUTO (1<<6) /* Non-PCM or DTS stream auto detection, 0 = no detect, 1 = detect */
|
||||
#define AK4114_CINT (1<<5) /* channel status buffer interrupt, 0 = no change, 1 = change */
|
||||
#define AK4114_UNLCK (1<<4) /* PLL lock status, 0 = lock, 1 = unlock */
|
||||
#define AK4114_DTSCD (1<<3) /* DTS-CD Detect, 0 = No detect, 1 = Detect */
|
||||
#define AK4114_PEM (1<<2) /* Pre-emphasis Detect, 0 = OFF, 1 = ON */
|
||||
#define AK4114_AUDION (1<<1) /* audio bit output, 0 = audio, 1 = non-audio */
|
||||
#define AK4114_PAR (1<<0) /* parity error or biphase error status, 0 = no error, 1 = error */
|
||||
|
||||
/* AK4114_REG_RCS1 */
|
||||
#define AK4114_FS3 (1<<7) /* sampling frequency detection */
|
||||
#define AK4114_FS2 (1<<6)
|
||||
#define AK4114_FS1 (1<<5)
|
||||
#define AK4114_FS0 (1<<4)
|
||||
#define AK4114_FS_44100HZ (0)
|
||||
#define AK4114_FS_48000HZ (AK4114_FS1)
|
||||
#define AK4114_FS_32000HZ (AK4114_FS1|AK4114_FS0)
|
||||
#define AK4114_FS_88200HZ (AK4114_FS3)
|
||||
#define AK4114_FS_96000HZ (AK4114_FS3|AK4114_FS1)
|
||||
#define AK4114_FS_176400HZ (AK4114_FS3|AK4114_FS2)
|
||||
#define AK4114_FS_192000HZ (AK4114_FS3|AK4114_FS2|AK4114_FS1)
|
||||
#define AK4114_V (1<<3) /* Validity of Channel Status, 0 = Valid, 1 = Invalid */
|
||||
#define AK4114_QCRC (1<<1) /* CRC for Q-subcode, 0 = no error, 1 = error */
|
||||
#define AK4114_CCRC (1<<0) /* CRC for channel status, 0 = no error, 1 = error */
|
||||
|
||||
/* flags for snd_ak4114_check_rate_and_errors() */
|
||||
#define AK4114_CHECK_NO_STAT (1<<0) /* no statistics */
|
||||
#define AK4114_CHECK_NO_RATE (1<<1) /* no rate check */
|
||||
|
||||
#define AK4114_CONTROLS 15
|
||||
|
||||
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);
|
||||
|
||||
struct ak4114 {
|
||||
struct snd_card *card;
|
||||
ak4114_write_t * write;
|
||||
ak4114_read_t * read;
|
||||
void * private_data;
|
||||
unsigned int init: 1;
|
||||
spinlock_t lock;
|
||||
unsigned char regmap[7];
|
||||
unsigned char txcsb[5];
|
||||
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;
|
||||
unsigned long ccrc_errors;
|
||||
unsigned char rcs0;
|
||||
unsigned char rcs1;
|
||||
struct delayed_work work;
|
||||
void *change_callback_private;
|
||||
void (*change_callback)(struct ak4114 *ak4114, unsigned char c0, unsigned char c1);
|
||||
};
|
||||
|
||||
int snd_ak4114_create(struct snd_card *card,
|
||||
ak4114_read_t *read, ak4114_write_t *write,
|
||||
const unsigned char pgm[7], const unsigned char txcsb[5],
|
||||
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 */
|
||||
|
||||
189
include/sound/ak4117.h
Normal file
189
include/sound/ak4117.h
Normal file
@@ -0,0 +1,189 @@
|
||||
#ifndef __SOUND_AK4117_H
|
||||
#define __SOUND_AK4117_H
|
||||
|
||||
/*
|
||||
* Routines for Asahi Kasei AK4117
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#define AK4117_REG_PWRDN 0x00 /* power down */
|
||||
#define AK4117_REG_CLOCK 0x01 /* clock control */
|
||||
#define AK4117_REG_IO 0x02 /* input/output control */
|
||||
#define AK4117_REG_INT0_MASK 0x03 /* interrupt0 mask */
|
||||
#define AK4117_REG_INT1_MASK 0x04 /* interrupt1 mask */
|
||||
#define AK4117_REG_RCS0 0x05 /* receiver status 0 */
|
||||
#define AK4117_REG_RCS1 0x06 /* receiver status 1 */
|
||||
#define AK4117_REG_RCS2 0x07 /* receiver status 2 */
|
||||
#define AK4117_REG_RXCSB0 0x08 /* RX channel status byte 0 */
|
||||
#define AK4117_REG_RXCSB1 0x09 /* RX channel status byte 1 */
|
||||
#define AK4117_REG_RXCSB2 0x0a /* RX channel status byte 2 */
|
||||
#define AK4117_REG_RXCSB3 0x0b /* RX channel status byte 3 */
|
||||
#define AK4117_REG_RXCSB4 0x0c /* RX channel status byte 4 */
|
||||
#define AK4117_REG_Pc0 0x0d /* burst preamble Pc byte 0 */
|
||||
#define AK4117_REG_Pc1 0x0e /* burst preamble Pc byte 1 */
|
||||
#define AK4117_REG_Pd0 0x0f /* burst preamble Pd byte 0 */
|
||||
#define AK4117_REG_Pd1 0x10 /* burst preamble Pd byte 1 */
|
||||
#define AK4117_REG_QSUB_ADDR 0x11 /* Q-subcode address + control */
|
||||
#define AK4117_REG_QSUB_TRACK 0x12 /* Q-subcode track */
|
||||
#define AK4117_REG_QSUB_INDEX 0x13 /* Q-subcode index */
|
||||
#define AK4117_REG_QSUB_MINUTE 0x14 /* Q-subcode minute */
|
||||
#define AK4117_REG_QSUB_SECOND 0x15 /* Q-subcode second */
|
||||
#define AK4117_REG_QSUB_FRAME 0x16 /* Q-subcode frame */
|
||||
#define AK4117_REG_QSUB_ZERO 0x17 /* Q-subcode zero */
|
||||
#define AK4117_REG_QSUB_ABSMIN 0x18 /* Q-subcode absolute minute */
|
||||
#define AK4117_REG_QSUB_ABSSEC 0x19 /* Q-subcode absolute second */
|
||||
#define AK4117_REG_QSUB_ABSFRM 0x1a /* Q-subcode absolute frame */
|
||||
|
||||
/* sizes */
|
||||
#define AK4117_REG_RXCSB_SIZE ((AK4117_REG_RXCSB4-AK4117_REG_RXCSB0)+1)
|
||||
#define AK4117_REG_QSUB_SIZE ((AK4117_REG_QSUB_ABSFRM-AK4117_REG_QSUB_ADDR)+1)
|
||||
|
||||
/* AK4117_REG_PWRDN bits */
|
||||
#define AK4117_EXCT (1<<4) /* 0 = X'tal mode, 1 = external clock mode */
|
||||
#define AK4117_XTL1 (1<<3) /* XTL1=0,XTL0=0 -> 11.2896Mhz; XTL1=0,XTL0=1 -> 12.288Mhz */
|
||||
#define AK4117_XTL0 (1<<2) /* XTL1=1,XTL0=0 -> 24.576Mhz; XTL1=1,XTL0=1 -> use channel status */
|
||||
#define AK4117_XTL_11_2896M (0)
|
||||
#define AK4117_XTL_12_288M AK4117_XTL0
|
||||
#define AK4117_XTL_24_576M AK4117_XTL1
|
||||
#define AK4117_XTL_EXT (AK4117_XTL1|AK4117_XTL0)
|
||||
#define AK4117_PWN (1<<1) /* 0 = power down, 1 = normal operation */
|
||||
#define AK4117_RST (1<<0) /* 0 = reset & initialize (except this register), 1 = normal operation */
|
||||
|
||||
/* AK4117_REQ_CLOCK bits */
|
||||
#define AK4117_LP (1<<7) /* 0 = normal mode, 1 = low power mode (Fs up to 48kHz only) */
|
||||
#define AK4117_PKCS1 (1<<6) /* master clock frequency at PLL mode (when LP == 0) */
|
||||
#define AK4117_PKCS0 (1<<5)
|
||||
#define AK4117_PKCS_512fs (0)
|
||||
#define AK4117_PKCS_256fs AK4117_PKCS0
|
||||
#define AK4117_PKCS_128fs AK4117_PKCS1
|
||||
#define AK4117_DIV (1<<4) /* 0 = MCKO == Fs, 1 = MCKO == Fs / 2; X'tal mode only */
|
||||
#define AK4117_XCKS1 (1<<3) /* master clock frequency at X'tal mode */
|
||||
#define AK4117_XCKS0 (1<<2)
|
||||
#define AK4117_XCKS_128fs (0)
|
||||
#define AK4117_XCKS_256fs AK4117_XCKS0
|
||||
#define AK4117_XCKS_512fs AK4117_XCKS1
|
||||
#define AK4117_XCKS_1024fs (AK4117_XCKS1|AK4117_XCKS0)
|
||||
#define AK4117_CM1 (1<<1) /* MCKO operation mode select */
|
||||
#define AK4117_CM0 (1<<0)
|
||||
#define AK4117_CM_PLL (0) /* use RX input as master clock */
|
||||
#define AK4117_CM_XTAL (AK4117_CM0) /* use X'tal as master clock */
|
||||
#define AK4117_CM_PLL_XTAL (AK4117_CM1) /* use Rx input but X'tal when PLL loses lock */
|
||||
#define AK4117_CM_MONITOR (AK4117_CM0|AK4117_CM1) /* use X'tal as master clock, but use PLL for monitoring */
|
||||
|
||||
/* AK4117_REG_IO */
|
||||
#define AK4117_IPS (1<<7) /* Input Recovery Data Select, 0 = RX0, 1 = RX1 */
|
||||
#define AK4117_UOUTE (1<<6) /* U-bit output enable to UOUT, 0 = disable, 1 = enable */
|
||||
#define AK4117_CS12 (1<<5) /* channel status select, 0 = channel1, 1 = channel2 */
|
||||
#define AK4117_EFH2 (1<<4) /* INT0 pin hold count select */
|
||||
#define AK4117_EFH1 (1<<3)
|
||||
#define AK4117_EFH_512LRCLK (0)
|
||||
#define AK4117_EFH_1024LRCLK (AK4117_EFH1)
|
||||
#define AK4117_EFH_2048LRCLK (AK4117_EFH2)
|
||||
#define AK4117_EFH_4096LRCLK (AK4117_EFH1|AK4117_EFH2)
|
||||
#define AK4117_DIF2 (1<<2) /* audio data format control */
|
||||
#define AK4117_DIF1 (1<<1)
|
||||
#define AK4117_DIF0 (1<<0)
|
||||
#define AK4117_DIF_16R (0) /* STDO: 16-bit, right justified */
|
||||
#define AK4117_DIF_18R (AK4117_DIF0) /* STDO: 18-bit, right justified */
|
||||
#define AK4117_DIF_20R (AK4117_DIF1) /* STDO: 20-bit, right justified */
|
||||
#define AK4117_DIF_24R (AK4117_DIF1|AK4117_DIF0) /* STDO: 24-bit, right justified */
|
||||
#define AK4117_DIF_24L (AK4117_DIF2) /* STDO: 24-bit, left justified */
|
||||
#define AK4117_DIF_24I2S (AK4117_DIF2|AK4117_DIF0) /* STDO: I2S */
|
||||
|
||||
/* AK4117_REG_INT0_MASK & AK4117_REG_INT1_MASK */
|
||||
#define AK4117_MULK (1<<7) /* mask enable for UNLOCK bit */
|
||||
#define AK4117_MPAR (1<<6) /* mask enable for PAR bit */
|
||||
#define AK4117_MAUTO (1<<5) /* mask enable for AUTO bit */
|
||||
#define AK4117_MV (1<<4) /* mask enable for V bit */
|
||||
#define AK4117_MAUD (1<<3) /* mask enable for AUDION bit */
|
||||
#define AK4117_MSTC (1<<2) /* mask enable for STC bit */
|
||||
#define AK4117_MCIT (1<<1) /* mask enable for CINT bit */
|
||||
#define AK4117_MQIT (1<<0) /* mask enable for QINT bit */
|
||||
|
||||
/* AK4117_REG_RCS0 */
|
||||
#define AK4117_UNLCK (1<<7) /* PLL lock status, 0 = lock, 1 = unlock */
|
||||
#define AK4117_PAR (1<<6) /* parity error or biphase error status, 0 = no error, 1 = error */
|
||||
#define AK4117_AUTO (1<<5) /* Non-PCM or DTS stream auto detection, 0 = no detect, 1 = detect */
|
||||
#define AK4117_V (1<<4) /* Validity bit, 0 = valid, 1 = invalid */
|
||||
#define AK4117_AUDION (1<<3) /* audio bit output, 0 = audio, 1 = non-audio */
|
||||
#define AK4117_STC (1<<2) /* sampling frequency or Pre-emphasis change, 0 = no detect, 1 = detect */
|
||||
#define AK4117_CINT (1<<1) /* channel status buffer interrupt, 0 = no change, 1 = change */
|
||||
#define AK4117_QINT (1<<0) /* Q-subcode buffer interrupt, 0 = no change, 1 = changed */
|
||||
|
||||
/* AK4117_REG_RCS1 */
|
||||
#define AK4117_DTSCD (1<<6) /* DTS-CD bit audio stream detect, 0 = no detect, 1 = detect */
|
||||
#define AK4117_NPCM (1<<5) /* Non-PCM bit stream detection, 0 = no detect, 1 = detect */
|
||||
#define AK4117_PEM (1<<4) /* Pre-emphasis detect, 0 = OFF, 1 = ON */
|
||||
#define AK4117_FS3 (1<<3) /* sampling frequency detection */
|
||||
#define AK4117_FS2 (1<<2)
|
||||
#define AK4117_FS1 (1<<1)
|
||||
#define AK4117_FS0 (1<<0)
|
||||
#define AK4117_FS_44100HZ (0)
|
||||
#define AK4117_FS_48000HZ (AK4117_FS1)
|
||||
#define AK4117_FS_32000HZ (AK4117_FS1|AK4117_FS0)
|
||||
#define AK4117_FS_88200HZ (AK4117_FS3)
|
||||
#define AK4117_FS_96000HZ (AK4117_FS3|AK4117_FS1)
|
||||
#define AK4117_FS_176400HZ (AK4117_FS3|AK4117_FS2)
|
||||
#define AK4117_FS_192000HZ (AK4117_FS3|AK4117_FS2|AK4117_FS1)
|
||||
|
||||
/* AK4117_REG_RCS2 */
|
||||
#define AK4117_CCRC (1<<1) /* CRC for channel status, 0 = no error, 1 = error */
|
||||
#define AK4117_QCRC (1<<0) /* CRC for Q-subcode, 0 = no error, 1 = error */
|
||||
|
||||
/* flags for snd_ak4117_check_rate_and_errors() */
|
||||
#define AK4117_CHECK_NO_STAT (1<<0) /* no statistics */
|
||||
#define AK4117_CHECK_NO_RATE (1<<1) /* no rate check */
|
||||
|
||||
#define AK4117_CONTROLS 13
|
||||
|
||||
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);
|
||||
|
||||
struct ak4117 {
|
||||
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];
|
||||
struct snd_kcontrol *kctls[AK4117_CONTROLS];
|
||||
struct snd_pcm_substream *substream;
|
||||
unsigned long parity_errors;
|
||||
unsigned long v_bit_errors;
|
||||
unsigned long qcrc_errors;
|
||||
unsigned long ccrc_errors;
|
||||
unsigned char rcs0;
|
||||
unsigned char rcs1;
|
||||
unsigned char rcs2;
|
||||
struct timer_list timer; /* statistic timer */
|
||||
void *change_callback_private;
|
||||
void (*change_callback)(struct ak4117 *ak4117, unsigned char c0, unsigned char c1);
|
||||
};
|
||||
|
||||
int snd_ak4117_create(struct snd_card *card, ak4117_read_t *read, ak4117_write_t *write,
|
||||
const 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 */
|
||||
|
||||
85
include/sound/ak4531_codec.h
Normal file
85
include/sound/ak4531_codec.h
Normal file
@@ -0,0 +1,85 @@
|
||||
#ifndef __SOUND_AK4531_CODEC_H
|
||||
#define __SOUND_AK4531_CODEC_H
|
||||
|
||||
/*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
* Universal interface for Audio Codec '97
|
||||
*
|
||||
* For more details look to AC '97 component specification revision 2.1
|
||||
* by Intel Corporation (http://developer.intel.com).
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "info.h"
|
||||
#include "control.h"
|
||||
|
||||
/*
|
||||
* ASAHI KASEI - AK4531 codec
|
||||
* - not really AC'97 codec, but it uses very similar interface as AC'97
|
||||
*/
|
||||
|
||||
/*
|
||||
* AK4531 codec registers
|
||||
*/
|
||||
|
||||
#define AK4531_LMASTER 0x00 /* master volume left */
|
||||
#define AK4531_RMASTER 0x01 /* master volume right */
|
||||
#define AK4531_LVOICE 0x02 /* channel volume left */
|
||||
#define AK4531_RVOICE 0x03 /* channel volume right */
|
||||
#define AK4531_LFM 0x04 /* FM volume left */
|
||||
#define AK4531_RFM 0x05 /* FM volume right */
|
||||
#define AK4531_LCD 0x06 /* CD volume left */
|
||||
#define AK4531_RCD 0x07 /* CD volume right */
|
||||
#define AK4531_LLINE 0x08 /* LINE volume left */
|
||||
#define AK4531_RLINE 0x09 /* LINE volume right */
|
||||
#define AK4531_LAUXA 0x0a /* AUXA volume left */
|
||||
#define AK4531_RAUXA 0x0b /* AUXA volume right */
|
||||
#define AK4531_MONO1 0x0c /* MONO1 volume left */
|
||||
#define AK4531_MONO2 0x0d /* MONO1 volume right */
|
||||
#define AK4531_MIC 0x0e /* MIC volume */
|
||||
#define AK4531_MONO_OUT 0x0f /* Mono-out volume */
|
||||
#define AK4531_OUT_SW1 0x10 /* Output mixer switch 1 */
|
||||
#define AK4531_OUT_SW2 0x11 /* Output mixer switch 2 */
|
||||
#define AK4531_LIN_SW1 0x12 /* Input left mixer switch 1 */
|
||||
#define AK4531_RIN_SW1 0x13 /* Input right mixer switch 1 */
|
||||
#define AK4531_LIN_SW2 0x14 /* Input left mixer switch 2 */
|
||||
#define AK4531_RIN_SW2 0x15 /* Input right mixer switch 2 */
|
||||
#define AK4531_RESET 0x16 /* Reset & power down */
|
||||
#define AK4531_CLOCK 0x17 /* Clock select */
|
||||
#define AK4531_AD_IN 0x18 /* AD input select */
|
||||
#define AK4531_MIC_GAIN 0x19 /* MIC amplified gain */
|
||||
|
||||
struct snd_ak4531 {
|
||||
void (*write) (struct snd_ak4531 *ak4531, unsigned short reg,
|
||||
unsigned short val);
|
||||
void *private_data;
|
||||
void (*private_free) (struct snd_ak4531 *ak4531);
|
||||
/* --- */
|
||||
unsigned char regs[0x20];
|
||||
struct mutex reg_mutex;
|
||||
};
|
||||
|
||||
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 */
|
||||
96
include/sound/ak4xxx-adda.h
Normal file
96
include/sound/ak4xxx-adda.h
Normal file
@@ -0,0 +1,96 @@
|
||||
#ifndef __SOUND_AK4XXX_ADDA_H
|
||||
#define __SOUND_AK4XXX_ADDA_H
|
||||
|
||||
/*
|
||||
* ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381
|
||||
* AD and DA converters
|
||||
*
|
||||
* Copyright (c) 2000 Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AK4XXX_MAX_CHIPS
|
||||
#define AK4XXX_MAX_CHIPS 4
|
||||
#endif
|
||||
|
||||
struct snd_akm4xxx;
|
||||
|
||||
struct snd_ak4xxx_ops {
|
||||
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);
|
||||
void (*set_rate_val)(struct snd_akm4xxx *ak, unsigned int rate);
|
||||
};
|
||||
|
||||
#define AK4XXX_IMAGE_SIZE (AK4XXX_MAX_CHIPS * 16) /* 64 bytes */
|
||||
|
||||
/* DAC label and channels */
|
||||
struct snd_akm4xxx_dac_channel {
|
||||
char *name; /* mixer volume name */
|
||||
unsigned int num_channels;
|
||||
char *switch_name; /* mixer switch*/
|
||||
};
|
||||
|
||||
/* ADC labels and channels */
|
||||
struct snd_akm4xxx_adc_channel {
|
||||
char *name; /* capture gain volume label */
|
||||
char *switch_name; /* capture switch */
|
||||
unsigned int num_channels;
|
||||
char *selector_name; /* capture source select label */
|
||||
const char **input_names; /* capture source names (NULL terminated) */
|
||||
};
|
||||
|
||||
struct snd_akm4xxx {
|
||||
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 */
|
||||
unsigned char volumes[AK4XXX_IMAGE_SIZE]; /* saved volume values */
|
||||
unsigned long private_value[AK4XXX_MAX_CHIPS]; /* helper for driver */
|
||||
void *private_data[AK4XXX_MAX_CHIPS]; /* helper for driver */
|
||||
/* template should fill the following fields */
|
||||
unsigned int idx_offset; /* control index offset */
|
||||
enum {
|
||||
SND_AK4524, SND_AK4528, SND_AK4529,
|
||||
SND_AK4355, SND_AK4358, SND_AK4381,
|
||||
SND_AK5365
|
||||
} type;
|
||||
|
||||
/* (array) information of combined codecs */
|
||||
const struct snd_akm4xxx_dac_channel *dac_info;
|
||||
const struct snd_akm4xxx_adc_channel *adc_info;
|
||||
|
||||
struct snd_ak4xxx_ops ops;
|
||||
};
|
||||
|
||||
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))
|
||||
#define snd_akm4xxx_get_vol(ak,chip,reg) \
|
||||
(ak)->volumes[(chip) * 16 + (reg)]
|
||||
#define snd_akm4xxx_set_vol(ak,chip,reg,val) \
|
||||
((ak)->volumes[(chip) * 16 + (reg)] = (val))
|
||||
|
||||
#endif /* __SOUND_AK4XXX_ADDA_H */
|
||||
916
include/sound/asequencer.h
Normal file
916
include/sound/asequencer.h
Normal file
@@ -0,0 +1,916 @@
|
||||
/*
|
||||
* Main header file for the ALSA sequencer
|
||||
* Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
|
||||
* (c) 1998-1999 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
#ifndef __SOUND_ASEQUENCER_H
|
||||
#define __SOUND_ASEQUENCER_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/ioctl.h>
|
||||
#include <sound/asound.h>
|
||||
#endif
|
||||
|
||||
/** version of the sequencer */
|
||||
#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION (1, 0, 1)
|
||||
|
||||
/**
|
||||
* definition of sequencer event types
|
||||
*/
|
||||
|
||||
/** system messages
|
||||
* 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 = #snd_seq_ev_note
|
||||
*/
|
||||
#define SNDRV_SEQ_EVENT_NOTE 5
|
||||
#define SNDRV_SEQ_EVENT_NOTEON 6
|
||||
#define SNDRV_SEQ_EVENT_NOTEOFF 7
|
||||
#define SNDRV_SEQ_EVENT_KEYPRESS 8
|
||||
|
||||
/** control messages (channel specific)
|
||||
* event data type = #snd_seq_ev_ctrl
|
||||
*/
|
||||
#define SNDRV_SEQ_EVENT_CONTROLLER 10
|
||||
#define SNDRV_SEQ_EVENT_PGMCHANGE 11
|
||||
#define SNDRV_SEQ_EVENT_CHANPRESS 12
|
||||
#define SNDRV_SEQ_EVENT_PITCHBEND 13 /**< from -8192 to 8191 */
|
||||
#define SNDRV_SEQ_EVENT_CONTROL14 14 /**< 14 bit controller value */
|
||||
#define SNDRV_SEQ_EVENT_NONREGPARAM 15 /**< 14 bit NRPN address + 14 bit unsigned value */
|
||||
#define SNDRV_SEQ_EVENT_REGPARAM 16 /**< 14 bit RPN address + 14 bit unsigned value */
|
||||
|
||||
/** synchronisation messages
|
||||
* 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 */
|
||||
#define SNDRV_SEQ_EVENT_QFRAME 22 /* midi time code quarter frame */
|
||||
#define SNDRV_SEQ_EVENT_TIMESIGN 23 /* SMF Time Signature event */
|
||||
#define SNDRV_SEQ_EVENT_KEYSIGN 24 /* SMF Key Signature event */
|
||||
|
||||
/** timer messages
|
||||
* 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 */
|
||||
#define SNDRV_SEQ_EVENT_STOP 32 /* midi Real Time Stop message */
|
||||
#define SNDRV_SEQ_EVENT_SETPOS_TICK 33 /* set tick queue position */
|
||||
#define SNDRV_SEQ_EVENT_SETPOS_TIME 34 /* set realtime queue position */
|
||||
#define SNDRV_SEQ_EVENT_TEMPO 35 /* (SMF) Tempo event */
|
||||
#define SNDRV_SEQ_EVENT_CLOCK 36 /* midi Real Time Clock message */
|
||||
#define SNDRV_SEQ_EVENT_TICK 37 /* midi Real Time Tick message */
|
||||
#define SNDRV_SEQ_EVENT_QUEUE_SKEW 38 /* skew queue tempo */
|
||||
|
||||
/** others
|
||||
* event data type = none
|
||||
*/
|
||||
#define SNDRV_SEQ_EVENT_TUNE_REQUEST 40 /* tune request */
|
||||
#define SNDRV_SEQ_EVENT_RESET 41 /* reset to power-on state */
|
||||
#define SNDRV_SEQ_EVENT_SENSING 42 /* "active sensing" event */
|
||||
|
||||
/** echo back, kernel private messages
|
||||
* event data type = any type
|
||||
*/
|
||||
#define SNDRV_SEQ_EVENT_ECHO 50 /* echo event */
|
||||
#define SNDRV_SEQ_EVENT_OSS 51 /* OSS raw event */
|
||||
|
||||
/** system status messages (broadcast for subscribers)
|
||||
* 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 */
|
||||
#define SNDRV_SEQ_EVENT_CLIENT_CHANGE 62 /* client status/info has changed */
|
||||
#define SNDRV_SEQ_EVENT_PORT_START 63 /* new port was created */
|
||||
#define SNDRV_SEQ_EVENT_PORT_EXIT 64 /* port was deleted from system */
|
||||
#define SNDRV_SEQ_EVENT_PORT_CHANGE 65 /* port status/info has changed */
|
||||
|
||||
/** port connection changes
|
||||
* 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 = snd_seq_eve_sample_control
|
||||
*/
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE 70 /* sample select */
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE_CLUSTER 71 /* sample cluster select */
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE_START 72 /* voice start */
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE_STOP 73 /* voice stop */
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE_FREQ 74 /* playback frequency */
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE_VOLUME 75 /* volume and balance */
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE_LOOP 76 /* sample loop */
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE_POSITION 77 /* sample position */
|
||||
#define SNDRV_SEQ_EVENT_SAMPLE_PRIVATE1 78 /* private (hardware dependent) event */
|
||||
|
||||
/** user-defined events with fixed length
|
||||
* event data type = any
|
||||
*/
|
||||
#define SNDRV_SEQ_EVENT_USR0 90
|
||||
#define SNDRV_SEQ_EVENT_USR1 91
|
||||
#define SNDRV_SEQ_EVENT_USR2 92
|
||||
#define SNDRV_SEQ_EVENT_USR3 93
|
||||
#define SNDRV_SEQ_EVENT_USR4 94
|
||||
#define SNDRV_SEQ_EVENT_USR5 95
|
||||
#define SNDRV_SEQ_EVENT_USR6 96
|
||||
#define SNDRV_SEQ_EVENT_USR7 97
|
||||
#define SNDRV_SEQ_EVENT_USR8 98
|
||||
#define SNDRV_SEQ_EVENT_USR9 99
|
||||
|
||||
/** instrument layer
|
||||
* variable length data can be passed directly to the driver
|
||||
*/
|
||||
#define SNDRV_SEQ_EVENT_INSTR_BEGIN 100 /* begin of instrument management */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_END 101 /* end of instrument management */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_INFO 102 /* instrument interface info */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_INFO_RESULT 103 /* result */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_FINFO 104 /* get format info */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_FINFO_RESULT 105 /* get format info */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_RESET 106 /* reset instrument memory */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_STATUS 107 /* instrument interface status */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_STATUS_RESULT 108 /* result */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_PUT 109 /* put instrument to port */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_GET 110 /* get instrument from port */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_GET_RESULT 111 /* result */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_FREE 112 /* free instrument(s) */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_LIST 113 /* instrument list */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_LIST_RESULT 114 /* result */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_CLUSTER 115 /* cluster parameters */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_CLUSTER_GET 116 /* get cluster parameters */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_CLUSTER_RESULT 117 /* result */
|
||||
#define SNDRV_SEQ_EVENT_INSTR_CHANGE 118 /* instrument change */
|
||||
/* 119-129: reserved */
|
||||
|
||||
/* 130-139: variable length events
|
||||
* 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) */
|
||||
#define SNDRV_SEQ_EVENT_BOUNCE 131 /* error event */
|
||||
/* 132-134: reserved */
|
||||
#define SNDRV_SEQ_EVENT_USR_VAR0 135
|
||||
#define SNDRV_SEQ_EVENT_USR_VAR1 136
|
||||
#define SNDRV_SEQ_EVENT_USR_VAR2 137
|
||||
#define SNDRV_SEQ_EVENT_USR_VAR3 138
|
||||
#define SNDRV_SEQ_EVENT_USR_VAR4 139
|
||||
|
||||
/* 150-151: kernel events with quote - DO NOT use in user clients */
|
||||
#define SNDRV_SEQ_EVENT_KERNEL_ERROR 150
|
||||
#define SNDRV_SEQ_EVENT_KERNEL_QUOTE 151 /* obsolete */
|
||||
|
||||
/* 152-191: reserved */
|
||||
|
||||
/* 192-254: hardware specific events */
|
||||
|
||||
/* 255: special event */
|
||||
#define SNDRV_SEQ_EVENT_NONE 255
|
||||
|
||||
|
||||
typedef unsigned char snd_seq_event_type_t;
|
||||
|
||||
/** event address */
|
||||
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 snd_seq_connect {
|
||||
struct snd_seq_addr sender;
|
||||
struct snd_seq_addr dest;
|
||||
};
|
||||
|
||||
|
||||
#define SNDRV_SEQ_ADDRESS_UNKNOWN 253 /* unknown source */
|
||||
#define SNDRV_SEQ_ADDRESS_SUBSCRIBERS 254 /* send event to all subscribed ports */
|
||||
#define SNDRV_SEQ_ADDRESS_BROADCAST 255 /* send event to all queues/clients/ports/channels */
|
||||
#define SNDRV_SEQ_QUEUE_DIRECT 253 /* direct dispatch */
|
||||
|
||||
/* event mode flag - NOTE: only 8 bits available! */
|
||||
#define SNDRV_SEQ_TIME_STAMP_TICK (0<<0) /* timestamp in clock ticks */
|
||||
#define SNDRV_SEQ_TIME_STAMP_REAL (1<<0) /* timestamp in real time */
|
||||
#define SNDRV_SEQ_TIME_STAMP_MASK (1<<0)
|
||||
|
||||
#define SNDRV_SEQ_TIME_MODE_ABS (0<<1) /* absolute timestamp */
|
||||
#define SNDRV_SEQ_TIME_MODE_REL (1<<1) /* relative to current time */
|
||||
#define SNDRV_SEQ_TIME_MODE_MASK (1<<1)
|
||||
|
||||
#define SNDRV_SEQ_EVENT_LENGTH_FIXED (0<<2) /* fixed event size */
|
||||
#define SNDRV_SEQ_EVENT_LENGTH_VARIABLE (1<<2) /* variable event size */
|
||||
#define SNDRV_SEQ_EVENT_LENGTH_VARUSR (2<<2) /* variable event size - user memory space */
|
||||
#define SNDRV_SEQ_EVENT_LENGTH_MASK (3<<2)
|
||||
|
||||
#define SNDRV_SEQ_PRIORITY_NORMAL (0<<4) /* normal priority */
|
||||
#define SNDRV_SEQ_PRIORITY_HIGH (1<<4) /* event should be processed before others */
|
||||
#define SNDRV_SEQ_PRIORITY_MASK (1<<4)
|
||||
|
||||
|
||||
/* note event */
|
||||
struct snd_seq_ev_note {
|
||||
unsigned char channel;
|
||||
unsigned char note;
|
||||
unsigned char velocity;
|
||||
unsigned char off_velocity; /* only for SNDRV_SEQ_EVENT_NOTE */
|
||||
unsigned int duration; /* only for SNDRV_SEQ_EVENT_NOTE */
|
||||
};
|
||||
|
||||
/* controller event */
|
||||
struct snd_seq_ev_ctrl {
|
||||
unsigned char channel;
|
||||
unsigned char unused1, unused2, unused3; /* pad */
|
||||
unsigned int param;
|
||||
signed int value;
|
||||
};
|
||||
|
||||
/* generic set of bytes (12x8 bit) */
|
||||
struct snd_seq_ev_raw8 {
|
||||
unsigned char d[12]; /* 8 bit value */
|
||||
};
|
||||
|
||||
/* generic set of integers (3x32 bit) */
|
||||
struct snd_seq_ev_raw32 {
|
||||
unsigned int d[3]; /* 32 bit value */
|
||||
};
|
||||
|
||||
/* external stored data */
|
||||
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 snd_seq_instr_cluster_t;
|
||||
|
||||
/* Instrument type */
|
||||
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 snd_seq_ev_sample {
|
||||
unsigned int std;
|
||||
unsigned short bank;
|
||||
unsigned short prg;
|
||||
};
|
||||
|
||||
/* sample cluster */
|
||||
struct snd_seq_ev_cluster {
|
||||
snd_seq_instr_cluster_t cluster;
|
||||
};
|
||||
|
||||
/* sample position */
|
||||
typedef unsigned int snd_seq_position_t; /* playback position (in samples) * 16 */
|
||||
|
||||
/* sample 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 snd_seq_frequency_t; /* playback frequency in HZ * 16 */
|
||||
|
||||
/* sample volume control; if any value is set to -1 == do not change */
|
||||
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 */
|
||||
signed short du; /* down-up balance; range: 0-16383 */
|
||||
};
|
||||
|
||||
/* simple loop redefinition */
|
||||
struct snd_seq_ev_loop {
|
||||
unsigned int start; /* loop start (in samples) * 16 */
|
||||
unsigned int end; /* loop end (in samples) * 16 */
|
||||
};
|
||||
|
||||
struct snd_seq_ev_sample_control {
|
||||
unsigned char channel;
|
||||
unsigned char unused1, unused2, unused3; /* pad */
|
||||
union {
|
||||
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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* INSTR_BEGIN event */
|
||||
struct snd_seq_ev_instr_begin {
|
||||
int timeout; /* zero = forever, otherwise timeout in ms */
|
||||
};
|
||||
|
||||
struct snd_seq_result {
|
||||
int event; /* processed event type */
|
||||
int result;
|
||||
};
|
||||
|
||||
|
||||
struct snd_seq_real_time {
|
||||
unsigned int tv_sec; /* seconds */
|
||||
unsigned int tv_nsec; /* nanoseconds */
|
||||
};
|
||||
|
||||
typedef unsigned int snd_seq_tick_time_t; /* midi ticks */
|
||||
|
||||
union snd_seq_timestamp {
|
||||
snd_seq_tick_time_t tick;
|
||||
struct snd_seq_real_time time;
|
||||
};
|
||||
|
||||
struct snd_seq_queue_skew {
|
||||
unsigned int value;
|
||||
unsigned int base;
|
||||
};
|
||||
|
||||
/* queue timer 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 snd_seq_timestamp time; /* time */
|
||||
unsigned int position; /* sync position */
|
||||
struct snd_seq_queue_skew skew;
|
||||
unsigned int d32[2];
|
||||
unsigned char d8[8];
|
||||
} param;
|
||||
};
|
||||
|
||||
/* quoted event - inside the kernel only */
|
||||
struct snd_seq_ev_quote {
|
||||
struct snd_seq_addr origin; /* original sender */
|
||||
unsigned short value; /* optional data */
|
||||
struct snd_seq_event *event; /* quoted event */
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
/* sequencer event */
|
||||
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 snd_seq_timestamp time; /* schedule time */
|
||||
|
||||
|
||||
struct snd_seq_addr source; /* source address */
|
||||
struct snd_seq_addr dest; /* destination address */
|
||||
|
||||
union { /* event data... */
|
||||
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;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* bounce event - stored as variable size data
|
||||
*/
|
||||
struct snd_seq_event_bounce {
|
||||
int err;
|
||||
struct snd_seq_event event;
|
||||
/* external data follows here. */
|
||||
};
|
||||
|
||||
#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 snd_seq_ev_is_result_type(ev) ((ev)->type < 5)
|
||||
/* channel specific events: 5-19 */
|
||||
#define snd_seq_ev_is_channel_type(ev) ((ev)->type >= 5 && (ev)->type < 20)
|
||||
/* note events: 5-9 */
|
||||
#define snd_seq_ev_is_note_type(ev) ((ev)->type >= 5 && (ev)->type < 10)
|
||||
/* control events: 10-19 */
|
||||
#define snd_seq_ev_is_control_type(ev) ((ev)->type >= 10 && (ev)->type < 20)
|
||||
/* queue control events: 30-39 */
|
||||
#define snd_seq_ev_is_queue_type(ev) ((ev)->type >= 30 && (ev)->type < 40)
|
||||
/* system status messages */
|
||||
#define snd_seq_ev_is_message_type(ev) ((ev)->type >= 60 && (ev)->type < 69)
|
||||
/* sample messages */
|
||||
#define snd_seq_ev_is_sample_type(ev) ((ev)->type >= 70 && (ev)->type < 79)
|
||||
/* user-defined messages */
|
||||
#define snd_seq_ev_is_user_type(ev) ((ev)->type >= 90 && (ev)->type < 99)
|
||||
/* fixed length events: 0-99 */
|
||||
#define snd_seq_ev_is_fixed_type(ev) ((ev)->type < 100)
|
||||
/* instrument layer events: 100-129 */
|
||||
#define snd_seq_ev_is_instr_type(ev) ((ev)->type >= 100 && (ev)->type < 130)
|
||||
/* variable length events: 130-139 */
|
||||
#define snd_seq_ev_is_variable_type(ev) ((ev)->type >= 130 && (ev)->type < 140)
|
||||
/* reserved for kernel */
|
||||
#define snd_seq_ev_is_reserved(ev) ((ev)->type >= 150)
|
||||
|
||||
/* direct dispatched events */
|
||||
#define snd_seq_ev_is_direct(ev) ((ev)->queue == SNDRV_SEQ_QUEUE_DIRECT)
|
||||
|
||||
/*
|
||||
* macros to check event flags
|
||||
*/
|
||||
/* prior events */
|
||||
#define snd_seq_ev_is_prior(ev) (((ev)->flags & SNDRV_SEQ_PRIORITY_MASK) == SNDRV_SEQ_PRIORITY_HIGH)
|
||||
|
||||
/* event length type */
|
||||
#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 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 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 snd_seq_queue_sync_port(q) ((q) + 16)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
/* system information */
|
||||
struct snd_seq_system_info {
|
||||
int queues; /* maximum queues count */
|
||||
int clients; /* maximum clients count */
|
||||
int ports; /* maximum ports per client */
|
||||
int channels; /* maximum channels per port */
|
||||
int cur_clients; /* current clients */
|
||||
int cur_queues; /* current queues */
|
||||
char reserved[24];
|
||||
};
|
||||
|
||||
|
||||
/* system running information */
|
||||
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 */
|
||||
unsigned char pad; /* reserved */
|
||||
unsigned char reserved[12];
|
||||
};
|
||||
|
||||
|
||||
/* known client numbers */
|
||||
#define SNDRV_SEQ_CLIENT_SYSTEM 0
|
||||
/* internal client numbers */
|
||||
#define SNDRV_SEQ_CLIENT_DUMMY 14 /* midi through */
|
||||
#define SNDRV_SEQ_CLIENT_OSS 15 /* oss sequencer emulator */
|
||||
|
||||
|
||||
/* client types */
|
||||
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 */
|
||||
#define SNDRV_SEQ_FILTER_MULTICAST (1<<1) /* accept multicast messages */
|
||||
#define SNDRV_SEQ_FILTER_BOUNCE (1<<2) /* accept bounce event in error */
|
||||
#define SNDRV_SEQ_FILTER_USE_EVENT (1<<31) /* use event filter */
|
||||
|
||||
struct snd_seq_client_info {
|
||||
int client; /* client number to inquire */
|
||||
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 */
|
||||
unsigned char event_filter[32]; /* event filter bitmap */
|
||||
int num_ports; /* RO: number of ports */
|
||||
int event_lost; /* number of lost events */
|
||||
char reserved[64]; /* for future use */
|
||||
};
|
||||
|
||||
|
||||
/* client pool size */
|
||||
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 */
|
||||
int output_room; /* minimum free pool size for select/blocking mode */
|
||||
int output_free; /* unused size */
|
||||
int input_free; /* unused size */
|
||||
char reserved[64];
|
||||
};
|
||||
|
||||
|
||||
/* Remove events by specified criteria */
|
||||
|
||||
#define SNDRV_SEQ_REMOVE_INPUT (1<<0) /* Flush input queues */
|
||||
#define SNDRV_SEQ_REMOVE_OUTPUT (1<<1) /* Flush output queues */
|
||||
#define SNDRV_SEQ_REMOVE_DEST (1<<2) /* Restrict by destination q:client:port */
|
||||
#define SNDRV_SEQ_REMOVE_DEST_CHANNEL (1<<3) /* Restrict by channel */
|
||||
#define SNDRV_SEQ_REMOVE_TIME_BEFORE (1<<4) /* Restrict to before time */
|
||||
#define SNDRV_SEQ_REMOVE_TIME_AFTER (1<<5) /* Restrict to time or after */
|
||||
#define SNDRV_SEQ_REMOVE_TIME_TICK (1<<6) /* Time is in ticks */
|
||||
#define SNDRV_SEQ_REMOVE_EVENT_TYPE (1<<7) /* Restrict to event type */
|
||||
#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 snd_seq_remove_events {
|
||||
unsigned int remove_mode; /* Flags that determine what gets removed */
|
||||
|
||||
union snd_seq_timestamp time;
|
||||
|
||||
unsigned char queue; /* Queue 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 */
|
||||
char tag; /* Tag for REMOVE_TAG */
|
||||
|
||||
int reserved[10]; /* To allow for future binary compatibility */
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* known port numbers */
|
||||
#define SNDRV_SEQ_PORT_SYSTEM_TIMER 0
|
||||
#define SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE 1
|
||||
|
||||
/* port capabilities (32 bits) */
|
||||
#define SNDRV_SEQ_PORT_CAP_READ (1<<0) /* readable from this port */
|
||||
#define SNDRV_SEQ_PORT_CAP_WRITE (1<<1) /* writable to this port */
|
||||
|
||||
#define SNDRV_SEQ_PORT_CAP_SYNC_READ (1<<2)
|
||||
#define SNDRV_SEQ_PORT_CAP_SYNC_WRITE (1<<3)
|
||||
|
||||
#define SNDRV_SEQ_PORT_CAP_DUPLEX (1<<4)
|
||||
|
||||
#define SNDRV_SEQ_PORT_CAP_SUBS_READ (1<<5) /* allow read subscription */
|
||||
#define SNDRV_SEQ_PORT_CAP_SUBS_WRITE (1<<6) /* allow write subscription */
|
||||
#define SNDRV_SEQ_PORT_CAP_NO_EXPORT (1<<7) /* routing not allowed */
|
||||
|
||||
/* port type */
|
||||
#define SNDRV_SEQ_PORT_TYPE_SPECIFIC (1<<0) /* hardware specific */
|
||||
#define SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1) /* generic MIDI device */
|
||||
#define SNDRV_SEQ_PORT_TYPE_MIDI_GM (1<<2) /* General MIDI compatible device */
|
||||
#define SNDRV_SEQ_PORT_TYPE_MIDI_GS (1<<3) /* GS compatible device */
|
||||
#define SNDRV_SEQ_PORT_TYPE_MIDI_XG (1<<4) /* XG compatible device */
|
||||
#define SNDRV_SEQ_PORT_TYPE_MIDI_MT32 (1<<5) /* MT-32 compatible device */
|
||||
#define SNDRV_SEQ_PORT_TYPE_MIDI_GM2 (1<<6) /* General MIDI 2 compatible device */
|
||||
|
||||
/* other standards...*/
|
||||
#define SNDRV_SEQ_PORT_TYPE_SYNTH (1<<10) /* Synth device (no MIDI compatible - direct wavetable) */
|
||||
#define SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE (1<<11) /* Sampling device (support sample download) */
|
||||
#define SNDRV_SEQ_PORT_TYPE_SAMPLE (1<<12) /* Sampling device (sample can be downloaded at any time) */
|
||||
/*...*/
|
||||
#define SNDRV_SEQ_PORT_TYPE_HARDWARE (1<<16) /* driver for a hardware device */
|
||||
#define SNDRV_SEQ_PORT_TYPE_SOFTWARE (1<<17) /* implemented in software */
|
||||
#define SNDRV_SEQ_PORT_TYPE_SYNTHESIZER (1<<18) /* generates sound */
|
||||
#define SNDRV_SEQ_PORT_TYPE_PORT (1<<19) /* connects to other device(s) */
|
||||
#define SNDRV_SEQ_PORT_TYPE_APPLICATION (1<<20) /* application (sequencer/editor) */
|
||||
|
||||
/* misc. conditioning flags */
|
||||
#define SNDRV_SEQ_PORT_FLG_GIVEN_PORT (1<<0)
|
||||
#define SNDRV_SEQ_PORT_FLG_TIMESTAMP (1<<1)
|
||||
#define SNDRV_SEQ_PORT_FLG_TIME_REAL (1<<2)
|
||||
|
||||
struct snd_seq_port_info {
|
||||
struct snd_seq_addr addr; /* client/port numbers */
|
||||
char name[64]; /* port name */
|
||||
|
||||
unsigned int capability; /* port capability bits */
|
||||
unsigned int type; /* port type bits */
|
||||
int midi_channels; /* channels per MIDI port */
|
||||
int midi_voices; /* voices per MIDI port */
|
||||
int synth_voices; /* voices per SYNTH port */
|
||||
|
||||
int read_use; /* R/O: subscribers for output (from this port) */
|
||||
int write_use; /* R/O: subscribers for input (to this port) */
|
||||
|
||||
void *kernel; /* reserved for kernel use (must be NULL) */
|
||||
unsigned int flags; /* misc. conditioning */
|
||||
unsigned char time_queue; /* queue # for timestamping */
|
||||
char reserved[59]; /* for future use */
|
||||
};
|
||||
|
||||
|
||||
/* queue flags */
|
||||
#define SNDRV_SEQ_QUEUE_FLG_SYNC (1<<0) /* sync enabled */
|
||||
|
||||
/* queue information */
|
||||
struct snd_seq_queue_info {
|
||||
int queue; /* queue id */
|
||||
|
||||
/*
|
||||
* security settings, only owner of this queue can start/stop timer
|
||||
* etc. if the queue is locked for other clients
|
||||
*/
|
||||
int owner; /* client id for owner of the queue */
|
||||
unsigned locked:1; /* timing queue locked for other queues */
|
||||
char name[64]; /* name of this queue */
|
||||
unsigned int flags; /* flags */
|
||||
char reserved[60]; /* for future use */
|
||||
|
||||
};
|
||||
|
||||
/* queue info/status */
|
||||
struct snd_seq_queue_status {
|
||||
int queue; /* queue id */
|
||||
int events; /* read-only - queue size */
|
||||
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 */
|
||||
};
|
||||
|
||||
|
||||
/* queue tempo */
|
||||
struct snd_seq_queue_tempo {
|
||||
int queue; /* sequencer queue */
|
||||
unsigned int tempo; /* current tempo, us/tick */
|
||||
int ppq; /* time resolution, ticks/quarter */
|
||||
unsigned int skew_value; /* queue skew */
|
||||
unsigned int skew_base; /* queue skew base */
|
||||
char reserved[24]; /* for the future */
|
||||
};
|
||||
|
||||
|
||||
/* sequencer timer sources */
|
||||
#define SNDRV_SEQ_TIMER_ALSA 0 /* ALSA timer */
|
||||
#define SNDRV_SEQ_TIMER_MIDI_CLOCK 1 /* Midi Clock (CLOCK event) */
|
||||
#define SNDRV_SEQ_TIMER_MIDI_TICK 2 /* Midi Timer Tick (TICK event) */
|
||||
|
||||
/* queue timer info */
|
||||
struct snd_seq_queue_timer {
|
||||
int queue; /* sequencer queue */
|
||||
int type; /* source timer type */
|
||||
union {
|
||||
struct {
|
||||
struct snd_timer_id id; /* ALSA's timer ID */
|
||||
unsigned int resolution; /* resolution in Hz */
|
||||
} alsa;
|
||||
} u;
|
||||
char reserved[64]; /* for the future use */
|
||||
};
|
||||
|
||||
|
||||
struct snd_seq_queue_client {
|
||||
int queue; /* sequencer queue */
|
||||
int client; /* sequencer client */
|
||||
int used; /* queue is used with this client
|
||||
(must be set for accepting events) */
|
||||
/* per client watermarks */
|
||||
char reserved[64]; /* for future use */
|
||||
};
|
||||
|
||||
|
||||
#define SNDRV_SEQ_PORT_SUBS_EXCLUSIVE (1<<0) /* exclusive connection */
|
||||
#define SNDRV_SEQ_PORT_SUBS_TIMESTAMP (1<<1)
|
||||
#define SNDRV_SEQ_PORT_SUBS_TIME_REAL (1<<2)
|
||||
|
||||
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) */
|
||||
unsigned char pad[3]; /* reserved */
|
||||
char reserved[64];
|
||||
};
|
||||
|
||||
/* type of query subscription */
|
||||
#define SNDRV_SEQ_QUERY_SUBS_READ 0
|
||||
#define SNDRV_SEQ_QUERY_SUBS_WRITE 1
|
||||
|
||||
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 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 */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Instrument abstraction layer
|
||||
* - based on events
|
||||
*/
|
||||
|
||||
/* instrument types */
|
||||
#define SNDRV_SEQ_INSTR_ATYPE_DATA 0 /* instrument data */
|
||||
#define SNDRV_SEQ_INSTR_ATYPE_ALIAS 1 /* instrument alias */
|
||||
|
||||
/* instrument ASCII identifiers */
|
||||
#define SNDRV_SEQ_INSTR_ID_DLS1 "DLS1"
|
||||
#define SNDRV_SEQ_INSTR_ID_DLS2 "DLS2"
|
||||
#define SNDRV_SEQ_INSTR_ID_SIMPLE "Simple Wave"
|
||||
#define SNDRV_SEQ_INSTR_ID_SOUNDFONT "SoundFont"
|
||||
#define SNDRV_SEQ_INSTR_ID_GUS_PATCH "GUS Patch"
|
||||
#define SNDRV_SEQ_INSTR_ID_INTERWAVE "InterWave FFFF"
|
||||
#define SNDRV_SEQ_INSTR_ID_OPL2_3 "OPL2/3 FM"
|
||||
#define SNDRV_SEQ_INSTR_ID_OPL4 "OPL4"
|
||||
|
||||
/* instrument types */
|
||||
#define SNDRV_SEQ_INSTR_TYPE0_DLS1 (1<<0) /* MIDI DLS v1 */
|
||||
#define SNDRV_SEQ_INSTR_TYPE0_DLS2 (1<<1) /* MIDI DLS v2 */
|
||||
#define SNDRV_SEQ_INSTR_TYPE1_SIMPLE (1<<0) /* Simple Wave */
|
||||
#define SNDRV_SEQ_INSTR_TYPE1_SOUNDFONT (1<<1) /* EMU SoundFont */
|
||||
#define SNDRV_SEQ_INSTR_TYPE1_GUS_PATCH (1<<2) /* Gravis UltraSound Patch */
|
||||
#define SNDRV_SEQ_INSTR_TYPE1_INTERWAVE (1<<3) /* InterWave FFFF */
|
||||
#define SNDRV_SEQ_INSTR_TYPE2_OPL2_3 (1<<0) /* Yamaha OPL2/3 FM */
|
||||
#define SNDRV_SEQ_INSTR_TYPE2_OPL4 (1<<1) /* Yamaha OPL4 */
|
||||
|
||||
/* put commands */
|
||||
#define SNDRV_SEQ_INSTR_PUT_CMD_CREATE 0
|
||||
#define SNDRV_SEQ_INSTR_PUT_CMD_REPLACE 1
|
||||
#define SNDRV_SEQ_INSTR_PUT_CMD_MODIFY 2
|
||||
#define SNDRV_SEQ_INSTR_PUT_CMD_ADD 3
|
||||
#define SNDRV_SEQ_INSTR_PUT_CMD_REMOVE 4
|
||||
|
||||
/* get commands */
|
||||
#define SNDRV_SEQ_INSTR_GET_CMD_FULL 0
|
||||
#define SNDRV_SEQ_INSTR_GET_CMD_PARTIAL 1
|
||||
|
||||
/* query flags */
|
||||
#define SNDRV_SEQ_INSTR_QUERY_FOLLOW_ALIAS (1<<0)
|
||||
|
||||
/* free commands */
|
||||
#define SNDRV_SEQ_INSTR_FREE_CMD_ALL 0
|
||||
#define SNDRV_SEQ_INSTR_FREE_CMD_PRIVATE 1
|
||||
#define SNDRV_SEQ_INSTR_FREE_CMD_CLUSTER 2
|
||||
#define SNDRV_SEQ_INSTR_FREE_CMD_SINGLE 3
|
||||
|
||||
/* size of ROM/RAM */
|
||||
typedef unsigned int snd_seq_instr_size_t;
|
||||
|
||||
/* 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 */
|
||||
snd_seq_instr_size_t ram_sizes[16]; /* size of RAM banks */
|
||||
int rom_count; /* count of ROM banks */
|
||||
snd_seq_instr_size_t rom_sizes[8]; /* size of ROM banks */
|
||||
char reserved[128];
|
||||
};
|
||||
|
||||
/* INSTR_STATUS */
|
||||
|
||||
struct snd_seq_instr_status {
|
||||
int result; /* operation result */
|
||||
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 snd_seq_instr_format_info {
|
||||
char format[16]; /* format identifier - SNDRV_SEQ_INSTR_ID_* */
|
||||
unsigned int len; /* max data length (without this structure) */
|
||||
};
|
||||
|
||||
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 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 snd_seq_instr alias;
|
||||
} data;
|
||||
};
|
||||
|
||||
/* INSTR_PUT/GET, data are stored in one block (extended), header + data */
|
||||
|
||||
struct snd_seq_instr_header {
|
||||
union {
|
||||
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 snd_seq_instr_data data; /* instrument data (for put/get result) */
|
||||
};
|
||||
|
||||
/* INSTR_CLUSTER_SET */
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
/* INSTR_CLUSTER_GET */
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
/*
|
||||
* IOCTL commands
|
||||
*/
|
||||
|
||||
#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 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 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 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 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 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 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 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 */
|
||||
918
include/sound/asound.h
Normal file
918
include/sound/asound.h
Normal file
@@ -0,0 +1,918 @@
|
||||
/*
|
||||
* Advanced Linux Sound Architecture - ALSA - Driver
|
||||
* Copyright (c) 1994-2003 by Jaroslav Kysela <perex@suse.cz>,
|
||||
* Abramo Bagnara <abramo@alsa-project.org>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_ASOUND_H
|
||||
#define __SOUND_ASOUND_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/time.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
#define SNDRV_LITTLE_ENDIAN
|
||||
#else
|
||||
#ifdef __BIG_ENDIAN
|
||||
#define SNDRV_BIG_ENDIAN
|
||||
#else
|
||||
#error "Unsupported endian..."
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ **/
|
||||
|
||||
/*
|
||||
* protocol version
|
||||
*/
|
||||
|
||||
#define SNDRV_PROTOCOL_VERSION(major, minor, subminor) (((major)<<16)|((minor)<<8)|(subminor))
|
||||
#define SNDRV_PROTOCOL_MAJOR(version) (((version)>>16)&0xffff)
|
||||
#define SNDRV_PROTOCOL_MINOR(version) (((version)>>8)&0xff)
|
||||
#define SNDRV_PROTOCOL_MICRO(version) ((version)&0xff)
|
||||
#define SNDRV_PROTOCOL_INCOMPATIBLE(kversion, uversion) \
|
||||
(SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || \
|
||||
(SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && \
|
||||
SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion)))
|
||||
|
||||
/****************************************************************************
|
||||
* *
|
||||
* Digital audio interface *
|
||||
* *
|
||||
****************************************************************************/
|
||||
|
||||
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 */
|
||||
unsigned char dig_subframe[4]; /* AES/IEC958 subframe bits */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* *
|
||||
* Section for driver hardware dependent interface - /dev/snd/hw? *
|
||||
* *
|
||||
****************************************************************************/
|
||||
|
||||
#define SNDRV_HWDEP_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
|
||||
|
||||
enum {
|
||||
SNDRV_HWDEP_IFACE_OPL2 = 0,
|
||||
SNDRV_HWDEP_IFACE_OPL3,
|
||||
SNDRV_HWDEP_IFACE_OPL4,
|
||||
SNDRV_HWDEP_IFACE_SB16CSP, /* Creative Signal Processor */
|
||||
SNDRV_HWDEP_IFACE_EMU10K1, /* FX8010 processor in EMU10K1 chip */
|
||||
SNDRV_HWDEP_IFACE_YSS225, /* Yamaha FX processor */
|
||||
SNDRV_HWDEP_IFACE_ICS2115, /* Wavetable synth */
|
||||
SNDRV_HWDEP_IFACE_SSCAPE, /* Ensoniq SoundScape ISA card (MC68EC000) */
|
||||
SNDRV_HWDEP_IFACE_VX, /* Digigram VX cards */
|
||||
SNDRV_HWDEP_IFACE_MIXART, /* Digigram miXart cards */
|
||||
SNDRV_HWDEP_IFACE_USX2Y, /* Tascam US122, US224 & US428 usb */
|
||||
SNDRV_HWDEP_IFACE_EMUX_WAVETABLE, /* EmuX wavetable */
|
||||
SNDRV_HWDEP_IFACE_BLUETOOTH, /* Bluetooth audio */
|
||||
SNDRV_HWDEP_IFACE_USX2Y_PCM, /* Tascam US122, US224 & US428 rawusb pcm */
|
||||
SNDRV_HWDEP_IFACE_PCXHR, /* Digigram PCXHR */
|
||||
SNDRV_HWDEP_IFACE_SB_RC, /* SB Extigy/Audigy2NX remote control */
|
||||
|
||||
/* Don't forget to change the following: */
|
||||
SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_SB_RC
|
||||
};
|
||||
|
||||
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 */
|
||||
int iface; /* hwdep interface */
|
||||
unsigned char reserved[64]; /* reserved for future */
|
||||
};
|
||||
|
||||
/* generic DSP loader */
|
||||
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 */
|
||||
unsigned int dsp_loaded; /* R: bit flags indicating the loaded DSPs */
|
||||
unsigned int chip_ready; /* R: 1 = initialization finished */
|
||||
unsigned char reserved[16]; /* reserved for future use */
|
||||
};
|
||||
|
||||
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 */
|
||||
size_t length; /* W: size of image in bytes */
|
||||
unsigned long driver_data; /* W: driver-specific data */
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_HWDEP_IOCTL_PVERSION = _IOR ('H', 0x00, int),
|
||||
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)
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* *
|
||||
* Digital Audio (PCM) interface - /dev/snd/pcm?? *
|
||||
* *
|
||||
*****************************************************************************/
|
||||
|
||||
#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 8)
|
||||
|
||||
typedef unsigned long snd_pcm_uframes_t;
|
||||
typedef signed long snd_pcm_sframes_t;
|
||||
|
||||
enum {
|
||||
SNDRV_PCM_CLASS_GENERIC = 0, /* standard mono or stereo device */
|
||||
SNDRV_PCM_CLASS_MULTI, /* multichannel device */
|
||||
SNDRV_PCM_CLASS_MODEM, /* software modem class */
|
||||
SNDRV_PCM_CLASS_DIGITIZER, /* digitizer class */
|
||||
/* Don't forget to change the following: */
|
||||
SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER,
|
||||
};
|
||||
|
||||
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_PLAYBACK = 0,
|
||||
SNDRV_PCM_STREAM_CAPTURE,
|
||||
SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE,
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
#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
|
||||
#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
|
||||
|
||||
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 */
|
||||
#define SNDRV_PCM_INFO_DOUBLE 0x00000004 /* Double buffering needed for PCM start/stop */
|
||||
#define SNDRV_PCM_INFO_BATCH 0x00000010 /* double buffering */
|
||||
#define SNDRV_PCM_INFO_INTERLEAVED 0x00000100 /* channels are interleaved */
|
||||
#define SNDRV_PCM_INFO_NONINTERLEAVED 0x00000200 /* channels are not interleaved */
|
||||
#define SNDRV_PCM_INFO_COMPLEX 0x00000400 /* complex frame organization (mmap only) */
|
||||
#define SNDRV_PCM_INFO_BLOCK_TRANSFER 0x00010000 /* hardware transfer block of samples */
|
||||
#define SNDRV_PCM_INFO_OVERRANGE 0x00020000 /* hardware supports ADC (capture) overrange detection */
|
||||
#define SNDRV_PCM_INFO_RESUME 0x00040000 /* hardware supports stream resume after suspend */
|
||||
#define SNDRV_PCM_INFO_PAUSE 0x00080000 /* pause ioctl is supported */
|
||||
#define SNDRV_PCM_INFO_HALF_DUPLEX 0x00100000 /* only half duplex */
|
||||
#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 */
|
||||
|
||||
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,
|
||||
SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000,
|
||||
SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
|
||||
};
|
||||
|
||||
union snd_pcm_sync_id {
|
||||
unsigned char id[16];
|
||||
unsigned short id16[8];
|
||||
unsigned int id32[4];
|
||||
};
|
||||
|
||||
struct snd_pcm_info {
|
||||
unsigned int device; /* RO/WR (control): device number */
|
||||
unsigned int subdevice; /* RO/WR (control): subdevice 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 */
|
||||
int dev_class; /* SNDRV_PCM_CLASS_* */
|
||||
int dev_subclass; /* SNDRV_PCM_SUBCLASS_* */
|
||||
unsigned int subdevices_count;
|
||||
unsigned int subdevices_avail;
|
||||
union snd_pcm_sync_id sync; /* hardware synchronization ID */
|
||||
unsigned char reserved[64]; /* reserved for future... */
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
#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 snd_interval {
|
||||
unsigned int min, max;
|
||||
unsigned int openmin:1,
|
||||
openmax:1,
|
||||
integer:1,
|
||||
empty:1;
|
||||
};
|
||||
|
||||
#define SNDRV_MASK_MAX 256
|
||||
|
||||
struct snd_mask {
|
||||
u_int32_t bits[(SNDRV_MASK_MAX+31)/32];
|
||||
};
|
||||
|
||||
struct snd_pcm_hw_params {
|
||||
unsigned int flags;
|
||||
struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
|
||||
SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
|
||||
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 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 */
|
||||
snd_pcm_uframes_t fifo_size; /* R: chip FIFO size in frames */
|
||||
unsigned char reserved[64]; /* reserved for future */
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_PCM_TSTAMP_NONE = 0,
|
||||
SNDRV_PCM_TSTAMP_MMAP,
|
||||
SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_MMAP,
|
||||
};
|
||||
|
||||
struct snd_pcm_sw_params {
|
||||
int tstamp_mode; /* timestamp mode */
|
||||
unsigned int period_step;
|
||||
unsigned int sleep_min; /* min ticks to sleep */
|
||||
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 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 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 */
|
||||
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 snd_pcm_mmap_status {
|
||||
snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */
|
||||
int pad1; /* Needed for 64 bit alignment */
|
||||
snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
|
||||
struct timespec tstamp; /* Timestamp */
|
||||
snd_pcm_state_t suspended_state; /* RO: suspended stream state */
|
||||
};
|
||||
|
||||
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 snd_pcm_sync_ptr {
|
||||
unsigned int flags;
|
||||
union {
|
||||
struct snd_pcm_mmap_status status;
|
||||
unsigned char reserved[64];
|
||||
} s;
|
||||
union {
|
||||
struct snd_pcm_mmap_control control;
|
||||
unsigned char reserved[64];
|
||||
} c;
|
||||
};
|
||||
|
||||
struct snd_xferi {
|
||||
snd_pcm_sframes_t result;
|
||||
void __user *buf;
|
||||
snd_pcm_uframes_t frames;
|
||||
};
|
||||
|
||||
struct snd_xfern {
|
||||
snd_pcm_sframes_t result;
|
||||
void __user * __user *bufs;
|
||||
snd_pcm_uframes_t frames;
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_PCM_IOCTL_PVERSION = _IOR('A', 0x00, int),
|
||||
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 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 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 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, 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, 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),
|
||||
};
|
||||
|
||||
/* Trick to make alsa-lib/acinclude.m4 happy */
|
||||
#define SNDRV_PCM_IOCTL_REWIND SNDRV_PCM_IOCTL_REWIND
|
||||
|
||||
/*****************************************************************************
|
||||
* *
|
||||
* MIDI v1.0 interface *
|
||||
* *
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Raw MIDI section - /dev/snd/midi??
|
||||
*/
|
||||
|
||||
#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 0)
|
||||
|
||||
enum {
|
||||
SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
|
||||
SNDRV_RAWMIDI_STREAM_INPUT,
|
||||
SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT,
|
||||
};
|
||||
|
||||
#define SNDRV_RAWMIDI_INFO_OUTPUT 0x00000001
|
||||
#define SNDRV_RAWMIDI_INFO_INPUT 0x00000002
|
||||
#define SNDRV_RAWMIDI_INFO_DUPLEX 0x00000004
|
||||
|
||||
struct snd_rawmidi_info {
|
||||
unsigned int device; /* RO/WR (control): device number */
|
||||
unsigned int subdevice; /* RO/WR (control): subdevice number */
|
||||
int stream; /* WR: stream */
|
||||
int card; /* R: card number */
|
||||
unsigned int flags; /* SNDRV_RAWMIDI_INFO_XXXX */
|
||||
unsigned char id[64]; /* ID (user selectable) */
|
||||
unsigned char name[80]; /* name of device */
|
||||
unsigned char subname[32]; /* name of active or selected subdevice */
|
||||
unsigned int subdevices_count;
|
||||
unsigned int subdevices_avail;
|
||||
unsigned char reserved[64]; /* reserved for future use */
|
||||
};
|
||||
|
||||
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 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) */
|
||||
unsigned char reserved[16]; /* reserved for future use */
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_RAWMIDI_IOCTL_PVERSION = _IOR('W', 0x00, int),
|
||||
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),
|
||||
};
|
||||
|
||||
/*
|
||||
* Timer section - /dev/snd/timer
|
||||
*/
|
||||
|
||||
#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 5)
|
||||
|
||||
enum {
|
||||
SNDRV_TIMER_CLASS_NONE = -1,
|
||||
SNDRV_TIMER_CLASS_SLAVE = 0,
|
||||
SNDRV_TIMER_CLASS_GLOBAL,
|
||||
SNDRV_TIMER_CLASS_CARD,
|
||||
SNDRV_TIMER_CLASS_PCM,
|
||||
SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM,
|
||||
};
|
||||
|
||||
/* slave timer classes */
|
||||
enum {
|
||||
SNDRV_TIMER_SCLASS_NONE = 0,
|
||||
SNDRV_TIMER_SCLASS_APPLICATION,
|
||||
SNDRV_TIMER_SCLASS_SEQUENCER, /* alias */
|
||||
SNDRV_TIMER_SCLASS_OSS_SEQUENCER, /* alias */
|
||||
SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
|
||||
};
|
||||
|
||||
/* global timers (device member) */
|
||||
#define SNDRV_TIMER_GLOBAL_SYSTEM 0
|
||||
#define SNDRV_TIMER_GLOBAL_RTC 1
|
||||
#define SNDRV_TIMER_GLOBAL_HPET 2
|
||||
|
||||
/* info flags */
|
||||
#define SNDRV_TIMER_FLG_SLAVE (1<<0) /* cannot be controlled */
|
||||
|
||||
struct snd_timer_id {
|
||||
int dev_class;
|
||||
int dev_sclass;
|
||||
int card;
|
||||
int device;
|
||||
int subdevice;
|
||||
};
|
||||
|
||||
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 */
|
||||
unsigned char name[80]; /* timer name */
|
||||
unsigned long reserved0; /* reserved for future use */
|
||||
unsigned long resolution; /* average period resolution in ns */
|
||||
unsigned long resolution_min; /* minimal period resolution in ns */
|
||||
unsigned long resolution_max; /* maximal period resolution in ns */
|
||||
unsigned int clients; /* active timer clients */
|
||||
unsigned char reserved[32];
|
||||
};
|
||||
|
||||
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 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 snd_timer_select {
|
||||
struct snd_timer_id id; /* bind to timer ID */
|
||||
unsigned char reserved[32]; /* reserved */
|
||||
};
|
||||
|
||||
struct snd_timer_info {
|
||||
unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */
|
||||
int card; /* card number */
|
||||
unsigned char id[64]; /* timer identificator */
|
||||
unsigned char name[80]; /* timer name */
|
||||
unsigned long reserved0; /* reserved for future use */
|
||||
unsigned long resolution; /* average period resolution in ns */
|
||||
unsigned char reserved[64]; /* reserved */
|
||||
};
|
||||
|
||||
#define SNDRV_TIMER_PSFLG_AUTO (1<<0) /* auto start, otherwise one-shot */
|
||||
#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 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) */
|
||||
unsigned int reserved0; /* reserved, was: failure locations */
|
||||
unsigned int filter; /* event filter (bitmask of SNDRV_TIMER_EVENT_*) */
|
||||
unsigned char reserved[60]; /* reserved */
|
||||
};
|
||||
|
||||
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 */
|
||||
unsigned int overrun; /* count of read queue overruns */
|
||||
unsigned int queue; /* used queue size */
|
||||
unsigned char reserved[64]; /* reserved */
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_TIMER_IOCTL_PVERSION = _IOR('T', 0x00, int),
|
||||
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 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),
|
||||
SNDRV_TIMER_IOCTL_CONTINUE = _IO('T', 0xa2),
|
||||
SNDRV_TIMER_IOCTL_PAUSE = _IO('T', 0xa3),
|
||||
};
|
||||
|
||||
struct snd_timer_read {
|
||||
unsigned int resolution;
|
||||
unsigned int ticks;
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_TIMER_EVENT_RESOLUTION = 0, /* val = resolution in ns */
|
||||
SNDRV_TIMER_EVENT_TICK, /* val = ticks */
|
||||
SNDRV_TIMER_EVENT_START, /* val = resolution in ns */
|
||||
SNDRV_TIMER_EVENT_STOP, /* val = 0 */
|
||||
SNDRV_TIMER_EVENT_CONTINUE, /* val = resolution in ns */
|
||||
SNDRV_TIMER_EVENT_PAUSE, /* val = 0 */
|
||||
SNDRV_TIMER_EVENT_EARLY, /* val = 0, early event */
|
||||
SNDRV_TIMER_EVENT_SUSPEND, /* val = 0 */
|
||||
SNDRV_TIMER_EVENT_RESUME, /* val = resolution in ns */
|
||||
/* master timer events for slave timer instances */
|
||||
SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10,
|
||||
SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10,
|
||||
SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10,
|
||||
SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10,
|
||||
SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10,
|
||||
SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10,
|
||||
};
|
||||
|
||||
struct snd_timer_tread {
|
||||
int event;
|
||||
struct timespec tstamp;
|
||||
unsigned int val;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* *
|
||||
* Section for driver control interface - /dev/snd/control? *
|
||||
* *
|
||||
****************************************************************************/
|
||||
|
||||
#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 4)
|
||||
|
||||
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) */
|
||||
unsigned char driver[16]; /* Driver name */
|
||||
unsigned char name[32]; /* Short name of soundcard */
|
||||
unsigned char longname[80]; /* name + info text about soundcard */
|
||||
unsigned char reserved_[16]; /* reserved for future (was ID of mixer) */
|
||||
unsigned char mixername[80]; /* visual mixer identification */
|
||||
unsigned char components[80]; /* card components / fine identification, delimited with one space (AC97 etc..) */
|
||||
unsigned char reserved[48]; /* reserved for future */
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
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)
|
||||
#define SNDRV_CTL_ELEM_ACCESS_READWRITE (SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE)
|
||||
#define SNDRV_CTL_ELEM_ACCESS_VOLATILE (1<<2) /* control value may be changed without a notification */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP (1<<3) /* when was control changed */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_TLV_READ (1<<4) /* TLV read is possible */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_TLV_WRITE (1<<5) /* TLV write is possible */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE (SNDRV_CTL_ELEM_ACCESS_TLV_READ|SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
|
||||
#define SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND (1<<6) /* TLV command is possible */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_INACTIVE (1<<8) /* control does actually nothing, but may be updated */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_LOCK (1<<9) /* write lock */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_OWNER (1<<10) /* write lock owner */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK (1<<28) /* kernel use a TLV callback */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_USER (1<<29) /* user space element */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_DINDIRECT (1<<30) /* indirect access for matrix dimensions in the info structure */
|
||||
#define SNDRV_CTL_ELEM_ACCESS_INDIRECT (1<<31) /* indirect access for element value in the value structure */
|
||||
|
||||
/* for further details see the ACPI and PCI power management specification */
|
||||
#define SNDRV_CTL_POWER_D0 0x0000 /* full On */
|
||||
#define SNDRV_CTL_POWER_D1 0x0100 /* partial On */
|
||||
#define SNDRV_CTL_POWER_D2 0x0200 /* partial On */
|
||||
#define SNDRV_CTL_POWER_D3 0x0300 /* Off */
|
||||
#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 snd_ctl_elem_id {
|
||||
unsigned int numid; /* numeric identifier, zero = invalid */
|
||||
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 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 snd_ctl_elem_id __user *pids; /* R: IDs */
|
||||
unsigned char reserved[50];
|
||||
};
|
||||
|
||||
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 */
|
||||
union {
|
||||
struct {
|
||||
long min; /* R: minimum value */
|
||||
long max; /* R: maximum value */
|
||||
long step; /* R: step (0 variable) */
|
||||
} integer;
|
||||
struct {
|
||||
long long min; /* R: minimum value */
|
||||
long long max; /* R: maximum value */
|
||||
long long step; /* R: step (0 variable) */
|
||||
} integer64;
|
||||
struct {
|
||||
unsigned int items; /* R: number of items */
|
||||
unsigned int item; /* W: item number */
|
||||
char name[64]; /* R: value name */
|
||||
} enumerated;
|
||||
unsigned char reserved[128];
|
||||
} value;
|
||||
union {
|
||||
unsigned short d[4]; /* dimensions */
|
||||
unsigned short *d_ptr; /* indirect */
|
||||
} dimen;
|
||||
unsigned char reserved[64-4*sizeof(unsigned short)];
|
||||
};
|
||||
|
||||
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 {
|
||||
long value[128];
|
||||
long *value_ptr;
|
||||
} integer;
|
||||
union {
|
||||
long long value[64];
|
||||
long long *value_ptr;
|
||||
} integer64;
|
||||
union {
|
||||
unsigned int item[128];
|
||||
unsigned int *item_ptr;
|
||||
} enumerated;
|
||||
union {
|
||||
unsigned char data[512];
|
||||
unsigned char *data_ptr;
|
||||
} bytes;
|
||||
struct snd_aes_iec958 iec958;
|
||||
} value; /* RO */
|
||||
struct timespec tstamp;
|
||||
unsigned char reserved[128-sizeof(struct timespec)];
|
||||
};
|
||||
|
||||
struct snd_ctl_tlv {
|
||||
unsigned int numid; /* control element numeric identification */
|
||||
unsigned int length; /* in bytes aligned to 4 */
|
||||
unsigned int tlv[0]; /* first TLV */
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_CTL_IOCTL_PVERSION = _IOR('U', 0x00, int),
|
||||
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 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_TLV_READ = _IOWR('U', 0x1a, struct snd_ctl_tlv),
|
||||
SNDRV_CTL_IOCTL_TLV_WRITE = _IOWR('U', 0x1b, struct snd_ctl_tlv),
|
||||
SNDRV_CTL_IOCTL_TLV_COMMAND = _IOWR('U', 0x1c, struct snd_ctl_tlv),
|
||||
SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE = _IOWR('U', 0x20, int),
|
||||
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 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 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),
|
||||
};
|
||||
|
||||
/*
|
||||
* Read interface.
|
||||
*/
|
||||
|
||||
enum sndrv_ctl_event_type {
|
||||
SNDRV_CTL_EVENT_ELEM = 0,
|
||||
SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM,
|
||||
};
|
||||
|
||||
#define SNDRV_CTL_EVENT_MASK_VALUE (1<<0) /* element value was changed */
|
||||
#define SNDRV_CTL_EVENT_MASK_INFO (1<<1) /* element info was changed */
|
||||
#define SNDRV_CTL_EVENT_MASK_ADD (1<<2) /* element was added */
|
||||
#define SNDRV_CTL_EVENT_MASK_TLV (1<<3) /* element TLV tree was changed */
|
||||
#define SNDRV_CTL_EVENT_MASK_REMOVE (~0U) /* element was removed */
|
||||
|
||||
struct snd_ctl_event {
|
||||
int type; /* event type - SNDRV_CTL_EVENT_* */
|
||||
union {
|
||||
struct {
|
||||
unsigned int mask;
|
||||
struct snd_ctl_elem_id id;
|
||||
} elem;
|
||||
unsigned char data8[60];
|
||||
} data;
|
||||
};
|
||||
|
||||
/*
|
||||
* Control names
|
||||
*/
|
||||
|
||||
#define SNDRV_CTL_NAME_NONE ""
|
||||
#define SNDRV_CTL_NAME_PLAYBACK "Playback "
|
||||
#define SNDRV_CTL_NAME_CAPTURE "Capture "
|
||||
|
||||
#define SNDRV_CTL_NAME_IEC958_NONE ""
|
||||
#define SNDRV_CTL_NAME_IEC958_SWITCH "Switch"
|
||||
#define SNDRV_CTL_NAME_IEC958_VOLUME "Volume"
|
||||
#define SNDRV_CTL_NAME_IEC958_DEFAULT "Default"
|
||||
#define SNDRV_CTL_NAME_IEC958_MASK "Mask"
|
||||
#define SNDRV_CTL_NAME_IEC958_CON_MASK "Con Mask"
|
||||
#define SNDRV_CTL_NAME_IEC958_PRO_MASK "Pro Mask"
|
||||
#define SNDRV_CTL_NAME_IEC958_PCM_STREAM "PCM Stream"
|
||||
#define SNDRV_CTL_NAME_IEC958(expl,direction,what) "IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
struct snd_xferv {
|
||||
const struct iovec *vector;
|
||||
unsigned long count;
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_IOCTL_READV = _IOW('K', 0x00, struct snd_xferv),
|
||||
SNDRV_IOCTL_WRITEV = _IOW('K', 0x01, struct snd_xferv),
|
||||
};
|
||||
|
||||
#endif /* __SOUND_ASOUND_H */
|
||||
115
include/sound/asound_fm.h
Normal file
115
include/sound/asound_fm.h
Normal file
@@ -0,0 +1,115 @@
|
||||
#ifndef __SOUND_ASOUND_FM_H
|
||||
#define __SOUND_ASOUND_FM_H
|
||||
|
||||
/*
|
||||
* Advanced Linux Sound Architecture - ALSA
|
||||
*
|
||||
* Interface file between ALSA driver & user space
|
||||
* Copyright (c) 1994-98 by Jaroslav Kysela <perex@suse.cz>,
|
||||
* 4Front Technologies
|
||||
*
|
||||
* Direct FM control
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#define SNDRV_DM_FM_MODE_OPL2 0x00
|
||||
#define SNDRV_DM_FM_MODE_OPL3 0x01
|
||||
|
||||
struct snd_dm_fm_info {
|
||||
unsigned char fm_mode; /* OPL mode, see SNDRV_DM_FM_MODE_XXX */
|
||||
unsigned char rhythm; /* percussion mode flag */
|
||||
};
|
||||
|
||||
/*
|
||||
* Data structure composing an FM "note" or sound event.
|
||||
*/
|
||||
|
||||
struct snd_dm_fm_voice {
|
||||
unsigned char op; /* operator cell (0 or 1) */
|
||||
unsigned char voice; /* FM voice (0 to 17) */
|
||||
|
||||
unsigned char am; /* amplitude modulation */
|
||||
unsigned char vibrato; /* vibrato effect */
|
||||
unsigned char do_sustain; /* sustain phase */
|
||||
unsigned char kbd_scale; /* keyboard scaling */
|
||||
unsigned char harmonic; /* 4 bits: harmonic and multiplier */
|
||||
unsigned char scale_level; /* 2 bits: decrease output freq rises */
|
||||
unsigned char volume; /* 6 bits: volume */
|
||||
|
||||
unsigned char attack; /* 4 bits: attack rate */
|
||||
unsigned char decay; /* 4 bits: decay rate */
|
||||
unsigned char sustain; /* 4 bits: sustain level */
|
||||
unsigned char release; /* 4 bits: release rate */
|
||||
|
||||
unsigned char feedback; /* 3 bits: feedback for op0 */
|
||||
unsigned char connection; /* 0 for serial, 1 for parallel */
|
||||
unsigned char left; /* stereo left */
|
||||
unsigned char right; /* stereo right */
|
||||
unsigned char waveform; /* 3 bits: waveform shape */
|
||||
};
|
||||
|
||||
/*
|
||||
* This describes an FM note by its voice, octave, frequency number (10bit)
|
||||
* and key on/off.
|
||||
*/
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
/*
|
||||
* FM parameters that apply globally to all voices, and thus are not "notes"
|
||||
*/
|
||||
|
||||
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 */
|
||||
unsigned char rhythm; /* percussion mode select */
|
||||
|
||||
/* This block is the percussion instrument data */
|
||||
unsigned char bass;
|
||||
unsigned char snare;
|
||||
unsigned char tomtom;
|
||||
unsigned char cymbal;
|
||||
unsigned char hihat;
|
||||
};
|
||||
|
||||
/*
|
||||
* FM mode ioctl settings
|
||||
*/
|
||||
|
||||
#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, 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)
|
||||
|
||||
#define SNDRV_DM_FM_OSS_IOCTL_RESET 0x20
|
||||
#define SNDRV_DM_FM_OSS_IOCTL_PLAY_NOTE 0x21
|
||||
#define SNDRV_DM_FM_OSS_IOCTL_SET_VOICE 0x22
|
||||
#define SNDRV_DM_FM_OSS_IOCTL_SET_PARAMS 0x23
|
||||
#define SNDRV_DM_FM_OSS_IOCTL_SET_MODE 0x24
|
||||
#define SNDRV_DM_FM_OSS_IOCTL_SET_OPL 0x25
|
||||
|
||||
#endif /* __SOUND_ASOUND_FM_H */
|
||||
227
include/sound/asoundef.h
Normal file
227
include/sound/asoundef.h
Normal file
@@ -0,0 +1,227 @@
|
||||
#ifndef __SOUND_ASOUNDEF_H
|
||||
#define __SOUND_ASOUNDEF_H
|
||||
|
||||
/*
|
||||
* Advanced Linux Sound Architecture - ALSA - Driver
|
||||
* Copyright (c) 1994-2000 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* *
|
||||
* Digital audio interface *
|
||||
* *
|
||||
****************************************************************************/
|
||||
|
||||
/* AES/IEC958 channel status bits */
|
||||
#define IEC958_AES0_PROFESSIONAL (1<<0) /* 0 = consumer, 1 = professional */
|
||||
#define IEC958_AES0_NONAUDIO (1<<1) /* 0 = audio, 1 = non-audio */
|
||||
#define IEC958_AES0_PRO_EMPHASIS (7<<2) /* mask - emphasis */
|
||||
#define IEC958_AES0_PRO_EMPHASIS_NOTID (0<<2) /* emphasis not indicated */
|
||||
#define IEC958_AES0_PRO_EMPHASIS_NONE (1<<2) /* none emphasis */
|
||||
#define IEC958_AES0_PRO_EMPHASIS_5015 (3<<2) /* 50/15us emphasis */
|
||||
#define IEC958_AES0_PRO_EMPHASIS_CCITT (7<<2) /* CCITT J.17 emphasis */
|
||||
#define IEC958_AES0_PRO_FREQ_UNLOCKED (1<<5) /* source sample frequency: 0 = locked, 1 = unlocked */
|
||||
#define IEC958_AES0_PRO_FS (3<<6) /* mask - sample frequency */
|
||||
#define IEC958_AES0_PRO_FS_NOTID (0<<6) /* fs not indicated */
|
||||
#define IEC958_AES0_PRO_FS_44100 (1<<6) /* 44.1kHz */
|
||||
#define IEC958_AES0_PRO_FS_48000 (2<<6) /* 48kHz */
|
||||
#define IEC958_AES0_PRO_FS_32000 (3<<6) /* 32kHz */
|
||||
#define IEC958_AES0_CON_NOT_COPYRIGHT (1<<2) /* 0 = copyright, 1 = not copyright */
|
||||
#define IEC958_AES0_CON_EMPHASIS (7<<3) /* mask - emphasis */
|
||||
#define IEC958_AES0_CON_EMPHASIS_NONE (0<<3) /* none emphasis */
|
||||
#define IEC958_AES0_CON_EMPHASIS_5015 (1<<3) /* 50/15us emphasis */
|
||||
#define IEC958_AES0_CON_MODE (3<<6) /* mask - mode */
|
||||
#define IEC958_AES1_PRO_MODE (15<<0) /* mask - channel mode */
|
||||
#define IEC958_AES1_PRO_MODE_NOTID (0<<0) /* not indicated */
|
||||
#define IEC958_AES1_PRO_MODE_STEREOPHONIC (2<<0) /* stereophonic - ch A is left */
|
||||
#define IEC958_AES1_PRO_MODE_SINGLE (4<<0) /* single channel */
|
||||
#define IEC958_AES1_PRO_MODE_TWO (8<<0) /* two channels */
|
||||
#define IEC958_AES1_PRO_MODE_PRIMARY (12<<0) /* primary/secondary */
|
||||
#define IEC958_AES1_PRO_MODE_BYTE3 (15<<0) /* vector to byte 3 */
|
||||
#define IEC958_AES1_PRO_USERBITS (15<<4) /* mask - user bits */
|
||||
#define IEC958_AES1_PRO_USERBITS_NOTID (0<<4) /* not indicated */
|
||||
#define IEC958_AES1_PRO_USERBITS_192 (8<<4) /* 192-bit structure */
|
||||
#define IEC958_AES1_PRO_USERBITS_UDEF (12<<4) /* user defined application */
|
||||
#define IEC958_AES1_CON_CATEGORY 0x7f
|
||||
#define IEC958_AES1_CON_GENERAL 0x00
|
||||
#define IEC958_AES1_CON_EXPERIMENTAL 0x40
|
||||
#define IEC958_AES1_CON_SOLIDMEM_MASK 0x0f
|
||||
#define IEC958_AES1_CON_SOLIDMEM_ID 0x08
|
||||
#define IEC958_AES1_CON_BROADCAST1_MASK 0x07
|
||||
#define IEC958_AES1_CON_BROADCAST1_ID 0x04
|
||||
#define IEC958_AES1_CON_DIGDIGCONV_MASK 0x07
|
||||
#define IEC958_AES1_CON_DIGDIGCONV_ID 0x02
|
||||
#define IEC958_AES1_CON_ADC_COPYRIGHT_MASK 0x1f
|
||||
#define IEC958_AES1_CON_ADC_COPYRIGHT_ID 0x06
|
||||
#define IEC958_AES1_CON_ADC_MASK 0x1f
|
||||
#define IEC958_AES1_CON_ADC_ID 0x16
|
||||
#define IEC958_AES1_CON_BROADCAST2_MASK 0x0f
|
||||
#define IEC958_AES1_CON_BROADCAST2_ID 0x0e
|
||||
#define IEC958_AES1_CON_LASEROPT_MASK 0x07
|
||||
#define IEC958_AES1_CON_LASEROPT_ID 0x01
|
||||
#define IEC958_AES1_CON_MUSICAL_MASK 0x07
|
||||
#define IEC958_AES1_CON_MUSICAL_ID 0x05
|
||||
#define IEC958_AES1_CON_MAGNETIC_MASK 0x07
|
||||
#define IEC958_AES1_CON_MAGNETIC_ID 0x03
|
||||
#define IEC958_AES1_CON_IEC908_CD (IEC958_AES1_CON_LASEROPT_ID|0x00)
|
||||
#define IEC958_AES1_CON_NON_IEC908_CD (IEC958_AES1_CON_LASEROPT_ID|0x08)
|
||||
#define IEC958_AES1_CON_PCM_CODER (IEC958_AES1_CON_DIGDIGCONV_ID|0x00)
|
||||
#define IEC958_AES1_CON_SAMPLER (IEC958_AES1_CON_DIGDIGCONV_ID|0x20)
|
||||
#define IEC958_AES1_CON_MIXER (IEC958_AES1_CON_DIGDIGCONV_ID|0x10)
|
||||
#define IEC958_AES1_CON_RATE_CONVERTER (IEC958_AES1_CON_DIGDIGCONV_ID|0x18)
|
||||
#define IEC958_AES1_CON_SYNTHESIZER (IEC958_AES1_CON_MUSICAL_ID|0x00)
|
||||
#define IEC958_AES1_CON_MICROPHONE (IEC958_AES1_CON_MUSICAL_ID|0x08)
|
||||
#define IEC958_AES1_CON_DAT (IEC958_AES1_CON_MAGNETIC_ID|0x00)
|
||||
#define IEC958_AES1_CON_VCR (IEC958_AES1_CON_MAGNETIC_ID|0x08)
|
||||
#define IEC958_AES1_CON_ORIGINAL (1<<7) /* this bits depends on the category code */
|
||||
#define IEC958_AES2_PRO_SBITS (7<<0) /* mask - sample bits */
|
||||
#define IEC958_AES2_PRO_SBITS_20 (2<<0) /* 20-bit - coordination */
|
||||
#define IEC958_AES2_PRO_SBITS_24 (4<<0) /* 24-bit - main audio */
|
||||
#define IEC958_AES2_PRO_SBITS_UDEF (6<<0) /* user defined application */
|
||||
#define IEC958_AES2_PRO_WORDLEN (7<<3) /* mask - source word length */
|
||||
#define IEC958_AES2_PRO_WORDLEN_NOTID (0<<3) /* not indicated */
|
||||
#define IEC958_AES2_PRO_WORDLEN_22_18 (2<<3) /* 22-bit or 18-bit */
|
||||
#define IEC958_AES2_PRO_WORDLEN_23_19 (4<<3) /* 23-bit or 19-bit */
|
||||
#define IEC958_AES2_PRO_WORDLEN_24_20 (5<<3) /* 24-bit or 20-bit */
|
||||
#define IEC958_AES2_PRO_WORDLEN_20_16 (6<<3) /* 20-bit or 16-bit */
|
||||
#define IEC958_AES2_CON_SOURCE (15<<0) /* mask - source number */
|
||||
#define IEC958_AES2_CON_SOURCE_UNSPEC (0<<0) /* unspecified */
|
||||
#define IEC958_AES2_CON_CHANNEL (15<<4) /* mask - channel number */
|
||||
#define IEC958_AES2_CON_CHANNEL_UNSPEC (0<<4) /* unspecified */
|
||||
#define IEC958_AES3_CON_FS (15<<0) /* mask - sample frequency */
|
||||
#define IEC958_AES3_CON_FS_44100 (0<<0) /* 44.1kHz */
|
||||
#define IEC958_AES3_CON_FS_48000 (2<<0) /* 48kHz */
|
||||
#define IEC958_AES3_CON_FS_32000 (3<<0) /* 32kHz */
|
||||
#define IEC958_AES3_CON_CLOCK (3<<4) /* mask - clock accuracy */
|
||||
#define IEC958_AES3_CON_CLOCK_1000PPM (0<<4) /* 1000 ppm */
|
||||
#define IEC958_AES3_CON_CLOCK_50PPM (1<<4) /* 50 ppm */
|
||||
#define IEC958_AES3_CON_CLOCK_VARIABLE (2<<4) /* variable pitch */
|
||||
|
||||
/*****************************************************************************
|
||||
* *
|
||||
* MIDI v1.0 interface *
|
||||
* *
|
||||
*****************************************************************************/
|
||||
|
||||
#define MIDI_CHANNELS 16
|
||||
#define MIDI_GM_DRUM_CHANNEL (10-1)
|
||||
|
||||
/*
|
||||
* MIDI commands
|
||||
*/
|
||||
|
||||
#define MIDI_CMD_NOTE_OFF 0x80
|
||||
#define MIDI_CMD_NOTE_ON 0x90
|
||||
#define MIDI_CMD_NOTE_PRESSURE 0xa0
|
||||
#define MIDI_CMD_CONTROL 0xb0
|
||||
#define MIDI_CMD_PGM_CHANGE 0xc0
|
||||
#define MIDI_CMD_CHANNEL_PRESSURE 0xd0
|
||||
#define MIDI_CMD_BENDER 0xe0
|
||||
|
||||
#define MIDI_CMD_COMMON_SYSEX 0xf0
|
||||
#define MIDI_CMD_COMMON_MTC_QUARTER 0xf1
|
||||
#define MIDI_CMD_COMMON_SONG_POS 0xf2
|
||||
#define MIDI_CMD_COMMON_SONG_SELECT 0xf3
|
||||
#define MIDI_CMD_COMMON_TUNE_REQUEST 0xf6
|
||||
#define MIDI_CMD_COMMON_SYSEX_END 0xf7
|
||||
#define MIDI_CMD_COMMON_CLOCK 0xf8
|
||||
#define MIDI_CMD_COMMON_START 0xfa
|
||||
#define MIDI_CMD_COMMON_CONTINUE 0xfb
|
||||
#define MIDI_CMD_COMMON_STOP 0xfc
|
||||
#define MIDI_CMD_COMMON_SENSING 0xfe
|
||||
#define MIDI_CMD_COMMON_RESET 0xff
|
||||
|
||||
/*
|
||||
* MIDI controllers
|
||||
*/
|
||||
|
||||
#define MIDI_CTL_MSB_BANK 0x00
|
||||
#define MIDI_CTL_MSB_MODWHEEL 0x01
|
||||
#define MIDI_CTL_MSB_BREATH 0x02
|
||||
#define MIDI_CTL_MSB_FOOT 0x04
|
||||
#define MIDI_CTL_MSB_PORTAMENTO_TIME 0x05
|
||||
#define MIDI_CTL_MSB_DATA_ENTRY 0x06
|
||||
#define MIDI_CTL_MSB_MAIN_VOLUME 0x07
|
||||
#define MIDI_CTL_MSB_BALANCE 0x08
|
||||
#define MIDI_CTL_MSB_PAN 0x0a
|
||||
#define MIDI_CTL_MSB_EXPRESSION 0x0b
|
||||
#define MIDI_CTL_MSB_EFFECT1 0x0c
|
||||
#define MIDI_CTL_MSB_EFFECT2 0x0d
|
||||
#define MIDI_CTL_MSB_GENERAL_PURPOSE1 0x10
|
||||
#define MIDI_CTL_MSB_GENERAL_PURPOSE2 0x11
|
||||
#define MIDI_CTL_MSB_GENERAL_PURPOSE3 0x12
|
||||
#define MIDI_CTL_MSB_GENERAL_PURPOSE4 0x13
|
||||
#define MIDI_CTL_LSB_BANK 0x20
|
||||
#define MIDI_CTL_LSB_MODWHEEL 0x21
|
||||
#define MIDI_CTL_LSB_BREATH 0x22
|
||||
#define MIDI_CTL_LSB_FOOT 0x24
|
||||
#define MIDI_CTL_LSB_PORTAMENTO_TIME 0x25
|
||||
#define MIDI_CTL_LSB_DATA_ENTRY 0x26
|
||||
#define MIDI_CTL_LSB_MAIN_VOLUME 0x27
|
||||
#define MIDI_CTL_LSB_BALANCE 0x28
|
||||
#define MIDI_CTL_LSB_PAN 0x2a
|
||||
#define MIDI_CTL_LSB_EXPRESSION 0x2b
|
||||
#define MIDI_CTL_LSB_EFFECT1 0x2c
|
||||
#define MIDI_CTL_LSB_EFFECT2 0x2d
|
||||
#define MIDI_CTL_LSB_GENERAL_PURPOSE1 0x30
|
||||
#define MIDI_CTL_LSB_GENERAL_PURPOSE2 0x31
|
||||
#define MIDI_CTL_LSB_GENERAL_PURPOSE3 0x32
|
||||
#define MIDI_CTL_LSB_GENERAL_PURPOSE4 0x33
|
||||
#define MIDI_CTL_SUSTAIN 0x40
|
||||
#define MIDI_CTL_PORTAMENTO 0x41
|
||||
#define MIDI_CTL_SOSTENUTO 0x42
|
||||
#define MIDI_CTL_SOFT_PEDAL 0x43
|
||||
#define MIDI_CTL_LEGATO_FOOTSWITCH 0x44
|
||||
#define MIDI_CTL_HOLD2 0x45
|
||||
#define MIDI_CTL_SC1_SOUND_VARIATION 0x46
|
||||
#define MIDI_CTL_SC2_TIMBRE 0x47
|
||||
#define MIDI_CTL_SC3_RELEASE_TIME 0x48
|
||||
#define MIDI_CTL_SC4_ATTACK_TIME 0x49
|
||||
#define MIDI_CTL_SC5_BRIGHTNESS 0x4a
|
||||
#define MIDI_CTL_SC6 0x4b
|
||||
#define MIDI_CTL_SC7 0x4c
|
||||
#define MIDI_CTL_SC8 0x4d
|
||||
#define MIDI_CTL_SC9 0x4e
|
||||
#define MIDI_CTL_SC10 0x4f
|
||||
#define MIDI_CTL_GENERAL_PURPOSE5 0x50
|
||||
#define MIDI_CTL_GENERAL_PURPOSE6 0x51
|
||||
#define MIDI_CTL_GENERAL_PURPOSE7 0x52
|
||||
#define MIDI_CTL_GENERAL_PURPOSE8 0x53
|
||||
#define MIDI_CTL_PORTAMENTO_CONTROL 0x54
|
||||
#define MIDI_CTL_E1_REVERB_DEPTH 0x5b
|
||||
#define MIDI_CTL_E2_TREMOLO_DEPTH 0x5c
|
||||
#define MIDI_CTL_E3_CHORUS_DEPTH 0x5d
|
||||
#define MIDI_CTL_E4_DETUNE_DEPTH 0x5e
|
||||
#define MIDI_CTL_E5_PHASER_DEPTH 0x5f
|
||||
#define MIDI_CTL_DATA_INCREMENT 0x60
|
||||
#define MIDI_CTL_DATA_DECREMENT 0x61
|
||||
#define MIDI_CTL_NONREG_PARM_NUM_LSB 0x62
|
||||
#define MIDI_CTL_NONREG_PARM_NUM_MSB 0x63
|
||||
#define MIDI_CTL_REGIST_PARM_NUM_LSB 0x64
|
||||
#define MIDI_CTL_REGIST_PARM_NUM_MSB 0x65
|
||||
#define MIDI_CTL_ALL_SOUNDS_OFF 0x78
|
||||
#define MIDI_CTL_RESET_CONTROLLERS 0x79
|
||||
#define MIDI_CTL_LOCAL_CONTROL_SWITCH 0x7a
|
||||
#define MIDI_CTL_ALL_NOTES_OFF 0x7b
|
||||
#define MIDI_CTL_OMNI_OFF 0x7c
|
||||
#define MIDI_CTL_OMNI_ON 0x7d
|
||||
#define MIDI_CTL_MONO1 0x7e
|
||||
#define MIDI_CTL_MONO2 0x7f
|
||||
|
||||
#endif /* __SOUND_ASOUNDEF_H */
|
||||
164
include/sound/control.h
Normal file
164
include/sound/control.h
Normal file
@@ -0,0 +1,164 @@
|
||||
#ifndef __SOUND_CONTROL_H
|
||||
#define __SOUND_CONTROL_H
|
||||
|
||||
/*
|
||||
* Header file for control interface
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sound/asound.h>
|
||||
|
||||
#define snd_kcontrol_chip(kcontrol) ((kcontrol)->private_data)
|
||||
|
||||
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 int (snd_kcontrol_tlv_rw_t)(struct snd_kcontrol *kcontrol,
|
||||
int op_flag, /* 0=read,1=write,-1=command */
|
||||
unsigned int size,
|
||||
unsigned int __user *tlv);
|
||||
|
||||
|
||||
struct snd_kcontrol_new {
|
||||
snd_ctl_elem_iface_t iface; /* interface identifier */
|
||||
unsigned int device; /* device/client number */
|
||||
unsigned int subdevice; /* subdevice (substream) number */
|
||||
unsigned char *name; /* ASCII name of item */
|
||||
unsigned int index; /* index of item */
|
||||
unsigned int access; /* access rights */
|
||||
unsigned int count; /* count of same elements */
|
||||
snd_kcontrol_info_t *info;
|
||||
snd_kcontrol_get_t *get;
|
||||
snd_kcontrol_put_t *put;
|
||||
union {
|
||||
snd_kcontrol_tlv_rw_t *c;
|
||||
const unsigned int *p;
|
||||
} tlv;
|
||||
unsigned long private_value;
|
||||
};
|
||||
|
||||
struct snd_kcontrol_volatile {
|
||||
struct snd_ctl_file *owner; /* locked */
|
||||
pid_t owner_pid;
|
||||
unsigned int access; /* access rights */
|
||||
};
|
||||
|
||||
struct snd_kcontrol {
|
||||
struct list_head list; /* list of controls */
|
||||
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;
|
||||
union {
|
||||
snd_kcontrol_tlv_rw_t *c;
|
||||
const unsigned int *p;
|
||||
} tlv;
|
||||
unsigned long private_value;
|
||||
void *private_data;
|
||||
void (*private_free)(struct snd_kcontrol *kcontrol);
|
||||
struct snd_kcontrol_volatile vd[0]; /* volatile data */
|
||||
};
|
||||
|
||||
#define snd_kcontrol(n) list_entry(n, struct snd_kcontrol, list)
|
||||
|
||||
struct snd_kctl_event {
|
||||
struct list_head list; /* list of events */
|
||||
struct snd_ctl_elem_id id;
|
||||
unsigned int mask;
|
||||
};
|
||||
|
||||
#define snd_kctl_event(n) list_entry(n, struct snd_kctl_event, list)
|
||||
|
||||
struct snd_ctl_file {
|
||||
struct list_head list; /* list of all control files */
|
||||
struct snd_card *card;
|
||||
pid_t pid;
|
||||
int prefer_pcm_subdevice;
|
||||
int prefer_rawmidi_subdevice;
|
||||
wait_queue_head_t change_sleep;
|
||||
spinlock_t read_lock;
|
||||
struct fasync_struct *fasync;
|
||||
int subscribed; /* read interface is activated */
|
||||
struct list_head events; /* waiting events for read */
|
||||
};
|
||||
|
||||
#define snd_ctl_file(n) list_entry(n, struct snd_ctl_file, list)
|
||||
|
||||
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(struct snd_card * card, unsigned int mask, struct snd_ctl_elem_id * id);
|
||||
|
||||
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(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);
|
||||
#ifdef CONFIG_COMPAT
|
||||
int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn);
|
||||
int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn);
|
||||
#else
|
||||
#define snd_ctl_register_ioctl_compat(fcn)
|
||||
#define snd_ctl_unregister_ioctl_compat(fcn)
|
||||
#endif
|
||||
|
||||
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(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
|
||||
{
|
||||
return id->numid - kctl->id.numid;
|
||||
}
|
||||
|
||||
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(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
|
||||
{
|
||||
if (id->numid) {
|
||||
return snd_ctl_get_ioffnum(kctl, id);
|
||||
} else {
|
||||
return snd_ctl_get_ioffidx(kctl, id);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
dst_id->index += offset;
|
||||
dst_id->numid += offset;
|
||||
return dst_id;
|
||||
}
|
||||
|
||||
#endif /* __SOUND_CONTROL_H */
|
||||
455
include/sound/core.h
Normal file
455
include/sound/core.h
Normal file
@@ -0,0 +1,455 @@
|
||||
#ifndef __SOUND_CORE_H
|
||||
#define __SOUND_CORE_H
|
||||
|
||||
/*
|
||||
* Main header file for the ALSA driver
|
||||
* Copyright (c) 1994-2001 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/sched.h> /* wake_up() */
|
||||
#include <linux/mutex.h> /* struct mutex */
|
||||
#include <linux/rwsem.h> /* struct rw_semaphore */
|
||||
#include <linux/pm.h> /* pm_message_t */
|
||||
#include <linux/device.h>
|
||||
|
||||
/* forward declarations */
|
||||
#ifdef CONFIG_PCI
|
||||
struct pci_dev;
|
||||
#endif
|
||||
#ifdef CONFIG_SBUS
|
||||
struct sbus_dev;
|
||||
#endif
|
||||
|
||||
/* device allocation stuff */
|
||||
|
||||
#define SNDRV_DEV_TYPE_RANGE_SIZE 0x1000
|
||||
|
||||
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 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 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)
|
||||
|
||||
struct snd_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);
|
||||
};
|
||||
|
||||
struct snd_device {
|
||||
struct list_head list; /* list of registered devices */
|
||||
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 */
|
||||
struct snd_device_ops *ops; /* operations */
|
||||
};
|
||||
|
||||
#define snd_device(n) list_entry(n, struct snd_device, list)
|
||||
|
||||
/* monitor files for graceful shutdown (hotplug) */
|
||||
|
||||
struct snd_monitor_file {
|
||||
struct file *file;
|
||||
struct snd_monitor_file *next;
|
||||
const struct file_operations *disconnected_f_op;
|
||||
struct list_head shutdown_list;
|
||||
};
|
||||
|
||||
/* main structure for soundcard */
|
||||
|
||||
struct snd_card {
|
||||
int number; /* number of soundcard (index to
|
||||
snd_cards) */
|
||||
|
||||
char id[16]; /* id string of this card */
|
||||
char driver[16]; /* driver name */
|
||||
char shortname[32]; /* short name of this soundcard */
|
||||
char longname[80]; /* name of this soundcard */
|
||||
char mixername[80]; /* mixer name */
|
||||
char components[80]; /* card components delimited with
|
||||
space */
|
||||
struct module *module; /* top-level module */
|
||||
|
||||
void *private_data; /* private data for soundcard */
|
||||
void (*private_free) (struct snd_card *card); /* callback for freeing of
|
||||
private data */
|
||||
struct list_head devices; /* devices */
|
||||
|
||||
unsigned int last_numid; /* last used numeric ID */
|
||||
struct rw_semaphore controls_rwsem; /* controls list lock */
|
||||
rwlock_t ctl_files_rwlock; /* ctl_files list lock */
|
||||
int controls_count; /* count of all controls */
|
||||
int user_ctl_count; /* count of all user controls */
|
||||
struct list_head controls; /* all controls for this card */
|
||||
struct list_head ctl_files; /* active control files */
|
||||
|
||||
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 */
|
||||
struct snd_shutdown_f_ops *s_f_ops; /* file operations in the shutdown
|
||||
state */
|
||||
spinlock_t files_lock; /* lock the files for this card */
|
||||
int shutdown; /* this card is going down */
|
||||
int free_on_last_close; /* free in context of file_release */
|
||||
wait_queue_head_t shutdown_sleep;
|
||||
struct device *dev; /* device assigned to this card */
|
||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
||||
struct device *card_dev; /* cardX object for sysfs */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
unsigned int power_state; /* power state */
|
||||
struct mutex power_lock; /* power lock */
|
||||
wait_queue_head_t power_sleep;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
|
||||
struct snd_mixer_oss *mixer_oss;
|
||||
int mixer_oss_change_count;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static inline void snd_power_lock(struct snd_card *card)
|
||||
{
|
||||
mutex_lock(&card->power_lock);
|
||||
}
|
||||
|
||||
static inline void snd_power_unlock(struct snd_card *card)
|
||||
{
|
||||
mutex_unlock(&card->power_lock);
|
||||
}
|
||||
|
||||
static inline unsigned int snd_power_get_state(struct snd_card *card)
|
||||
{
|
||||
return card->power_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(struct snd_card *card, unsigned int power_state);
|
||||
|
||||
#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(struct snd_card *card, unsigned int state) { return 0; }
|
||||
#define snd_power_get_state(card) SNDRV_CTL_POWER_D0
|
||||
#define snd_power_change_state(card, state) do { (void)(card); } while (0)
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
struct snd_minor {
|
||||
int type; /* SNDRV_DEVICE_TYPE_XXX */
|
||||
int card; /* card number */
|
||||
int device; /* device number */
|
||||
const struct file_operations *f_ops; /* file operations */
|
||||
void *private_data; /* private data for f_ops->open */
|
||||
struct device *dev; /* device for sysfs */
|
||||
};
|
||||
|
||||
/* return a device pointer linked to each sound device as a parent */
|
||||
static inline struct device *snd_card_get_device_link(struct snd_card *card)
|
||||
{
|
||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
||||
return card ? card->dev : NULL;
|
||||
#else
|
||||
return card ? card->card_dev : NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* sound.c */
|
||||
|
||||
extern int snd_major;
|
||||
extern int snd_ecards_limit;
|
||||
extern struct class *sound_class;
|
||||
|
||||
void snd_request_card(int card);
|
||||
|
||||
int snd_register_device_for_dev(int type, struct snd_card *card,
|
||||
int dev,
|
||||
const struct file_operations *f_ops,
|
||||
void *private_data,
|
||||
const char *name,
|
||||
struct device *device);
|
||||
|
||||
/**
|
||||
* snd_register_device - Register the ALSA device file for the card
|
||||
* @type: the device type, SNDRV_DEVICE_TYPE_XXX
|
||||
* @card: the card instance
|
||||
* @dev: the device index
|
||||
* @f_ops: the file operations
|
||||
* @private_data: user pointer for f_ops->open()
|
||||
* @name: the device file name
|
||||
*
|
||||
* Registers an ALSA device file for the given card.
|
||||
* The operators have to be set in reg parameter.
|
||||
*
|
||||
* This function uses the card's device pointer to link to the
|
||||
* correct &struct device.
|
||||
*
|
||||
* Returns zero if successful, or a negative error code on failure.
|
||||
*/
|
||||
static inline int snd_register_device(int type, struct snd_card *card, int dev,
|
||||
const struct file_operations *f_ops,
|
||||
void *private_data,
|
||||
const char *name)
|
||||
{
|
||||
return snd_register_device_for_dev(type, card, dev, f_ops,
|
||||
private_data, name,
|
||||
snd_card_get_device_link(card));
|
||||
}
|
||||
|
||||
int snd_unregister_device(int type, struct snd_card *card, int dev);
|
||||
void *snd_lookup_minor_data(unsigned int minor, int type);
|
||||
int snd_add_device_sysfs_file(int type, struct snd_card *card, int dev,
|
||||
struct device_attribute *attr);
|
||||
|
||||
#ifdef CONFIG_SND_OSSEMUL
|
||||
int snd_register_oss_device(int type, struct snd_card *card, int dev,
|
||||
const 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);
|
||||
int snd_minor_info_done(void);
|
||||
|
||||
/* sound_oss.c */
|
||||
|
||||
#ifdef CONFIG_SND_OSSEMUL
|
||||
int snd_minor_info_oss_init(void);
|
||||
int snd_minor_info_oss_done(void);
|
||||
#else
|
||||
#define snd_minor_info_oss_init() /*NOP*/
|
||||
#define snd_minor_info_oss_done() /*NOP*/
|
||||
#endif
|
||||
|
||||
/* memory.c */
|
||||
|
||||
int copy_to_user_fromio(void __user *dst, const volatile void __iomem *src, size_t count);
|
||||
int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size_t count);
|
||||
|
||||
/* init.c */
|
||||
|
||||
extern struct snd_card *snd_cards[SNDRV_CARDS];
|
||||
int snd_card_locked(int card);
|
||||
#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)(struct snd_card *card, int cmd);
|
||||
#endif
|
||||
|
||||
struct snd_card *snd_card_new(int idx, const char *id,
|
||||
struct module *module, int extra_size);
|
||||
int snd_card_disconnect(struct snd_card *card);
|
||||
int snd_card_free(struct snd_card *card);
|
||||
int snd_card_free_when_closed(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(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
|
||||
|
||||
/* device.c */
|
||||
|
||||
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 */
|
||||
|
||||
#ifdef CONFIG_ISA_DMA_API
|
||||
#define DMA_MODE_NO_ENABLE 0x0100
|
||||
|
||||
void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode);
|
||||
void snd_dma_disable(unsigned long dma);
|
||||
unsigned int snd_dma_pointer(unsigned long dma, unsigned int size);
|
||||
#endif
|
||||
|
||||
/* misc.c */
|
||||
struct resource;
|
||||
void release_and_free_resource(struct resource *res);
|
||||
|
||||
#ifdef CONFIG_SND_VERBOSE_PRINTK
|
||||
void snd_verbose_printk(const char *file, int line, const char *format, ...)
|
||||
__attribute__ ((format (printf, 3, 4)));
|
||||
#endif
|
||||
#if defined(CONFIG_SND_DEBUG) && defined(CONFIG_SND_VERBOSE_PRINTK)
|
||||
void snd_verbose_printd(const char *file, int line, const char *format, ...)
|
||||
__attribute__ ((format (printf, 3, 4)));
|
||||
#endif
|
||||
|
||||
/* --- */
|
||||
|
||||
#ifdef CONFIG_SND_VERBOSE_PRINTK
|
||||
/**
|
||||
* snd_printk - printk wrapper
|
||||
* @fmt: format string
|
||||
*
|
||||
* Works like print() but prints the file and the line of the caller
|
||||
* when configured with CONFIG_SND_VERBOSE_PRINTK.
|
||||
*/
|
||||
#define snd_printk(fmt, args...) \
|
||||
snd_verbose_printk(__FILE__, __LINE__, fmt ,##args)
|
||||
#else
|
||||
#define snd_printk(fmt, args...) \
|
||||
printk(fmt ,##args)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
|
||||
#define __ASTRING__(x) #x
|
||||
|
||||
#ifdef CONFIG_SND_VERBOSE_PRINTK
|
||||
/**
|
||||
* snd_printd - debug printk
|
||||
* @fmt: format string
|
||||
*
|
||||
* Compiled only when Works like snd_printk() for debugging purpose.
|
||||
* Ignored when CONFIG_SND_DEBUG is not set.
|
||||
*/
|
||||
#define snd_printd(fmt, args...) \
|
||||
snd_verbose_printd(__FILE__, __LINE__, fmt ,##args)
|
||||
#else
|
||||
#define snd_printd(fmt, args...) \
|
||||
printk(fmt ,##args)
|
||||
#endif
|
||||
/**
|
||||
* snd_assert - run-time assertion macro
|
||||
* @expr: expression
|
||||
*
|
||||
* This macro checks the expression in run-time and invokes the commands
|
||||
* given in the rest arguments if the assertion is failed.
|
||||
* When CONFIG_SND_DEBUG is not set, the expression is executed but
|
||||
* not checked.
|
||||
*/
|
||||
#define snd_assert(expr, args...) do { \
|
||||
if (unlikely(!(expr))) { \
|
||||
snd_printk(KERN_ERR "BUG? (%s)\n", __ASTRING__(expr)); \
|
||||
dump_stack(); \
|
||||
args; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define snd_BUG() do { \
|
||||
snd_printk(KERN_ERR "BUG?\n"); \
|
||||
dump_stack(); \
|
||||
} while (0)
|
||||
|
||||
#else /* !CONFIG_SND_DEBUG */
|
||||
|
||||
#define snd_printd(fmt, args...) /* nothing */
|
||||
#define snd_assert(expr, args...) (void)(expr)
|
||||
#define snd_BUG() /* nothing */
|
||||
|
||||
#endif /* CONFIG_SND_DEBUG */
|
||||
|
||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
||||
/**
|
||||
* snd_printdd - debug printk
|
||||
* @format: format string
|
||||
*
|
||||
* Compiled only when Works like snd_printk() for debugging purpose.
|
||||
* Ignored when CONFIG_SND_DEBUG_DETECT is not set.
|
||||
*/
|
||||
#define snd_printdd(format, args...) snd_printk(format, ##args)
|
||||
#else
|
||||
#define snd_printdd(format, args...) /* nothing */
|
||||
#endif
|
||||
|
||||
|
||||
#define SNDRV_OSS_VERSION ((3<<16)|(8<<8)|(1<<4)|(0)) /* 3.8.1a */
|
||||
|
||||
/* for easier backward-porting */
|
||||
#if defined(CONFIG_GAMEPORT) || defined(CONFIG_GAMEPORT_MODULE)
|
||||
#ifndef gameport_set_dev_parent
|
||||
#define gameport_set_dev_parent(gp,xdev) ((gp)->dev.parent = (xdev))
|
||||
#define gameport_set_port_data(gp,r) ((gp)->port_data = (r))
|
||||
#define gameport_get_port_data(gp) (gp)->port_data
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* PCI quirk list helper */
|
||||
struct snd_pci_quirk {
|
||||
unsigned short subvendor; /* PCI subvendor ID */
|
||||
unsigned short subdevice; /* PCI subdevice ID */
|
||||
int value; /* value */
|
||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
||||
const char *name; /* name of the device (optional) */
|
||||
#endif
|
||||
};
|
||||
|
||||
#define _SND_PCI_QUIRK_ID(vend,dev) \
|
||||
.subvendor = (vend), .subdevice = (dev)
|
||||
#define SND_PCI_QUIRK_ID(vend,dev) {_SND_PCI_QUIRK_ID(vend, dev)}
|
||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
||||
#define SND_PCI_QUIRK(vend,dev,xname,val) \
|
||||
{_SND_PCI_QUIRK_ID(vend, dev), .value = (val), .name = (xname)}
|
||||
#else
|
||||
#define SND_PCI_QUIRK(vend,dev,xname,val) \
|
||||
{_SND_PCI_QUIRK_ID(vend, dev), .value = (val)}
|
||||
#endif
|
||||
|
||||
const struct snd_pci_quirk *
|
||||
snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list);
|
||||
|
||||
|
||||
#endif /* __SOUND_CORE_H */
|
||||
325
include/sound/cs4231.h
Normal file
325
include/sound/cs4231.h
Normal file
@@ -0,0 +1,325 @@
|
||||
#ifndef __SOUND_CS4231_H
|
||||
#define __SOUND_CS4231_H
|
||||
|
||||
/*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
* Definitions for CS4231 & InterWave chips & compatible chips
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "control.h"
|
||||
#include "pcm.h"
|
||||
#include "timer.h"
|
||||
|
||||
/* IO ports */
|
||||
|
||||
#define CS4231P(x) (c_d_c_CS4231##x)
|
||||
|
||||
#define c_d_c_CS4231REGSEL 0
|
||||
#define c_d_c_CS4231REG 1
|
||||
#define c_d_c_CS4231STATUS 2
|
||||
#define c_d_c_CS4231PIO 3
|
||||
|
||||
/* codec registers */
|
||||
|
||||
#define CS4231_LEFT_INPUT 0x00 /* left input control */
|
||||
#define CS4231_RIGHT_INPUT 0x01 /* right input control */
|
||||
#define CS4231_AUX1_LEFT_INPUT 0x02 /* left AUX1 input control */
|
||||
#define CS4231_AUX1_RIGHT_INPUT 0x03 /* right AUX1 input control */
|
||||
#define CS4231_AUX2_LEFT_INPUT 0x04 /* left AUX2 input control */
|
||||
#define CS4231_AUX2_RIGHT_INPUT 0x05 /* right AUX2 input control */
|
||||
#define CS4231_LEFT_OUTPUT 0x06 /* left output control register */
|
||||
#define CS4231_RIGHT_OUTPUT 0x07 /* right output control register */
|
||||
#define CS4231_PLAYBK_FORMAT 0x08 /* clock and data format - playback - bits 7-0 MCE */
|
||||
#define CS4231_IFACE_CTRL 0x09 /* interface control - bits 7-2 MCE */
|
||||
#define CS4231_PIN_CTRL 0x0a /* pin control */
|
||||
#define CS4231_TEST_INIT 0x0b /* test and initialization */
|
||||
#define CS4231_MISC_INFO 0x0c /* miscellaneaous information */
|
||||
#define CS4231_LOOPBACK 0x0d /* loopback control */
|
||||
#define CS4231_PLY_UPR_CNT 0x0e /* playback upper base count */
|
||||
#define CS4231_PLY_LWR_CNT 0x0f /* playback lower base count */
|
||||
#define CS4231_ALT_FEATURE_1 0x10 /* alternate #1 feature enable */
|
||||
#define AD1845_AF1_MIC_LEFT 0x10 /* alternate #1 feature + MIC left */
|
||||
#define CS4231_ALT_FEATURE_2 0x11 /* alternate #2 feature enable */
|
||||
#define AD1845_AF2_MIC_RIGHT 0x11 /* alternate #2 feature + MIC right */
|
||||
#define CS4231_LEFT_LINE_IN 0x12 /* left line input control */
|
||||
#define CS4231_RIGHT_LINE_IN 0x13 /* right line input control */
|
||||
#define CS4231_TIMER_LOW 0x14 /* timer low byte */
|
||||
#define CS4231_TIMER_HIGH 0x15 /* timer high byte */
|
||||
#define CS4231_LEFT_MIC_INPUT 0x16 /* left MIC input control register (InterWave only) */
|
||||
#define AD1845_UPR_FREQ_SEL 0x16 /* upper byte of frequency select */
|
||||
#define CS4231_RIGHT_MIC_INPUT 0x17 /* right MIC input control register (InterWave only) */
|
||||
#define AD1845_LWR_FREQ_SEL 0x17 /* lower byte of frequency select */
|
||||
#define CS4236_EXT_REG 0x17 /* extended register access */
|
||||
#define CS4231_IRQ_STATUS 0x18 /* irq status register */
|
||||
#define CS4231_LINE_LEFT_OUTPUT 0x19 /* left line output control register (InterWave only) */
|
||||
#define CS4231_VERSION 0x19 /* CS4231(A) - version values */
|
||||
#define CS4231_MONO_CTRL 0x1a /* mono input/output control */
|
||||
#define CS4231_LINE_RIGHT_OUTPUT 0x1b /* right line output control register (InterWave only) */
|
||||
#define AD1845_PWR_DOWN 0x1b /* power down control */
|
||||
#define CS4235_LEFT_MASTER 0x1b /* left master output control */
|
||||
#define CS4231_REC_FORMAT 0x1c /* clock and data format - record - bits 7-0 MCE */
|
||||
#define CS4231_PLY_VAR_FREQ 0x1d /* playback variable frequency */
|
||||
#define AD1845_CLOCK 0x1d /* crystal clock select and total power down */
|
||||
#define CS4235_RIGHT_MASTER 0x1d /* right master output control */
|
||||
#define CS4231_REC_UPR_CNT 0x1e /* record upper count */
|
||||
#define CS4231_REC_LWR_CNT 0x1f /* record lower count */
|
||||
|
||||
/* definitions for codec register select port - CODECP( REGSEL ) */
|
||||
|
||||
#define CS4231_INIT 0x80 /* CODEC is initializing */
|
||||
#define CS4231_MCE 0x40 /* mode change enable */
|
||||
#define CS4231_TRD 0x20 /* transfer request disable */
|
||||
|
||||
/* definitions for codec status register - CODECP( STATUS ) */
|
||||
|
||||
#define CS4231_GLOBALIRQ 0x01 /* IRQ is active */
|
||||
|
||||
/* definitions for codec irq status */
|
||||
|
||||
#define CS4231_PLAYBACK_IRQ 0x10
|
||||
#define CS4231_RECORD_IRQ 0x20
|
||||
#define CS4231_TIMER_IRQ 0x40
|
||||
#define CS4231_ALL_IRQS 0x70
|
||||
#define CS4231_REC_UNDERRUN 0x08
|
||||
#define CS4231_REC_OVERRUN 0x04
|
||||
#define CS4231_PLY_OVERRUN 0x02
|
||||
#define CS4231_PLY_UNDERRUN 0x01
|
||||
|
||||
/* definitions for CS4231_LEFT_INPUT and CS4231_RIGHT_INPUT registers */
|
||||
|
||||
#define CS4231_ENABLE_MIC_GAIN 0x20
|
||||
|
||||
#define CS4231_MIXS_LINE 0x00
|
||||
#define CS4231_MIXS_AUX1 0x40
|
||||
#define CS4231_MIXS_MIC 0x80
|
||||
#define CS4231_MIXS_ALL 0xc0
|
||||
|
||||
/* definitions for clock and data format register - CS4231_PLAYBK_FORMAT */
|
||||
|
||||
#define CS4231_LINEAR_8 0x00 /* 8-bit unsigned data */
|
||||
#define CS4231_ALAW_8 0x60 /* 8-bit A-law companded */
|
||||
#define CS4231_ULAW_8 0x20 /* 8-bit U-law companded */
|
||||
#define CS4231_LINEAR_16 0x40 /* 16-bit twos complement data - little endian */
|
||||
#define CS4231_LINEAR_16_BIG 0xc0 /* 16-bit twos complement data - big endian */
|
||||
#define CS4231_ADPCM_16 0xa0 /* 16-bit ADPCM */
|
||||
#define CS4231_STEREO 0x10 /* stereo mode */
|
||||
/* bits 3-1 define frequency divisor */
|
||||
#define CS4231_XTAL1 0x00 /* 24.576 crystal */
|
||||
#define CS4231_XTAL2 0x01 /* 16.9344 crystal */
|
||||
|
||||
/* definitions for interface control register - CS4231_IFACE_CTRL */
|
||||
|
||||
#define CS4231_RECORD_PIO 0x80 /* record PIO enable */
|
||||
#define CS4231_PLAYBACK_PIO 0x40 /* playback PIO enable */
|
||||
#define CS4231_CALIB_MODE 0x18 /* calibration mode bits */
|
||||
#define CS4231_AUTOCALIB 0x08 /* auto calibrate */
|
||||
#define CS4231_SINGLE_DMA 0x04 /* use single DMA channel */
|
||||
#define CS4231_RECORD_ENABLE 0x02 /* record enable */
|
||||
#define CS4231_PLAYBACK_ENABLE 0x01 /* playback enable */
|
||||
|
||||
/* definitions for pin control register - CS4231_PIN_CTRL */
|
||||
|
||||
#define CS4231_IRQ_ENABLE 0x02 /* enable IRQ */
|
||||
#define CS4231_XCTL1 0x40 /* external control #1 */
|
||||
#define CS4231_XCTL0 0x80 /* external control #0 */
|
||||
|
||||
/* definitions for test and init register - CS4231_TEST_INIT */
|
||||
|
||||
#define CS4231_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */
|
||||
#define CS4231_DMA_REQUEST 0x10 /* DMA request in progress */
|
||||
|
||||
/* definitions for misc control register - CS4231_MISC_INFO */
|
||||
|
||||
#define CS4231_MODE2 0x40 /* MODE 2 */
|
||||
#define CS4231_IW_MODE3 0x6c /* MODE 3 - InterWave enhanced mode */
|
||||
#define CS4231_4236_MODE3 0xe0 /* MODE 3 - CS4236+ enhanced mode */
|
||||
|
||||
/* definitions for alternate feature 1 register - CS4231_ALT_FEATURE_1 */
|
||||
|
||||
#define CS4231_DACZ 0x01 /* zero DAC when underrun */
|
||||
#define CS4231_TIMER_ENABLE 0x40 /* codec timer enable */
|
||||
#define CS4231_OLB 0x80 /* output level bit */
|
||||
|
||||
/* definitions for Extended Registers - CS4236+ */
|
||||
|
||||
#define CS4236_REG(i23val) (((i23val << 2) & 0x10) | ((i23val >> 4) & 0x0f))
|
||||
#define CS4236_I23VAL(reg) ((((reg)&0xf) << 4) | (((reg)&0x10) >> 2) | 0x8)
|
||||
|
||||
#define CS4236_LEFT_LINE 0x08 /* left LINE alternate volume */
|
||||
#define CS4236_RIGHT_LINE 0x18 /* right LINE alternate volume */
|
||||
#define CS4236_LEFT_MIC 0x28 /* left MIC volume */
|
||||
#define CS4236_RIGHT_MIC 0x38 /* right MIC volume */
|
||||
#define CS4236_LEFT_MIX_CTRL 0x48 /* synthesis and left input mixer control */
|
||||
#define CS4236_RIGHT_MIX_CTRL 0x58 /* right input mixer control */
|
||||
#define CS4236_LEFT_FM 0x68 /* left FM volume */
|
||||
#define CS4236_RIGHT_FM 0x78 /* right FM volume */
|
||||
#define CS4236_LEFT_DSP 0x88 /* left DSP serial port volume */
|
||||
#define CS4236_RIGHT_DSP 0x98 /* right DSP serial port volume */
|
||||
#define CS4236_RIGHT_LOOPBACK 0xa8 /* right loopback monitor volume */
|
||||
#define CS4236_DAC_MUTE 0xb8 /* DAC mute and IFSE enable */
|
||||
#define CS4236_ADC_RATE 0xc8 /* indenpendent ADC sample frequency */
|
||||
#define CS4236_DAC_RATE 0xd8 /* indenpendent DAC sample frequency */
|
||||
#define CS4236_LEFT_MASTER 0xe8 /* left master digital audio volume */
|
||||
#define CS4236_RIGHT_MASTER 0xf8 /* right master digital audio volume */
|
||||
#define CS4236_LEFT_WAVE 0x0c /* left wavetable serial port volume */
|
||||
#define CS4236_RIGHT_WAVE 0x1c /* right wavetable serial port volume */
|
||||
#define CS4236_VERSION 0x9c /* chip version and ID */
|
||||
|
||||
/* defines for codec.mode */
|
||||
|
||||
#define CS4231_MODE_NONE 0x0000
|
||||
#define CS4231_MODE_PLAY 0x0001
|
||||
#define CS4231_MODE_RECORD 0x0002
|
||||
#define CS4231_MODE_TIMER 0x0004
|
||||
#define CS4231_MODE_OPEN (CS4231_MODE_PLAY|CS4231_MODE_RECORD|CS4231_MODE_TIMER)
|
||||
|
||||
/* defines for codec.hardware */
|
||||
|
||||
#define CS4231_HW_DETECT 0x0000 /* let CS4231 driver detect chip */
|
||||
#define CS4231_HW_DETECT3 0x0001 /* allow mode 3 */
|
||||
#define CS4231_HW_TYPE_MASK 0xff00 /* type mask */
|
||||
#define CS4231_HW_CS4231_MASK 0x0100 /* CS4231 serie */
|
||||
#define CS4231_HW_CS4231 0x0100 /* CS4231 chip */
|
||||
#define CS4231_HW_CS4231A 0x0101 /* CS4231A chip */
|
||||
#define CS4231_HW_AD1845 0x0102 /* AD1845 chip */
|
||||
#define CS4231_HW_CS4232_MASK 0x0200 /* CS4232 serie (has control ports) */
|
||||
#define CS4231_HW_CS4232 0x0200 /* CS4232 */
|
||||
#define CS4231_HW_CS4232A 0x0201 /* CS4232A */
|
||||
#define CS4231_HW_CS4236 0x0202 /* CS4236 */
|
||||
#define CS4231_HW_CS4236B_MASK 0x0400 /* CS4236B serie (has extended control regs) */
|
||||
#define CS4231_HW_CS4235 0x0400 /* CS4235 - Crystal Clear (tm) stereo enhancement */
|
||||
#define CS4231_HW_CS4236B 0x0401 /* CS4236B */
|
||||
#define CS4231_HW_CS4237B 0x0402 /* CS4237B - SRS 3D */
|
||||
#define CS4231_HW_CS4238B 0x0403 /* CS4238B - QSOUND 3D */
|
||||
#define CS4231_HW_CS4239 0x0404 /* CS4239 - Crystal Clear (tm) stereo enhancement */
|
||||
/* compatible, but clones */
|
||||
#define CS4231_HW_INTERWAVE 0x1000 /* InterWave chip */
|
||||
#define CS4231_HW_OPL3SA2 0x1001 /* OPL3-SA2 chip */
|
||||
|
||||
/* defines for codec.hwshare */
|
||||
#define CS4231_HWSHARE_IRQ (1<<0)
|
||||
#define CS4231_HWSHARE_DMA1 (1<<1)
|
||||
#define CS4231_HWSHARE_DMA2 (1<<2)
|
||||
|
||||
struct snd_cs4231 {
|
||||
unsigned long port; /* base i/o port */
|
||||
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 */
|
||||
unsigned short version; /* version of CODEC chip */
|
||||
unsigned short mode; /* see to CS4231_MODE_XXXX */
|
||||
unsigned short hardware; /* see to CS4231_HW_XXXX */
|
||||
unsigned short hwshare; /* shared resources */
|
||||
unsigned short single_dma:1, /* forced single DMA mode (GUS 16-bit daughter board) or dma1 == dma2 */
|
||||
ebus_flag:1; /* SPARC: EBUS present */
|
||||
|
||||
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 */
|
||||
unsigned char cimage[16]; /* control registers image */
|
||||
int mce_bit;
|
||||
int calibrate_mute;
|
||||
int sw_3d_bit;
|
||||
unsigned int p_dma_size;
|
||||
unsigned int c_dma_size;
|
||||
|
||||
spinlock_t reg_lock;
|
||||
struct mutex mce_mutex;
|
||||
struct mutex open_mutex;
|
||||
|
||||
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) (struct snd_cs4231 *chip);
|
||||
void (*resume) (struct snd_cs4231 *chip);
|
||||
#endif
|
||||
void *dma_private_data;
|
||||
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(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);
|
||||
|
||||
const char *snd_cs4231_chip_id(struct snd_cs4231 *chip);
|
||||
|
||||
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,
|
||||
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(struct snd_card *card,
|
||||
unsigned long port,
|
||||
unsigned long cport,
|
||||
int irq, int dma1, int dma2,
|
||||
unsigned short hardware,
|
||||
unsigned short hwshare,
|
||||
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
|
||||
*/
|
||||
|
||||
#define CS4231_SINGLE(xname, xindex, reg, shift, mask, invert) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
|
||||
.info = snd_cs4231_info_single, \
|
||||
.get = snd_cs4231_get_single, .put = snd_cs4231_put_single, \
|
||||
.private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
|
||||
|
||||
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, \
|
||||
.info = snd_cs4231_info_double, \
|
||||
.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(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 */
|
||||
1744
include/sound/cs46xx.h
Normal file
1744
include/sound/cs46xx.h
Normal file
File diff suppressed because it is too large
Load Diff
1213
include/sound/cs46xx_dsp_scb_types.h
Normal file
1213
include/sound/cs46xx_dsp_scb_types.h
Normal file
File diff suppressed because it is too large
Load Diff
230
include/sound/cs46xx_dsp_spos.h
Normal file
230
include/sound/cs46xx_dsp_spos.h
Normal file
@@ -0,0 +1,230 @@
|
||||
/*
|
||||
* The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __CS46XX_DSP_SPOS_H__
|
||||
#define __CS46XX_DSP_SPOS_H__
|
||||
|
||||
#include "cs46xx_dsp_scb_types.h"
|
||||
#include "cs46xx_dsp_task_types.h"
|
||||
|
||||
#define SYMBOL_CONSTANT 0x0
|
||||
#define SYMBOL_SAMPLE 0x1
|
||||
#define SYMBOL_PARAMETER 0x2
|
||||
#define SYMBOL_CODE 0x3
|
||||
|
||||
#define SEGTYPE_SP_PROGRAM 0x00000001
|
||||
#define SEGTYPE_SP_PARAMETER 0x00000002
|
||||
#define SEGTYPE_SP_SAMPLE 0x00000003
|
||||
#define SEGTYPE_SP_COEFFICIENT 0x00000004
|
||||
|
||||
#define DSP_SPOS_UU 0x0deadul /* unused */
|
||||
#define DSP_SPOS_DC 0x0badul /* don't care */
|
||||
#define DSP_SPOS_DC_DC 0x0bad0badul /* don't care */
|
||||
#define DSP_SPOS_UUUU 0xdeadc0edul /* unused */
|
||||
#define DSP_SPOS_UUHI 0xdeadul
|
||||
#define DSP_SPOS_UULO 0xc0edul
|
||||
#define DSP_SPOS_DCDC 0x0badf1d0ul /* don't care */
|
||||
#define DSP_SPOS_DCDCHI 0x0badul
|
||||
#define DSP_SPOS_DCDCLO 0xf1d0ul
|
||||
|
||||
#define DSP_MAX_TASK_NAME 60
|
||||
#define DSP_MAX_SYMBOL_NAME 100
|
||||
#define DSP_MAX_SCB_NAME 60
|
||||
#define DSP_MAX_SCB_DESC 200
|
||||
#define DSP_MAX_TASK_DESC 50
|
||||
|
||||
#define DSP_MAX_PCM_CHANNELS 32
|
||||
#define DSP_MAX_SRC_NR 14
|
||||
|
||||
#define DSP_PCM_MAIN_CHANNEL 1
|
||||
#define DSP_PCM_REAR_CHANNEL 2
|
||||
#define DSP_PCM_CENTER_LFE_CHANNEL 3
|
||||
#define DSP_PCM_S71_CHANNEL 4 /* surround 7.1 */
|
||||
#define DSP_IEC958_CHANNEL 5
|
||||
|
||||
#define DSP_SPDIF_STATUS_OUTPUT_ENABLED 1
|
||||
#define DSP_SPDIF_STATUS_PLAYBACK_OPEN 2
|
||||
#define DSP_SPDIF_STATUS_HW_ENABLED 4
|
||||
#define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED 8
|
||||
|
||||
struct dsp_symbol_entry {
|
||||
u32 address;
|
||||
char symbol_name[DSP_MAX_SYMBOL_NAME];
|
||||
int symbol_type;
|
||||
|
||||
/* initialized by driver */
|
||||
struct dsp_module_desc * module;
|
||||
int deleted;
|
||||
};
|
||||
|
||||
struct dsp_symbol_desc {
|
||||
int nsymbols;
|
||||
|
||||
struct dsp_symbol_entry *symbols;
|
||||
|
||||
/* initialized by driver */
|
||||
int highest_frag_index;
|
||||
};
|
||||
|
||||
struct dsp_segment_desc {
|
||||
int segment_type;
|
||||
u32 offset;
|
||||
u32 size;
|
||||
u32 * data;
|
||||
};
|
||||
|
||||
struct dsp_module_desc {
|
||||
char * module_name;
|
||||
struct dsp_symbol_desc symbol_table;
|
||||
int nsegments;
|
||||
struct dsp_segment_desc * segments;
|
||||
|
||||
/* initialized by driver */
|
||||
u32 overlay_begin_address;
|
||||
u32 load_address;
|
||||
int nfixups;
|
||||
};
|
||||
|
||||
struct dsp_scb_descriptor {
|
||||
char scb_name[DSP_MAX_SCB_NAME];
|
||||
u32 address;
|
||||
int index;
|
||||
|
||||
struct dsp_scb_descriptor * sub_list_ptr;
|
||||
struct dsp_scb_descriptor * next_scb_ptr;
|
||||
struct dsp_scb_descriptor * parent_scb_ptr;
|
||||
|
||||
struct dsp_symbol_entry * task_entry;
|
||||
struct dsp_symbol_entry * scb_symbol;
|
||||
|
||||
struct snd_info_entry *proc_info;
|
||||
int ref_count;
|
||||
spinlock_t lock;
|
||||
|
||||
int deleted;
|
||||
};
|
||||
|
||||
struct dsp_task_descriptor {
|
||||
char task_name[DSP_MAX_TASK_NAME];
|
||||
int size;
|
||||
u32 address;
|
||||
int index;
|
||||
};
|
||||
|
||||
struct dsp_pcm_channel_descriptor {
|
||||
int active;
|
||||
int src_slot;
|
||||
int pcm_slot;
|
||||
u32 sample_rate;
|
||||
u32 unlinked;
|
||||
struct dsp_scb_descriptor * pcm_reader_scb;
|
||||
struct dsp_scb_descriptor * src_scb;
|
||||
struct dsp_scb_descriptor * mixer_scb;
|
||||
|
||||
void * private_data;
|
||||
};
|
||||
|
||||
struct dsp_spos_instance {
|
||||
struct dsp_symbol_desc symbol_table; /* currently availble loaded symbols in SP */
|
||||
|
||||
int nmodules;
|
||||
struct dsp_module_desc * modules; /* modules loaded into SP */
|
||||
|
||||
struct dsp_segment_desc code;
|
||||
|
||||
/* Main PCM playback mixer */
|
||||
struct dsp_scb_descriptor * master_mix_scb;
|
||||
u16 dac_volume_right;
|
||||
u16 dac_volume_left;
|
||||
|
||||
/* Rear/surround PCM playback mixer */
|
||||
struct dsp_scb_descriptor * rear_mix_scb;
|
||||
|
||||
/* Center/LFE mixer */
|
||||
struct dsp_scb_descriptor * center_lfe_mix_scb;
|
||||
|
||||
int npcm_channels;
|
||||
int nsrc_scb;
|
||||
struct dsp_pcm_channel_descriptor pcm_channels[DSP_MAX_PCM_CHANNELS];
|
||||
int src_scb_slots[DSP_MAX_SRC_NR];
|
||||
|
||||
/* cache this symbols */
|
||||
struct dsp_symbol_entry * null_algorithm; /* used by PCMreaderSCB's */
|
||||
struct dsp_symbol_entry * s16_up; /* used by SRCtaskSCB's */
|
||||
|
||||
/* proc fs */
|
||||
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;
|
||||
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;
|
||||
struct dsp_task_descriptor tasks[DSP_MAX_TASK_DESC];
|
||||
struct snd_info_entry * proc_task_info_entry;
|
||||
|
||||
/* SPDIF status */
|
||||
int spdif_status_out;
|
||||
int spdif_status_in;
|
||||
u16 spdif_input_volume_right;
|
||||
u16 spdif_input_volume_left;
|
||||
/* spdif channel status,
|
||||
left right and user validity bits */
|
||||
unsigned int spdif_csuv_default;
|
||||
unsigned int spdif_csuv_stream;
|
||||
|
||||
/* SPDIF input sample rate converter */
|
||||
struct dsp_scb_descriptor * spdif_in_src;
|
||||
/* SPDIF input asynch. receiver */
|
||||
struct dsp_scb_descriptor * asynch_rx_scb;
|
||||
|
||||
/* Capture record mixer SCB */
|
||||
struct dsp_scb_descriptor * record_mixer_scb;
|
||||
|
||||
/* CODEC input SCB */
|
||||
struct dsp_scb_descriptor * codec_in_scb;
|
||||
|
||||
/* reference snooper */
|
||||
struct dsp_scb_descriptor * ref_snoop_scb;
|
||||
|
||||
/* SPDIF output PCM reference */
|
||||
struct dsp_scb_descriptor * spdif_pcm_input_scb;
|
||||
|
||||
/* asynch TX task */
|
||||
struct dsp_scb_descriptor * asynch_tx_scb;
|
||||
|
||||
/* record sources */
|
||||
struct dsp_scb_descriptor * pcm_input;
|
||||
struct dsp_scb_descriptor * adc_input;
|
||||
|
||||
int spdif_in_sample_rate;
|
||||
};
|
||||
|
||||
#endif /* __DSP_SPOS_H__ */
|
||||
252
include/sound/cs46xx_dsp_task_types.h
Normal file
252
include/sound/cs46xx_dsp_task_types.h
Normal file
@@ -0,0 +1,252 @@
|
||||
/*
|
||||
* The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*
|
||||
* NOTE: comments are copy/paste from cwcemb80.lst
|
||||
* provided by Tom Woller at Cirrus (my only
|
||||
* documentation about the SP OS running inside
|
||||
* the DSP)
|
||||
*/
|
||||
|
||||
#ifndef __CS46XX_DSP_TASK_TYPES_H__
|
||||
#define __CS46XX_DSP_TASK_TYPES_H__
|
||||
|
||||
#include "cs46xx_dsp_scb_types.h"
|
||||
|
||||
/*********************************************************************************************
|
||||
Example hierarchy of stream control blocks in the SP
|
||||
|
||||
hfgTree
|
||||
Ptr____Call (c)
|
||||
\
|
||||
-------+------ ------------- ------------- ------------- -----
|
||||
| SBlaster IF |______\| Foreground |___\| Middlegr'nd |___\| Background |___\| Nul |
|
||||
| |Goto /| tree header |g /| tree header |g /| tree header |g /| SCB |r
|
||||
-------------- (g) ------------- ------------- ------------- -----
|
||||
|c |c |c |c
|
||||
| | | |
|
||||
\/ ------------- ------------- -------------
|
||||
| Foreground |_\ | Middlegr'nd |_\ | Background |_\
|
||||
| tree |g/ | tree |g/ | tree |g/
|
||||
------------- ------------- -------------
|
||||
|c |c |c
|
||||
| | |
|
||||
\/ \/ \/
|
||||
|
||||
*********************************************************************************************/
|
||||
|
||||
#define HFG_FIRST_EXECUTE_MODE 0x0001
|
||||
#define HFG_FIRST_EXECUTE_MODE_BIT 0
|
||||
#define HFG_CONTEXT_SWITCH_MODE 0x0002
|
||||
#define HFG_CONTEXT_SWITCH_MODE_BIT 1
|
||||
|
||||
#define MAX_FG_STACK_SIZE 32 /* THESE NEED TO BE COMPUTED PROPERLY */
|
||||
#define MAX_MG_STACK_SIZE 16
|
||||
#define MAX_BG_STACK_SIZE 9
|
||||
#define MAX_HFG_STACK_SIZE 4
|
||||
|
||||
#define SLEEP_ACTIVE_INCREMENT 0 /* Enable task tree thread to go to sleep
|
||||
This should only ever be used on the Background thread */
|
||||
#define STANDARD_ACTIVE_INCREMENT 1 /* Task tree thread normal operation */
|
||||
#define SUSPEND_ACTIVE_INCREMENT 2 /* Cause execution to suspend in the task tree thread
|
||||
This should only ever be used on the Background thread */
|
||||
|
||||
#define HOSTFLAGS_DISABLE_BG_SLEEP 0 /* Host-controlled flag that determines whether we go to sleep
|
||||
at the end of BG */
|
||||
|
||||
/* Minimal context save area for Hyper Forground */
|
||||
struct dsp_hf_save_area {
|
||||
u32 r10_save;
|
||||
u32 r54_save;
|
||||
u32 r98_save;
|
||||
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
status_save,
|
||||
ind_save
|
||||
)
|
||||
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
rci1_save,
|
||||
rci0_save
|
||||
)
|
||||
|
||||
u32 r32_save;
|
||||
u32 r76_save;
|
||||
u32 rsd2_save;
|
||||
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
rsi2_save, /* See TaskTreeParameterBlock for
|
||||
remainder of registers */
|
||||
rsa2Save
|
||||
)
|
||||
/* saved as part of HFG context */
|
||||
};
|
||||
|
||||
|
||||
/* Task link data structure */
|
||||
struct dsp_tree_link {
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
/* Pointer to sibling task control block */
|
||||
next_scb,
|
||||
/* Pointer to child task control block */
|
||||
sub_ptr
|
||||
)
|
||||
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
/* Pointer to code entry point */
|
||||
entry_point,
|
||||
/* Pointer to local data */
|
||||
this_spb
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
struct dsp_task_tree_data {
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
/* Initial tock count; controls task tree execution rate */
|
||||
tock_count_limit,
|
||||
/* Tock down counter */
|
||||
tock_count
|
||||
)
|
||||
|
||||
/* Add to ActiveCount when TockCountLimit reached:
|
||||
Subtract on task tree termination */
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
active_tncrement,
|
||||
/* Number of pending activations for task tree */
|
||||
active_count
|
||||
)
|
||||
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
/* BitNumber to enable modification of correct bit in ActiveTaskFlags */
|
||||
active_bit,
|
||||
/* Pointer to OS location for indicating current activity on task level */
|
||||
active_task_flags_ptr
|
||||
)
|
||||
|
||||
/* Data structure for controlling movement of memory blocks:-
|
||||
currently unused */
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
mem_upd_ptr,
|
||||
/* Data structure for controlling synchronous link update */
|
||||
link_upd_ptr
|
||||
)
|
||||
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
/* Save area for remainder of full context. */
|
||||
save_area,
|
||||
/* Address of start of local stack for data storage */
|
||||
data_stack_base_ptr
|
||||
)
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct dsp_interval_timer_data
|
||||
{
|
||||
/* These data items have the same relative locations to those */
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
interval_timer_period,
|
||||
itd_unused
|
||||
)
|
||||
|
||||
/* used for this data in the SPOS control block for SPOS 1.0 */
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
num_FG_ticks_this_interval,
|
||||
num_intervals
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
/* This structure contains extra storage for the task tree
|
||||
Currently, this additional data is related only to a full context save */
|
||||
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 */
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
stack1,
|
||||
stack0
|
||||
)
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
stack3,
|
||||
stack2
|
||||
)
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
stack5,
|
||||
stack4
|
||||
)
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
stack7,
|
||||
stack6
|
||||
)
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
stack9,
|
||||
stack8
|
||||
)
|
||||
|
||||
u32 saverfe;
|
||||
|
||||
/* Value may be overwriten by stack save algorithm.
|
||||
Retain the size of the stack data saved here if used */
|
||||
___DSP_DUAL_16BIT_ALLOC(
|
||||
reserved1,
|
||||
stack_size
|
||||
)
|
||||
u32 saverba; /* (HFG) */
|
||||
u32 saverdc;
|
||||
u32 savers_config_23; /* (HFG) */
|
||||
u32 savers_DMA23; /* (HFG) */
|
||||
u32 saversa0;
|
||||
u32 saversi0;
|
||||
u32 saversa1;
|
||||
u32 saversi1;
|
||||
u32 saversa3;
|
||||
u32 saversd0;
|
||||
u32 saversd1;
|
||||
u32 saversd3;
|
||||
u32 savers_config01;
|
||||
u32 savers_DMA01;
|
||||
u32 saveacc0hl;
|
||||
u32 saveacc1hl;
|
||||
u32 saveacc0xacc1x;
|
||||
u32 saveacc2hl;
|
||||
u32 saveacc3hl;
|
||||
u32 saveacc2xacc3x;
|
||||
u32 saveaux0hl;
|
||||
u32 saveaux1hl;
|
||||
u32 saveaux0xaux1x;
|
||||
u32 saveaux2hl;
|
||||
u32 saveaux3hl;
|
||||
u32 saveaux2xaux3x;
|
||||
u32 savershouthl;
|
||||
u32 savershoutxmacmode;
|
||||
};
|
||||
|
||||
|
||||
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__ */
|
||||
257
include/sound/cs8403.h
Normal file
257
include/sound/cs8403.h
Normal file
@@ -0,0 +1,257 @@
|
||||
#ifndef __SOUND_CS8403_H
|
||||
#define __SOUND_CS8403_H
|
||||
|
||||
/*
|
||||
* Routines for Cirrus Logic CS8403/CS8404A IEC958 (S/PDIF) Transmitter
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
||||
* Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef SND_CS8403
|
||||
|
||||
#ifndef SND_CS8403_DECL
|
||||
#define SND_CS8403_DECL static
|
||||
#endif
|
||||
#ifndef SND_CS8403_DECODE
|
||||
#define SND_CS8403_DECODE snd_cs8403_decode_spdif_bits
|
||||
#endif
|
||||
#ifndef SND_CS8403_ENCODE
|
||||
#define SND_CS8403_ENCODE snd_cs8403_encode_spdif_bits
|
||||
#endif
|
||||
|
||||
|
||||
SND_CS8403_DECL void SND_CS8403_DECODE(struct snd_aes_iec958 *diga, unsigned char bits)
|
||||
{
|
||||
if (bits & 0x01) { /* consumer */
|
||||
if (!(bits & 0x02))
|
||||
diga->status[0] |= IEC958_AES0_NONAUDIO;
|
||||
if (!(bits & 0x08))
|
||||
diga->status[0] |= IEC958_AES0_CON_NOT_COPYRIGHT;
|
||||
switch (bits & 0x10) {
|
||||
case 0x10: diga->status[0] |= IEC958_AES0_CON_EMPHASIS_NONE; break;
|
||||
case 0x00: diga->status[0] |= IEC958_AES0_CON_EMPHASIS_5015; break;
|
||||
}
|
||||
if (!(bits & 0x80))
|
||||
diga->status[1] |= IEC958_AES1_CON_ORIGINAL;
|
||||
switch (bits & 0x60) {
|
||||
case 0x00: diga->status[1] |= IEC958_AES1_CON_MAGNETIC_ID; break;
|
||||
case 0x20: diga->status[1] |= IEC958_AES1_CON_DIGDIGCONV_ID; break;
|
||||
case 0x40: diga->status[1] |= IEC958_AES1_CON_LASEROPT_ID; break;
|
||||
case 0x60: diga->status[1] |= IEC958_AES1_CON_GENERAL; break;
|
||||
}
|
||||
switch (bits & 0x06) {
|
||||
case 0x00: diga->status[3] |= IEC958_AES3_CON_FS_44100; break;
|
||||
case 0x02: diga->status[3] |= IEC958_AES3_CON_FS_48000; break;
|
||||
case 0x04: diga->status[3] |= IEC958_AES3_CON_FS_32000; break;
|
||||
}
|
||||
} else {
|
||||
diga->status[0] = IEC958_AES0_PROFESSIONAL;
|
||||
switch (bits & 0x18) {
|
||||
case 0x00: diga->status[0] |= IEC958_AES0_PRO_FS_32000; break;
|
||||
case 0x10: diga->status[0] |= IEC958_AES0_PRO_FS_44100; break;
|
||||
case 0x08: diga->status[0] |= IEC958_AES0_PRO_FS_48000; break;
|
||||
case 0x18: diga->status[0] |= IEC958_AES0_PRO_FS_NOTID; break;
|
||||
}
|
||||
switch (bits & 0x60) {
|
||||
case 0x20: diga->status[0] |= IEC958_AES0_PRO_EMPHASIS_NONE; break;
|
||||
case 0x40: diga->status[0] |= IEC958_AES0_PRO_EMPHASIS_5015; break;
|
||||
case 0x00: diga->status[0] |= IEC958_AES0_PRO_EMPHASIS_CCITT; break;
|
||||
case 0x60: diga->status[0] |= IEC958_AES0_PRO_EMPHASIS_NOTID; break;
|
||||
}
|
||||
if (bits & 0x80)
|
||||
diga->status[1] |= IEC958_AES1_PRO_MODE_STEREOPHONIC;
|
||||
}
|
||||
}
|
||||
|
||||
SND_CS8403_DECL unsigned char SND_CS8403_ENCODE(struct snd_aes_iec958 *diga)
|
||||
{
|
||||
unsigned char bits;
|
||||
|
||||
if (!(diga->status[0] & IEC958_AES0_PROFESSIONAL)) {
|
||||
bits = 0x01; /* consumer mode */
|
||||
if (diga->status[0] & IEC958_AES0_NONAUDIO)
|
||||
bits &= ~0x02;
|
||||
else
|
||||
bits |= 0x02;
|
||||
if (diga->status[0] & IEC958_AES0_CON_NOT_COPYRIGHT)
|
||||
bits &= ~0x08;
|
||||
else
|
||||
bits |= 0x08;
|
||||
switch (diga->status[0] & IEC958_AES0_CON_EMPHASIS) {
|
||||
default:
|
||||
case IEC958_AES0_CON_EMPHASIS_NONE: bits |= 0x10; break;
|
||||
case IEC958_AES0_CON_EMPHASIS_5015: bits |= 0x00; break;
|
||||
}
|
||||
if (diga->status[1] & IEC958_AES1_CON_ORIGINAL)
|
||||
bits &= ~0x80;
|
||||
else
|
||||
bits |= 0x80;
|
||||
if ((diga->status[1] & IEC958_AES1_CON_CATEGORY) == IEC958_AES1_CON_GENERAL)
|
||||
bits |= 0x60;
|
||||
else {
|
||||
switch(diga->status[1] & IEC958_AES1_CON_MAGNETIC_MASK) {
|
||||
case IEC958_AES1_CON_MAGNETIC_ID:
|
||||
bits |= 0x00; break;
|
||||
case IEC958_AES1_CON_DIGDIGCONV_ID:
|
||||
bits |= 0x20; break;
|
||||
default:
|
||||
case IEC958_AES1_CON_LASEROPT_ID:
|
||||
bits |= 0x40; break;
|
||||
}
|
||||
}
|
||||
switch (diga->status[3] & IEC958_AES3_CON_FS) {
|
||||
default:
|
||||
case IEC958_AES3_CON_FS_44100: bits |= 0x00; break;
|
||||
case IEC958_AES3_CON_FS_48000: bits |= 0x02; break;
|
||||
case IEC958_AES3_CON_FS_32000: bits |= 0x04; break;
|
||||
}
|
||||
} else {
|
||||
bits = 0x00; /* professional mode */
|
||||
if (diga->status[0] & IEC958_AES0_NONAUDIO)
|
||||
bits &= ~0x02;
|
||||
else
|
||||
bits |= 0x02;
|
||||
/* CHECKME: I'm not sure about the bit order in val here */
|
||||
switch (diga->status[0] & IEC958_AES0_PRO_FS) {
|
||||
case IEC958_AES0_PRO_FS_32000: bits |= 0x00; break;
|
||||
case IEC958_AES0_PRO_FS_44100: bits |= 0x10; break; /* 44.1kHz */
|
||||
case IEC958_AES0_PRO_FS_48000: bits |= 0x08; break; /* 48kHz */
|
||||
default:
|
||||
case IEC958_AES0_PRO_FS_NOTID: bits |= 0x18; break;
|
||||
}
|
||||
switch (diga->status[0] & IEC958_AES0_PRO_EMPHASIS) {
|
||||
case IEC958_AES0_PRO_EMPHASIS_NONE: bits |= 0x20; break;
|
||||
case IEC958_AES0_PRO_EMPHASIS_5015: bits |= 0x40; break;
|
||||
case IEC958_AES0_PRO_EMPHASIS_CCITT: bits |= 0x00; break;
|
||||
default:
|
||||
case IEC958_AES0_PRO_EMPHASIS_NOTID: bits |= 0x60; break;
|
||||
}
|
||||
switch (diga->status[1] & IEC958_AES1_PRO_MODE) {
|
||||
case IEC958_AES1_PRO_MODE_TWO:
|
||||
case IEC958_AES1_PRO_MODE_STEREOPHONIC: bits |= 0x00; break;
|
||||
default: bits |= 0x80; break;
|
||||
}
|
||||
}
|
||||
return bits;
|
||||
}
|
||||
|
||||
#endif /* SND_CS8403 */
|
||||
|
||||
#ifdef SND_CS8404
|
||||
|
||||
#ifndef SND_CS8404_DECL
|
||||
#define SND_CS8404_DECL static
|
||||
#endif
|
||||
#ifndef SND_CS8404_DECODE
|
||||
#define SND_CS8404_DECODE snd_cs8404_decode_spdif_bits
|
||||
#endif
|
||||
#ifndef SND_CS8404_ENCODE
|
||||
#define SND_CS8404_ENCODE snd_cs8404_encode_spdif_bits
|
||||
#endif
|
||||
|
||||
|
||||
SND_CS8404_DECL void SND_CS8404_DECODE(struct snd_aes_iec958 *diga, unsigned char bits)
|
||||
{
|
||||
if (bits & 0x10) { /* consumer */
|
||||
if (!(bits & 0x20))
|
||||
diga->status[0] |= IEC958_AES0_CON_NOT_COPYRIGHT;
|
||||
if (!(bits & 0x40))
|
||||
diga->status[0] |= IEC958_AES0_CON_EMPHASIS_5015;
|
||||
if (!(bits & 0x80))
|
||||
diga->status[1] |= IEC958_AES1_CON_ORIGINAL;
|
||||
switch (bits & 0x03) {
|
||||
case 0x00: diga->status[1] |= IEC958_AES1_CON_DAT; break;
|
||||
case 0x03: diga->status[1] |= IEC958_AES1_CON_GENERAL; break;
|
||||
}
|
||||
switch (bits & 0x06) {
|
||||
case 0x02: diga->status[3] |= IEC958_AES3_CON_FS_32000; break;
|
||||
case 0x04: diga->status[3] |= IEC958_AES3_CON_FS_48000; break;
|
||||
case 0x06: diga->status[3] |= IEC958_AES3_CON_FS_44100; break;
|
||||
}
|
||||
} else {
|
||||
diga->status[0] = IEC958_AES0_PROFESSIONAL;
|
||||
if (!(bits & 0x04))
|
||||
diga->status[0] |= IEC958_AES0_NONAUDIO;
|
||||
switch (bits & 0x60) {
|
||||
case 0x00: diga->status[0] |= IEC958_AES0_PRO_FS_32000; break;
|
||||
case 0x40: diga->status[0] |= IEC958_AES0_PRO_FS_44100; break;
|
||||
case 0x20: diga->status[0] |= IEC958_AES0_PRO_FS_48000; break;
|
||||
case 0x60: diga->status[0] |= IEC958_AES0_PRO_FS_NOTID; break;
|
||||
}
|
||||
switch (bits & 0x03) {
|
||||
case 0x02: diga->status[0] |= IEC958_AES0_PRO_EMPHASIS_NONE; break;
|
||||
case 0x01: diga->status[0] |= IEC958_AES0_PRO_EMPHASIS_5015; break;
|
||||
case 0x00: diga->status[0] |= IEC958_AES0_PRO_EMPHASIS_CCITT; break;
|
||||
case 0x03: diga->status[0] |= IEC958_AES0_PRO_EMPHASIS_NOTID; break;
|
||||
}
|
||||
if (!(bits & 0x80))
|
||||
diga->status[1] |= IEC958_AES1_PRO_MODE_STEREOPHONIC;
|
||||
}
|
||||
}
|
||||
|
||||
SND_CS8404_DECL unsigned char SND_CS8404_ENCODE(struct snd_aes_iec958 *diga)
|
||||
{
|
||||
unsigned char bits;
|
||||
|
||||
if (!(diga->status[0] & IEC958_AES0_PROFESSIONAL)) {
|
||||
bits = 0x10; /* consumer mode */
|
||||
if (!(diga->status[0] & IEC958_AES0_CON_NOT_COPYRIGHT))
|
||||
bits |= 0x20;
|
||||
if ((diga->status[0] & IEC958_AES0_CON_EMPHASIS) == IEC958_AES0_CON_EMPHASIS_NONE)
|
||||
bits |= 0x40;
|
||||
if (!(diga->status[1] & IEC958_AES1_CON_ORIGINAL))
|
||||
bits |= 0x80;
|
||||
if ((diga->status[1] & IEC958_AES1_CON_CATEGORY) == IEC958_AES1_CON_GENERAL)
|
||||
bits |= 0x03;
|
||||
switch (diga->status[3] & IEC958_AES3_CON_FS) {
|
||||
default:
|
||||
case IEC958_AES3_CON_FS_44100: bits |= 0x06; break;
|
||||
case IEC958_AES3_CON_FS_48000: bits |= 0x04; break;
|
||||
case IEC958_AES3_CON_FS_32000: bits |= 0x02; break;
|
||||
}
|
||||
} else {
|
||||
bits = 0x00; /* professional mode */
|
||||
if (!(diga->status[0] & IEC958_AES0_NONAUDIO))
|
||||
bits |= 0x04;
|
||||
switch (diga->status[0] & IEC958_AES0_PRO_FS) {
|
||||
case IEC958_AES0_PRO_FS_32000: bits |= 0x00; break;
|
||||
case IEC958_AES0_PRO_FS_44100: bits |= 0x40; break; /* 44.1kHz */
|
||||
case IEC958_AES0_PRO_FS_48000: bits |= 0x20; break; /* 48kHz */
|
||||
default:
|
||||
case IEC958_AES0_PRO_FS_NOTID: bits |= 0x00; break;
|
||||
}
|
||||
switch (diga->status[0] & IEC958_AES0_PRO_EMPHASIS) {
|
||||
case IEC958_AES0_PRO_EMPHASIS_NONE: bits |= 0x02; break;
|
||||
case IEC958_AES0_PRO_EMPHASIS_5015: bits |= 0x01; break;
|
||||
case IEC958_AES0_PRO_EMPHASIS_CCITT: bits |= 0x00; break;
|
||||
default:
|
||||
case IEC958_AES0_PRO_EMPHASIS_NOTID: bits |= 0x03; break;
|
||||
}
|
||||
switch (diga->status[1] & IEC958_AES1_PRO_MODE) {
|
||||
case IEC958_AES1_PRO_MODE_TWO:
|
||||
case IEC958_AES1_PRO_MODE_STEREOPHONIC: bits |= 0x00; break;
|
||||
default: bits |= 0x80; break;
|
||||
}
|
||||
}
|
||||
return bits;
|
||||
}
|
||||
|
||||
#endif /* SND_CS8404 */
|
||||
|
||||
#endif /* __SOUND_CS8403_H */
|
||||
201
include/sound/cs8427.h
Normal file
201
include/sound/cs8427.h
Normal file
@@ -0,0 +1,201 @@
|
||||
#ifndef __SOUND_CS8427_H
|
||||
#define __SOUND_CS8427_H
|
||||
|
||||
/*
|
||||
* Routines for Cirrus Logic CS8427
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sound/i2c.h>
|
||||
|
||||
#define CS8427_BASE_ADDR 0x10 /* base I2C address */
|
||||
|
||||
#define CS8427_REG_AUTOINC 0x80 /* flag - autoincrement */
|
||||
#define CS8427_REG_CONTROL1 0x01
|
||||
#define CS8427_REG_CONTROL2 0x02
|
||||
#define CS8427_REG_DATAFLOW 0x03
|
||||
#define CS8427_REG_CLOCKSOURCE 0x04
|
||||
#define CS8427_REG_SERIALINPUT 0x05
|
||||
#define CS8427_REG_SERIALOUTPUT 0x06
|
||||
#define CS8427_REG_INT1STATUS 0x07
|
||||
#define CS8427_REG_INT2STATUS 0x08
|
||||
#define CS8427_REG_INT1MASK 0x09
|
||||
#define CS8427_REG_INT1MODEMSB 0x0a
|
||||
#define CS8427_REG_INT1MODELSB 0x0b
|
||||
#define CS8427_REG_INT2MASK 0x0c
|
||||
#define CS8427_REG_INT2MODEMSB 0x0d
|
||||
#define CS8427_REG_INT2MODELSB 0x0e
|
||||
#define CS8427_REG_RECVCSDATA 0x0f
|
||||
#define CS8427_REG_RECVERRORS 0x10
|
||||
#define CS8427_REG_RECVERRMASK 0x11
|
||||
#define CS8427_REG_CSDATABUF 0x12
|
||||
#define CS8427_REG_UDATABUF 0x13
|
||||
#define CS8427_REG_QSUBCODE 0x14 /* 0x14-0x1d (10 bytes) */
|
||||
#define CS8427_REG_OMCKRMCKRATIO 0x1e
|
||||
#define CS8427_REG_CORU_DATABUF 0x20 /* 24 byte buffer area */
|
||||
#define CS8427_REG_ID_AND_VER 0x7f
|
||||
|
||||
/* CS8427_REG_CONTROL1 bits */
|
||||
#define CS8427_SWCLK (1<<7) /* 0 = RMCK default, 1 = OMCK output on RMCK pin */
|
||||
#define CS8427_VSET (1<<6) /* 0 = valid PCM data, 1 = invalid PCM data */
|
||||
#define CS8427_MUTESAO (1<<5) /* mute control for the serial audio output port, 0 = disabled, 1 = enabled */
|
||||
#define CS8427_MUTEAES (1<<4) /* mute control for the AES transmitter output, 0 = disabled, 1 = enabled */
|
||||
#define CS8427_INTMASK (3<<1) /* interrupt output pin setup mask */
|
||||
#define CS8427_INTACTHIGH (0<<1) /* active high */
|
||||
#define CS8427_INTACTLOW (1<<1) /* active low */
|
||||
#define CS8427_INTOPENDRAIN (2<<1) /* open drain, active low */
|
||||
#define CS8427_TCBLDIR (1<<0) /* 0 = TCBL is an input, 1 = TCBL is an output */
|
||||
|
||||
/* CS8427_REQ_CONTROL2 bits */
|
||||
#define CS8427_HOLDMASK (3<<5) /* action when a receiver error occurs */
|
||||
#define CS8427_HOLDLASTSAMPLE (0<<5) /* hold the last valid sample */
|
||||
#define CS8427_HOLDZERO (1<<5) /* replace the current audio sample with zero (mute) */
|
||||
#define CS8427_HOLDNOCHANGE (2<<5) /* do not change the received audio sample */
|
||||
#define CS8427_RMCKF (1<<4) /* 0 = 256*Fsi, 1 = 128*Fsi */
|
||||
#define CS8427_MMR (1<<3) /* AES3 receiver operation, 0 = stereo, 1 = mono */
|
||||
#define CS8427_MMT (1<<2) /* AES3 transmitter operation, 0 = stereo, 1 = mono */
|
||||
#define CS8427_MMTCS (1<<1) /* 0 = use A + B CS data, 1 = use MMTLR CS data */
|
||||
#define CS8427_MMTLR (1<<0) /* 0 = use A CS data, 1 = use B CS data */
|
||||
|
||||
/* CS8427_REG_DATAFLOW */
|
||||
#define CS8427_TXOFF (1<<6) /* AES3 transmitter Output, 0 = normal operation, 1 = off (0V) */
|
||||
#define CS8427_AESBP (1<<5) /* AES3 hardware bypass mode, 0 = normal, 1 = bypass (RX->TX) */
|
||||
#define CS8427_TXDMASK (3<<3) /* AES3 Transmitter Data Source Mask */
|
||||
#define CS8427_TXDSERIAL (1<<3) /* TXD - serial audio input port */
|
||||
#define CS8427_TXAES3DRECEIVER (2<<3) /* TXD - AES3 receiver */
|
||||
#define CS8427_SPDMASK (3<<1) /* Serial Audio Output Port Data Source Mask */
|
||||
#define CS8427_SPDSERIAL (1<<1) /* SPD - serial audio input port */
|
||||
#define CS8427_SPDAES3RECEIVER (2<<1) /* SPD - AES3 receiver */
|
||||
|
||||
/* CS8427_REG_CLOCKSOURCE */
|
||||
#define CS8427_RUN (1<<6) /* 0 = clock off, 1 = clock on */
|
||||
#define CS8427_CLKMASK (3<<4) /* OMCK frequency mask */
|
||||
#define CS8427_CLK256 (0<<4) /* 256*Fso */
|
||||
#define CS8427_CLK384 (1<<4) /* 384*Fso */
|
||||
#define CS8427_CLK512 (2<<4) /* 512*Fso */
|
||||
#define CS8427_OUTC (1<<3) /* Output Time Base, 0 = OMCK, 1 = recovered input clock */
|
||||
#define CS8427_INC (1<<2) /* Input Time Base Clock Source, 0 = recoverd input clock, 1 = OMCK input pin */
|
||||
#define CS8427_RXDMASK (3<<0) /* Recovered Input Clock Source Mask */
|
||||
#define CS8427_RXDILRCK (0<<0) /* 256*Fsi from ILRCK pin */
|
||||
#define CS8427_RXDAES3INPUT (1<<0) /* 256*Fsi from AES3 input */
|
||||
#define CS8427_EXTCLOCKRESET (2<<0) /* bypass PLL, 256*Fsi clock, synchronous reset */
|
||||
#define CS8427_EXTCLOCK (3<<0) /* bypass PLL, 256*Fsi clock */
|
||||
|
||||
/* CS8427_REG_SERIALINPUT */
|
||||
#define CS8427_SIMS (1<<7) /* 0 = slave, 1 = master mode */
|
||||
#define CS8427_SISF (1<<6) /* ISCLK freq, 0 = 64*Fsi, 1 = 128*Fsi */
|
||||
#define CS8427_SIRESMASK (3<<4) /* Resolution of the input data for right justified formats */
|
||||
#define CS8427_SIRES24 (0<<4) /* SIRES 24-bit */
|
||||
#define CS8427_SIRES20 (1<<4) /* SIRES 20-bit */
|
||||
#define CS8427_SIRES16 (2<<4) /* SIRES 16-bit */
|
||||
#define CS8427_SIJUST (1<<3) /* Justification of SDIN data relative to ILRCK, 0 = left-justified, 1 = right-justified */
|
||||
#define CS8427_SIDEL (1<<2) /* Delay of SDIN data relative to ILRCK for left-justified data formats, 0 = first ISCLK period, 1 = second ISCLK period */
|
||||
#define CS8427_SISPOL (1<<1) /* ICLK clock polarity, 0 = rising edge of ISCLK, 1 = falling edge of ISCLK */
|
||||
#define CS8427_SILRPOL (1<<0) /* ILRCK clock polarity, 0 = SDIN data left channel when ILRCK is high, 1 = SDIN right when ILRCK is high */
|
||||
|
||||
/* CS8427_REG_SERIALOUTPUT */
|
||||
#define CS8427_SOMS (1<<7) /* 0 = slave, 1 = master mode */
|
||||
#define CS8427_SOSF (1<<6) /* OSCLK freq, 0 = 64*Fso, 1 = 128*Fso */
|
||||
#define CS8427_SORESMASK (3<<4) /* Resolution of the output data on SDOUT and AES3 output */
|
||||
#define CS8427_SORES24 (0<<4) /* SIRES 24-bit */
|
||||
#define CS8427_SORES20 (1<<4) /* SIRES 20-bit */
|
||||
#define CS8427_SORES16 (2<<4) /* SIRES 16-bit */
|
||||
#define CS8427_SORESDIRECT (2<<4) /* SIRES direct copy from AES3 receiver */
|
||||
#define CS8427_SOJUST (1<<3) /* Justification of SDOUT data relative to OLRCK, 0 = left-justified, 1 = right-justified */
|
||||
#define CS8427_SODEL (1<<2) /* Delay of SDOUT data relative to OLRCK for left-justified data formats, 0 = first OSCLK period, 1 = second OSCLK period */
|
||||
#define CS8427_SOSPOL (1<<1) /* OSCLK clock polarity, 0 = rising edge of ISCLK, 1 = falling edge of ISCLK */
|
||||
#define CS8427_SOLRPOL (1<<0) /* OLRCK clock polarity, 0 = SDOUT data left channel when OLRCK is high, 1 = SDOUT right when OLRCK is high */
|
||||
|
||||
/* CS8427_REG_INT1STATUS */
|
||||
#define CS8427_TSLIP (1<<7) /* AES3 transmitter source data slip interrupt */
|
||||
#define CS8427_OSLIP (1<<6) /* Serial audio output port data slip interrupt */
|
||||
#define CS8427_DETC (1<<2) /* D to E C-buffer transfer interrupt */
|
||||
#define CS8427_EFTC (1<<1) /* E to F C-buffer transfer interrupt */
|
||||
#define CS8427_RERR (1<<0) /* A receiver error has occurred */
|
||||
|
||||
/* CS8427_REG_INT2STATUS */
|
||||
#define CS8427_DETU (1<<3) /* D to E U-buffer transfer interrupt */
|
||||
#define CS8427_EFTU (1<<2) /* E to F U-buffer transfer interrupt */
|
||||
#define CS8427_QCH (1<<1) /* A new block of Q-subcode data is available for reading */
|
||||
|
||||
/* CS8427_REG_INT1MODEMSB && CS8427_REG_INT1MODELSB */
|
||||
/* bits are defined in CS8427_REG_INT1STATUS */
|
||||
/* CS8427_REG_INT2MODEMSB && CS8427_REG_INT2MODELSB */
|
||||
/* bits are defined in CS8427_REG_INT2STATUS */
|
||||
#define CS8427_INTMODERISINGMSB 0
|
||||
#define CS8427_INTMODERESINGLSB 0
|
||||
#define CS8427_INTMODEFALLINGMSB 0
|
||||
#define CS8427_INTMODEFALLINGLSB 1
|
||||
#define CS8427_INTMODELEVELMSB 1
|
||||
#define CS8427_INTMODELEVELLSB 0
|
||||
|
||||
/* CS8427_REG_RECVCSDATA */
|
||||
#define CS8427_AUXMASK (15<<4) /* auxiliary data field width */
|
||||
#define CS8427_AUXSHIFT 4
|
||||
#define CS8427_PRO (1<<3) /* Channel status block format indicator */
|
||||
#define CS8427_AUDIO (1<<2) /* Audio indicator (0 = audio, 1 = nonaudio */
|
||||
#define CS8427_COPY (1<<1) /* 0 = copyright asserted, 1 = copyright not asserted */
|
||||
#define CS8427_ORIG (1<<0) /* SCMS generation indicator, 0 = 1st generation or highter, 1 = original */
|
||||
|
||||
/* CS8427_REG_RECVERRORS */
|
||||
/* CS8427_REG_RECVERRMASK for CS8427_RERR */
|
||||
#define CS8427_QCRC (1<<6) /* Q-subcode data CRC error indicator */
|
||||
#define CS8427_CCRC (1<<5) /* Chancnel Status Block Cyclick Redundancy Check Bit */
|
||||
#define CS8427_UNLOCK (1<<4) /* PLL lock status bit */
|
||||
#define CS8427_V (1<<3) /* 0 = valid data */
|
||||
#define CS8427_CONF (1<<2) /* Confidence bit */
|
||||
#define CS8427_BIP (1<<1) /* Bi-phase error bit */
|
||||
#define CS8427_PAR (1<<0) /* Parity error */
|
||||
|
||||
/* CS8427_REG_CSDATABUF */
|
||||
#define CS8427_BSEL (1<<5) /* 0 = CS data, 1 = U data */
|
||||
#define CS8427_CBMR (1<<4) /* 0 = overwrite first 5 bytes for CS D to E buffer, 1 = prevent */
|
||||
#define CS8427_DETCI (1<<3) /* D to E CS data buffer transfer inhibit bit, 0 = allow, 1 = inhibit */
|
||||
#define CS8427_EFTCI (1<<2) /* E to F CS data buffer transfer inhibit bit, 0 = allow, 1 = inhibit */
|
||||
#define CS8427_CAM (1<<1) /* CS data buffer control port access mode bit, 0 = one byte, 1 = two byte */
|
||||
#define CS8427_CHS (1<<0) /* Channel select bit, 0 = Channel A, 1 = Channel B */
|
||||
|
||||
/* CS8427_REG_UDATABUF */
|
||||
#define CS8427_UD (1<<4) /* User data pin (U) direction, 0 = input, 1 = output */
|
||||
#define CS8427_UBMMASK (3<<2) /* Operating mode of the AES3 U bit manager */
|
||||
#define CS8427_UBMZEROS (0<<2) /* transmit all zeros mode */
|
||||
#define CS8427_UBMBLOCK (1<<2) /* block mode */
|
||||
#define CS8427_DETUI (1<<1) /* D to E U-data buffer transfer inhibit bit, 0 = allow, 1 = inhibit */
|
||||
#define CS8427_EFTUI (1<<1) /* E to F U-data buffer transfer inhibit bit, 0 = allow, 1 = inhibit */
|
||||
|
||||
/* CS8427_REG_ID_AND_VER */
|
||||
#define CS8427_IDMASK (15<<4)
|
||||
#define CS8427_IDSHIFT 4
|
||||
#define CS8427_VERMASK (15<<0)
|
||||
#define CS8427_VERSHIFT 0
|
||||
#define CS8427_VER8427A 0x71
|
||||
|
||||
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 */
|
||||
51
include/sound/driver.h
Normal file
51
include/sound/driver.h
Normal file
@@ -0,0 +1,51 @@
|
||||
#ifndef __SOUND_DRIVER_H
|
||||
#define __SOUND_DRIVER_H
|
||||
|
||||
/*
|
||||
* Main header file for the ALSA driver
|
||||
* Copyright (c) 1994-2000 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef ALSA_BUILD
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
|
||||
/* 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
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SND_DEBUG
|
||||
#undef CONFIG_SND_DEBUG_MEMORY
|
||||
#endif
|
||||
|
||||
#ifdef ALSA_BUILD
|
||||
#include "adriver.h"
|
||||
#endif
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#endif /* __SOUND_DRIVER_H */
|
||||
1993
include/sound/emu10k1.h
Normal file
1993
include/sound/emu10k1.h
Normal file
File diff suppressed because it is too large
Load Diff
39
include/sound/emu10k1_synth.h
Normal file
39
include/sound/emu10k1_synth.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef __EMU10K1_SYNTH_H
|
||||
#define __EMU10K1_SYNTH_H
|
||||
/*
|
||||
* Defines for the Emu10k1 WaveTable synth
|
||||
*
|
||||
* Copyright (C) 2000 Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "emu10k1.h"
|
||||
#include "emux_synth.h"
|
||||
|
||||
/* sequencer device id */
|
||||
#define SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH "emu10k1-synth"
|
||||
|
||||
/* argument for snd_seq_device_new */
|
||||
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 */
|
||||
};
|
||||
|
||||
#define EMU10K1_MAX_MEMSIZE (32 * 1024 * 1024) /* 32MB */
|
||||
|
||||
#endif
|
||||
121
include/sound/emu8000.h
Normal file
121
include/sound/emu8000.h
Normal file
@@ -0,0 +1,121 @@
|
||||
#ifndef __SOUND_EMU8000_H
|
||||
#define __SOUND_EMU8000_H
|
||||
/*
|
||||
* Defines for the emu8000 (AWE32/64)
|
||||
*
|
||||
* Copyright (C) 1999 Steve Ratcliffe
|
||||
* Copyright (C) 1999-2000 Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "emux_synth.h"
|
||||
#include "seq_kernel.h"
|
||||
|
||||
/*
|
||||
* Hardware parameters.
|
||||
*/
|
||||
#define EMU8000_MAX_DRAM (28 * 1024 * 1024) /* Max on-board mem is 28Mb ???*/
|
||||
#define EMU8000_DRAM_OFFSET 0x200000 /* Beginning of on board ram */
|
||||
#define EMU8000_CHANNELS 32 /* Number of hardware channels */
|
||||
#define EMU8000_DRAM_VOICES 30 /* number of normal voices */
|
||||
|
||||
/* Flags to set a dma channel to read or write */
|
||||
#define EMU8000_RAM_READ 0
|
||||
#define EMU8000_RAM_WRITE 1
|
||||
#define EMU8000_RAM_CLOSE 2
|
||||
#define EMU8000_RAM_MODE_MASK 0x03
|
||||
#define EMU8000_RAM_RIGHT 0x10 /* use 'right' DMA channel */
|
||||
|
||||
enum {
|
||||
EMU8000_CONTROL_BASS = 0,
|
||||
EMU8000_CONTROL_TREBLE,
|
||||
EMU8000_CONTROL_CHORUS_MODE,
|
||||
EMU8000_CONTROL_REVERB_MODE,
|
||||
EMU8000_CONTROL_FM_CHORUS_DEPTH,
|
||||
EMU8000_CONTROL_FM_REVERB_DEPTH,
|
||||
EMU8000_NUM_CONTROLS,
|
||||
};
|
||||
|
||||
/*
|
||||
* Structure to hold all state information for the emu8000 driver.
|
||||
*
|
||||
* Note 1: The chip supports 32 channels in hardware this is max_channels
|
||||
* some of the channels may be used for other things so max_channels is
|
||||
* the number in use for wave voices.
|
||||
*/
|
||||
struct snd_emu8000 {
|
||||
|
||||
struct snd_emux *emu;
|
||||
|
||||
int index; /* sequencer client index */
|
||||
int seq_ports; /* number of sequencer ports */
|
||||
int fm_chorus_depth; /* FM OPL3 chorus depth */
|
||||
int fm_reverb_depth; /* FM OPL3 reverb depth */
|
||||
|
||||
int mem_size; /* memory size */
|
||||
unsigned long port1; /* Port usually base+0 */
|
||||
unsigned long port2; /* Port usually at base+0x400 */
|
||||
unsigned long port3; /* Port usually at base+0x800 */
|
||||
struct resource *res_port1;
|
||||
struct resource *res_port2;
|
||||
struct resource *res_port3;
|
||||
unsigned short last_reg;/* Last register command */
|
||||
spinlock_t reg_lock;
|
||||
|
||||
int dram_checked;
|
||||
|
||||
struct snd_card *card; /* The card that this belongs to */
|
||||
|
||||
int chorus_mode;
|
||||
int reverb_mode;
|
||||
int bass_level;
|
||||
int treble_level;
|
||||
|
||||
struct snd_util_memhdr *memhdr;
|
||||
|
||||
spinlock_t control_lock;
|
||||
struct snd_kcontrol *controls[EMU8000_NUM_CONTROLS];
|
||||
|
||||
struct snd_pcm *pcm; /* pcm on emu8000 wavetable */
|
||||
|
||||
};
|
||||
|
||||
/* sequencer device id */
|
||||
#define SNDRV_SEQ_DEV_ID_EMU8000 "emu8000-synth"
|
||||
|
||||
|
||||
/* exported functions */
|
||||
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(struct snd_emu8000 *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(struct snd_emu8000 *emu, unsigned int port,
|
||||
unsigned int reg);
|
||||
void snd_emu8000_dma_chan(struct snd_emu8000 *emu, int ch, int mode);
|
||||
|
||||
void snd_emu8000_init_fm(struct snd_emu8000 *emu);
|
||||
|
||||
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 */
|
||||
207
include/sound/emu8000_reg.h
Normal file
207
include/sound/emu8000_reg.h
Normal file
@@ -0,0 +1,207 @@
|
||||
#ifndef __SOUND_EMU8000_REG_H
|
||||
#define __SOUND_EMU8000_REG_H
|
||||
/*
|
||||
* Register operations for the EMU8000
|
||||
*
|
||||
* Copyright (C) 1999 Steve Ratcliffe
|
||||
*
|
||||
* Based on awe_wave.c by Takashi Iwai
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Data port addresses relative to the EMU base.
|
||||
*/
|
||||
#define EMU8000_DATA0(e) ((e)->port1)
|
||||
#define EMU8000_DATA1(e) ((e)->port2)
|
||||
#define EMU8000_DATA2(e) ((e)->port2+2)
|
||||
#define EMU8000_DATA3(e) ((e)->port3)
|
||||
#define EMU8000_PTR(e) ((e)->port3+2)
|
||||
|
||||
/*
|
||||
* Make a command from a register and channel.
|
||||
*/
|
||||
#define EMU8000_CMD(reg, chan) ((reg)<<5 | (chan))
|
||||
|
||||
/*
|
||||
* Commands to read and write the EMU8000 registers.
|
||||
* These macros should be used for all register accesses.
|
||||
*/
|
||||
#define EMU8000_CPF_READ(emu, chan) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(0, (chan)))
|
||||
#define EMU8000_PTRX_READ(emu, chan) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(1, (chan)))
|
||||
#define EMU8000_CVCF_READ(emu, chan) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(2, (chan)))
|
||||
#define EMU8000_VTFT_READ(emu, chan) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(3, (chan)))
|
||||
#define EMU8000_PSST_READ(emu, chan) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(6, (chan)))
|
||||
#define EMU8000_CSL_READ(emu, chan) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(7, (chan)))
|
||||
#define EMU8000_CCCA_READ(emu, chan) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(0, (chan)))
|
||||
#define EMU8000_HWCF4_READ(emu) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 9))
|
||||
#define EMU8000_HWCF5_READ(emu) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 10))
|
||||
#define EMU8000_HWCF6_READ(emu) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 13))
|
||||
#define EMU8000_SMALR_READ(emu) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 20))
|
||||
#define EMU8000_SMARR_READ(emu) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 21))
|
||||
#define EMU8000_SMALW_READ(emu) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 22))
|
||||
#define EMU8000_SMARW_READ(emu) \
|
||||
snd_emu8000_peek_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 23))
|
||||
#define EMU8000_SMLD_READ(emu) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 26))
|
||||
#define EMU8000_SMRD_READ(emu) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA2(emu), EMU8000_CMD(1, 26))
|
||||
#define EMU8000_WC_READ(emu) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA2(emu), EMU8000_CMD(1, 27))
|
||||
#define EMU8000_HWCF1_READ(emu) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 29))
|
||||
#define EMU8000_HWCF2_READ(emu) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 30))
|
||||
#define EMU8000_HWCF3_READ(emu) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 31))
|
||||
#define EMU8000_INIT1_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(2, (chan)))
|
||||
#define EMU8000_INIT2_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA2(emu), EMU8000_CMD(2, (chan)))
|
||||
#define EMU8000_INIT3_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(3, (chan)))
|
||||
#define EMU8000_INIT4_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA2(emu), EMU8000_CMD(3, (chan)))
|
||||
#define EMU8000_ENVVOL_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(4, (chan)))
|
||||
#define EMU8000_DCYSUSV_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(5, (chan)))
|
||||
#define EMU8000_ENVVAL_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(6, (chan)))
|
||||
#define EMU8000_DCYSUS_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA1(emu), EMU8000_CMD(7, (chan)))
|
||||
#define EMU8000_ATKHLDV_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA2(emu), EMU8000_CMD(4, (chan)))
|
||||
#define EMU8000_LFO1VAL_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA2(emu), EMU8000_CMD(5, (chan)))
|
||||
#define EMU8000_ATKHLD_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA2(emu), EMU8000_CMD(6, (chan)))
|
||||
#define EMU8000_LFO2VAL_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA2(emu), EMU8000_CMD(7, (chan)))
|
||||
#define EMU8000_IP_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA3(emu), EMU8000_CMD(0, (chan)))
|
||||
#define EMU8000_IFATN_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA3(emu), EMU8000_CMD(1, (chan)))
|
||||
#define EMU8000_PEFE_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA3(emu), EMU8000_CMD(2, (chan)))
|
||||
#define EMU8000_FMMOD_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA3(emu), EMU8000_CMD(3, (chan)))
|
||||
#define EMU8000_TREMFRQ_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA3(emu), EMU8000_CMD(4, (chan)))
|
||||
#define EMU8000_FM2FRQ2_READ(emu, chan) \
|
||||
snd_emu8000_peek((emu), EMU8000_DATA3(emu), EMU8000_CMD(5, (chan)))
|
||||
|
||||
|
||||
#define EMU8000_CPF_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(0, (chan)), (val))
|
||||
#define EMU8000_PTRX_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(1, (chan)), (val))
|
||||
#define EMU8000_CVCF_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(2, (chan)), (val))
|
||||
#define EMU8000_VTFT_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(3, (chan)), (val))
|
||||
#define EMU8000_PSST_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(6, (chan)), (val))
|
||||
#define EMU8000_CSL_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(7, (chan)), (val))
|
||||
#define EMU8000_CCCA_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(0, (chan)), (val))
|
||||
#define EMU8000_HWCF4_WRITE(emu, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 9), (val))
|
||||
#define EMU8000_HWCF5_WRITE(emu, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 10), (val))
|
||||
#define EMU8000_HWCF6_WRITE(emu, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 13), (val))
|
||||
/* this register is not documented */
|
||||
#define EMU8000_HWCF7_WRITE(emu, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 14), (val))
|
||||
#define EMU8000_SMALR_WRITE(emu, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 20), (val))
|
||||
#define EMU8000_SMARR_WRITE(emu, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 21), (val))
|
||||
#define EMU8000_SMALW_WRITE(emu, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 22), (val))
|
||||
#define EMU8000_SMARW_WRITE(emu, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 23), (val))
|
||||
#define EMU8000_SMLD_WRITE(emu, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 26), (val))
|
||||
#define EMU8000_SMRD_WRITE(emu, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA2(emu), EMU8000_CMD(1, 26), (val))
|
||||
#define EMU8000_WC_WRITE(emu, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA2(emu), EMU8000_CMD(1, 27), (val))
|
||||
#define EMU8000_HWCF1_WRITE(emu, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 29), (val))
|
||||
#define EMU8000_HWCF2_WRITE(emu, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 30), (val))
|
||||
#define EMU8000_HWCF3_WRITE(emu, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(1, 31), (val))
|
||||
#define EMU8000_INIT1_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(2, (chan)), (val))
|
||||
#define EMU8000_INIT2_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA2(emu), EMU8000_CMD(2, (chan)), (val))
|
||||
#define EMU8000_INIT3_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(3, (chan)), (val))
|
||||
#define EMU8000_INIT4_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA2(emu), EMU8000_CMD(3, (chan)), (val))
|
||||
#define EMU8000_ENVVOL_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(4, (chan)), (val))
|
||||
#define EMU8000_DCYSUSV_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(5, (chan)), (val))
|
||||
#define EMU8000_ENVVAL_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(6, (chan)), (val))
|
||||
#define EMU8000_DCYSUS_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA1(emu), EMU8000_CMD(7, (chan)), (val))
|
||||
#define EMU8000_ATKHLDV_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA2(emu), EMU8000_CMD(4, (chan)), (val))
|
||||
#define EMU8000_LFO1VAL_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA2(emu), EMU8000_CMD(5, (chan)), (val))
|
||||
#define EMU8000_ATKHLD_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA2(emu), EMU8000_CMD(6, (chan)), (val))
|
||||
#define EMU8000_LFO2VAL_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA2(emu), EMU8000_CMD(7, (chan)), (val))
|
||||
#define EMU8000_IP_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA3(emu), EMU8000_CMD(0, (chan)), (val))
|
||||
#define EMU8000_IFATN_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA3(emu), EMU8000_CMD(1, (chan)), (val))
|
||||
#define EMU8000_PEFE_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA3(emu), EMU8000_CMD(2, (chan)), (val))
|
||||
#define EMU8000_FMMOD_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA3(emu), EMU8000_CMD(3, (chan)), (val))
|
||||
#define EMU8000_TREMFRQ_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA3(emu), EMU8000_CMD(4, (chan)), (val))
|
||||
#define EMU8000_FM2FRQ2_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke((emu), EMU8000_DATA3(emu), EMU8000_CMD(5, (chan)), (val))
|
||||
|
||||
#define EMU8000_0080_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(4, (chan)), (val))
|
||||
#define EMU8000_00A0_WRITE(emu, chan, val) \
|
||||
snd_emu8000_poke_dw((emu), EMU8000_DATA0(emu), EMU8000_CMD(5, (chan)), (val))
|
||||
|
||||
#endif /* __SOUND_EMU8000_REG_H */
|
||||
146
include/sound/emux_legacy.h
Normal file
146
include/sound/emux_legacy.h
Normal file
@@ -0,0 +1,146 @@
|
||||
#ifndef __SOUND_EMUX_LEGACY_H
|
||||
#define __SOUND_EMUX_LEGACY_H
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999-2000 Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* Definitions of OSS compatible headers for Emu8000 device informations
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "seq_oss_legacy.h"
|
||||
|
||||
/*
|
||||
* awe hardware controls
|
||||
*/
|
||||
|
||||
#define _EMUX_OSS_DEBUG_MODE 0x00
|
||||
#define _EMUX_OSS_REVERB_MODE 0x01
|
||||
#define _EMUX_OSS_CHORUS_MODE 0x02
|
||||
#define _EMUX_OSS_REMOVE_LAST_SAMPLES 0x03
|
||||
#define _EMUX_OSS_INITIALIZE_CHIP 0x04
|
||||
#define _EMUX_OSS_SEND_EFFECT 0x05
|
||||
#define _EMUX_OSS_TERMINATE_CHANNEL 0x06
|
||||
#define _EMUX_OSS_TERMINATE_ALL 0x07
|
||||
#define _EMUX_OSS_INITIAL_VOLUME 0x08
|
||||
#define _EMUX_OSS_INITIAL_ATTEN _EMUX_OSS_INITIAL_VOLUME
|
||||
#define _EMUX_OSS_RESET_CHANNEL 0x09
|
||||
#define _EMUX_OSS_CHANNEL_MODE 0x0a
|
||||
#define _EMUX_OSS_DRUM_CHANNELS 0x0b
|
||||
#define _EMUX_OSS_MISC_MODE 0x0c
|
||||
#define _EMUX_OSS_RELEASE_ALL 0x0d
|
||||
#define _EMUX_OSS_NOTEOFF_ALL 0x0e
|
||||
#define _EMUX_OSS_CHN_PRESSURE 0x0f
|
||||
#define _EMUX_OSS_EQUALIZER 0x11
|
||||
|
||||
#define _EMUX_OSS_MODE_FLAG 0x80
|
||||
#define _EMUX_OSS_COOKED_FLAG 0x40 /* not supported */
|
||||
#define _EMUX_OSS_MODE_VALUE_MASK 0x3F
|
||||
|
||||
|
||||
/*
|
||||
* mode type definitions
|
||||
*/
|
||||
enum {
|
||||
/* 0*/ EMUX_MD_EXCLUSIVE_OFF, /* obsolete */
|
||||
/* 1*/ EMUX_MD_EXCLUSIVE_ON, /* obsolete */
|
||||
/* 2*/ EMUX_MD_VERSION, /* read only */
|
||||
/* 3*/ EMUX_MD_EXCLUSIVE_SOUND, /* 0/1: exclusive note on (default=1) */
|
||||
/* 4*/ EMUX_MD_REALTIME_PAN, /* 0/1: do realtime pan change (default=1) */
|
||||
/* 5*/ EMUX_MD_GUS_BANK, /* bank number for GUS patches (default=0) */
|
||||
/* 6*/ EMUX_MD_KEEP_EFFECT, /* 0/1: keep effect values, (default=0) */
|
||||
/* 7*/ EMUX_MD_ZERO_ATTEN, /* attenuation of max volume (default=32) */
|
||||
/* 8*/ EMUX_MD_CHN_PRIOR, /* 0/1: set MIDI channel priority mode (default=1) */
|
||||
/* 9*/ EMUX_MD_MOD_SENSE, /* integer: modwheel sensitivity (def=18) */
|
||||
/*10*/ EMUX_MD_DEF_PRESET, /* integer: default preset number (def=0) */
|
||||
/*11*/ EMUX_MD_DEF_BANK, /* integer: default bank number (def=0) */
|
||||
/*12*/ EMUX_MD_DEF_DRUM, /* integer: default drumset number (def=0) */
|
||||
/*13*/ EMUX_MD_TOGGLE_DRUM_BANK, /* 0/1: toggle drum flag with bank# (def=0) */
|
||||
/*14*/ EMUX_MD_NEW_VOLUME_CALC, /* 0/1: volume calculation mode (def=1) */
|
||||
/*15*/ EMUX_MD_CHORUS_MODE, /* integer: chorus mode (def=2) */
|
||||
/*16*/ EMUX_MD_REVERB_MODE, /* integer: chorus mode (def=4) */
|
||||
/*17*/ EMUX_MD_BASS_LEVEL, /* integer: bass level (def=5) */
|
||||
/*18*/ EMUX_MD_TREBLE_LEVEL, /* integer: treble level (def=9) */
|
||||
/*19*/ EMUX_MD_DEBUG_MODE, /* integer: debug level (def=0) */
|
||||
/*20*/ EMUX_MD_PAN_EXCHANGE, /* 0/1: exchange panning direction (def=0) */
|
||||
EMUX_MD_END,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* effect parameters
|
||||
*/
|
||||
enum {
|
||||
|
||||
/* modulation envelope parameters */
|
||||
/* 0*/ EMUX_FX_ENV1_DELAY, /* WORD: ENVVAL */
|
||||
/* 1*/ EMUX_FX_ENV1_ATTACK, /* BYTE: up ATKHLD */
|
||||
/* 2*/ EMUX_FX_ENV1_HOLD, /* BYTE: lw ATKHLD */
|
||||
/* 3*/ EMUX_FX_ENV1_DECAY, /* BYTE: lw DCYSUS */
|
||||
/* 4*/ EMUX_FX_ENV1_RELEASE, /* BYTE: lw DCYSUS */
|
||||
/* 5*/ EMUX_FX_ENV1_SUSTAIN, /* BYTE: up DCYSUS */
|
||||
/* 6*/ EMUX_FX_ENV1_PITCH, /* BYTE: up PEFE */
|
||||
/* 7*/ EMUX_FX_ENV1_CUTOFF, /* BYTE: lw PEFE */
|
||||
|
||||
/* volume envelope parameters */
|
||||
/* 8*/ EMUX_FX_ENV2_DELAY, /* WORD: ENVVOL */
|
||||
/* 9*/ EMUX_FX_ENV2_ATTACK, /* BYTE: up ATKHLDV */
|
||||
/*10*/ EMUX_FX_ENV2_HOLD, /* BYTE: lw ATKHLDV */
|
||||
/*11*/ EMUX_FX_ENV2_DECAY, /* BYTE: lw DCYSUSV */
|
||||
/*12*/ EMUX_FX_ENV2_RELEASE, /* BYTE: lw DCYSUSV */
|
||||
/*13*/ EMUX_FX_ENV2_SUSTAIN, /* BYTE: up DCYSUSV */
|
||||
|
||||
/* LFO1 (tremolo & vibrato) parameters */
|
||||
/*14*/ EMUX_FX_LFO1_DELAY, /* WORD: LFO1VAL */
|
||||
/*15*/ EMUX_FX_LFO1_FREQ, /* BYTE: lo TREMFRQ */
|
||||
/*16*/ EMUX_FX_LFO1_VOLUME, /* BYTE: up TREMFRQ */
|
||||
/*17*/ EMUX_FX_LFO1_PITCH, /* BYTE: up FMMOD */
|
||||
/*18*/ EMUX_FX_LFO1_CUTOFF, /* BYTE: lo FMMOD */
|
||||
|
||||
/* LFO2 (vibrato) parameters */
|
||||
/*19*/ EMUX_FX_LFO2_DELAY, /* WORD: LFO2VAL */
|
||||
/*20*/ EMUX_FX_LFO2_FREQ, /* BYTE: lo FM2FRQ2 */
|
||||
/*21*/ EMUX_FX_LFO2_PITCH, /* BYTE: up FM2FRQ2 */
|
||||
|
||||
/* Other overall effect parameters */
|
||||
/*22*/ EMUX_FX_INIT_PITCH, /* SHORT: pitch offset */
|
||||
/*23*/ EMUX_FX_CHORUS, /* BYTE: chorus effects send (0-255) */
|
||||
/*24*/ EMUX_FX_REVERB, /* BYTE: reverb effects send (0-255) */
|
||||
/*25*/ EMUX_FX_CUTOFF, /* BYTE: up IFATN */
|
||||
/*26*/ EMUX_FX_FILTERQ, /* BYTE: up CCCA */
|
||||
|
||||
/* Sample / loop offset changes */
|
||||
/*27*/ EMUX_FX_SAMPLE_START, /* SHORT: offset */
|
||||
/*28*/ EMUX_FX_LOOP_START, /* SHORT: offset */
|
||||
/*29*/ EMUX_FX_LOOP_END, /* SHORT: offset */
|
||||
/*30*/ EMUX_FX_COARSE_SAMPLE_START, /* SHORT: upper word offset */
|
||||
/*31*/ EMUX_FX_COARSE_LOOP_START, /* SHORT: upper word offset */
|
||||
/*32*/ EMUX_FX_COARSE_LOOP_END, /* SHORT: upper word offset */
|
||||
/*33*/ EMUX_FX_ATTEN, /* BYTE: lo IFATN */
|
||||
|
||||
EMUX_FX_END,
|
||||
};
|
||||
/* number of effects */
|
||||
#define EMUX_NUM_EFFECTS EMUX_FX_END
|
||||
|
||||
/* effect flag values */
|
||||
#define EMUX_FX_FLAG_OFF 0
|
||||
#define EMUX_FX_FLAG_SET 1
|
||||
#define EMUX_FX_FLAG_ADD 2
|
||||
|
||||
|
||||
#endif /* __SOUND_EMUX_LEGACY_H */
|
||||
244
include/sound/emux_synth.h
Normal file
244
include/sound/emux_synth.h
Normal file
@@ -0,0 +1,244 @@
|
||||
#ifndef __SOUND_EMUX_SYNTH_H
|
||||
#define __SOUND_EMUX_SYNTH_H
|
||||
|
||||
/*
|
||||
* Defines for the Emu-series WaveTable chip
|
||||
*
|
||||
* Copyright (C) 2000 Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "seq_kernel.h"
|
||||
#include "seq_device.h"
|
||||
#include "soundfont.h"
|
||||
#include "seq_midi_emul.h"
|
||||
#ifdef CONFIG_SND_SEQUENCER_OSS
|
||||
#include "seq_oss.h"
|
||||
#endif
|
||||
#include "emux_legacy.h"
|
||||
#include "seq_virmidi.h"
|
||||
|
||||
/*
|
||||
* compile flags
|
||||
*/
|
||||
#define SNDRV_EMUX_USE_RAW_EFFECT
|
||||
|
||||
struct snd_emux;
|
||||
struct snd_emux_port;
|
||||
struct snd_emux_voice;
|
||||
struct snd_emux_effect_table;
|
||||
|
||||
/*
|
||||
* operators
|
||||
*/
|
||||
struct snd_emux_operators {
|
||||
struct module *owner;
|
||||
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)(struct snd_emux *emu, int cmd, int p1, int p2);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* constant values
|
||||
*/
|
||||
#define SNDRV_EMUX_MAX_PORTS 32 /* max # of sequencer ports */
|
||||
#define SNDRV_EMUX_MAX_VOICES 64 /* max # of voices */
|
||||
#define SNDRV_EMUX_MAX_MULTI_VOICES 16 /* max # of playable voices
|
||||
* simultineously
|
||||
*/
|
||||
|
||||
/*
|
||||
* flags
|
||||
*/
|
||||
#define SNDRV_EMUX_ACCEPT_ROM (1<<0)
|
||||
|
||||
/*
|
||||
* emuX wavetable
|
||||
*/
|
||||
struct snd_emux {
|
||||
|
||||
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) */
|
||||
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 */
|
||||
struct snd_hwdep *hwdep; /* hwdep device */
|
||||
|
||||
/* private */
|
||||
int num_voices; /* current number of voices */
|
||||
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 mutex register_mutex;
|
||||
int client; /* For the sequencer client */
|
||||
int ports[SNDRV_EMUX_MAX_PORTS]; /* The ports for this device */
|
||||
struct snd_emux_port *portptrs[SNDRV_EMUX_MAX_PORTS];
|
||||
int used; /* use counter */
|
||||
char *name; /* name of the device (internal) */
|
||||
struct snd_rawmidi **vmidi;
|
||||
struct timer_list tlist; /* for pending note-offs */
|
||||
int timer_active;
|
||||
|
||||
struct snd_util_memhdr *memhdr; /* memory chunk information */
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
struct snd_info_entry *proc;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SND_SEQUENCER_OSS
|
||||
struct snd_seq_device *oss_synth;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* sequencer port information
|
||||
*/
|
||||
struct snd_emux_port {
|
||||
|
||||
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
|
||||
struct snd_emux_effect_table *effect;
|
||||
#endif
|
||||
#ifdef CONFIG_SND_SEQUENCER_OSS
|
||||
struct snd_seq_oss_arg *oss_arg;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* port_mode */
|
||||
#define SNDRV_EMUX_PORT_MODE_MIDI 0 /* normal MIDI port */
|
||||
#define SNDRV_EMUX_PORT_MODE_OSS_SYNTH 1 /* OSS synth port */
|
||||
#define SNDRV_EMUX_PORT_MODE_OSS_MIDI 2 /* OSS multi channel synth port */
|
||||
|
||||
/*
|
||||
* A structure to keep track of each hardware voice
|
||||
*/
|
||||
struct snd_emux_voice {
|
||||
int ch; /* Hardware channel number */
|
||||
|
||||
int state; /* status */
|
||||
#define SNDRV_EMUX_ST_OFF 0x00 /* Not playing, and inactive */
|
||||
#define SNDRV_EMUX_ST_ON 0x01 /* Note on */
|
||||
#define SNDRV_EMUX_ST_RELEASED (0x02|SNDRV_EMUX_ST_ON) /* Note released */
|
||||
#define SNDRV_EMUX_ST_SUSTAINED (0x04|SNDRV_EMUX_ST_ON) /* Note sustained */
|
||||
#define SNDRV_EMUX_ST_STANDBY (0x08|SNDRV_EMUX_ST_ON) /* Waiting to be triggered */
|
||||
#define SNDRV_EMUX_ST_PENDING (0x10|SNDRV_EMUX_ST_ON) /* Note will be released */
|
||||
#define SNDRV_EMUX_ST_LOCKED 0x100 /* Not accessible */
|
||||
|
||||
unsigned int time; /* An allocation time */
|
||||
unsigned char note; /* Note currently assigned to this voice */
|
||||
unsigned char key;
|
||||
unsigned char velocity; /* Velocity of current note */
|
||||
|
||||
struct snd_sf_zone *zone; /* Zone assigned to this note */
|
||||
void *block; /* sample block pointer (optional) */
|
||||
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 */
|
||||
struct soundfont_voice_info reg;
|
||||
|
||||
/* additional registers */
|
||||
int avol; /* volume attenuation */
|
||||
int acutoff; /* cutoff target */
|
||||
int apitch; /* pitch offset */
|
||||
int apan; /* pan/aux pair */
|
||||
int aaux;
|
||||
int ptarget; /* pitch target */
|
||||
int vtarget; /* volume target */
|
||||
int ftarget; /* filter target */
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* update flags (can be combined)
|
||||
*/
|
||||
#define SNDRV_EMUX_UPDATE_VOLUME (1<<0)
|
||||
#define SNDRV_EMUX_UPDATE_PITCH (1<<1)
|
||||
#define SNDRV_EMUX_UPDATE_PAN (1<<2)
|
||||
#define SNDRV_EMUX_UPDATE_FMMOD (1<<3)
|
||||
#define SNDRV_EMUX_UPDATE_TREMFREQ (1<<4)
|
||||
#define SNDRV_EMUX_UPDATE_FM2FRQ2 (1<<5)
|
||||
#define SNDRV_EMUX_UPDATE_Q (1<<6)
|
||||
|
||||
|
||||
#ifdef SNDRV_EMUX_USE_RAW_EFFECT
|
||||
/*
|
||||
* effect table
|
||||
*/
|
||||
struct snd_emux_effect_table {
|
||||
/* Emu8000 specific effects */
|
||||
short val[EMUX_NUM_EFFECTS];
|
||||
unsigned char flag[EMUX_NUM_EFFECTS];
|
||||
};
|
||||
#endif /* SNDRV_EMUX_USE_RAW_EFFECT */
|
||||
|
||||
|
||||
/*
|
||||
* prototypes - interface to Emu10k1 and Emu8k routines
|
||||
*/
|
||||
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(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 */
|
||||
121
include/sound/es1688.h
Normal file
121
include/sound/es1688.h
Normal file
@@ -0,0 +1,121 @@
|
||||
#ifndef __SOUND_ES1688_H
|
||||
#define __SOUND_ES1688_H
|
||||
|
||||
/*
|
||||
* Header file for ES488/ES1688
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "control.h"
|
||||
#include "pcm.h"
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#define ES1688_HW_AUTO 0x0000
|
||||
#define ES1688_HW_688 0x0001
|
||||
#define ES1688_HW_1688 0x0002
|
||||
|
||||
struct snd_es1688 {
|
||||
unsigned long port; /* port of ESS chip */
|
||||
struct resource *res_port;
|
||||
unsigned long mpu_port; /* MPU-401 port of ESS chip */
|
||||
int irq; /* IRQ number of ESS chip */
|
||||
int mpu_irq; /* MPU IRQ */
|
||||
int dma8; /* 8-bit DMA */
|
||||
unsigned short version; /* version of ESS chip */
|
||||
unsigned short hardware; /* see to ES1688_HW_XXXX */
|
||||
|
||||
unsigned short trigger_value;
|
||||
unsigned char pad;
|
||||
unsigned int dma_size;
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
/* I/O ports */
|
||||
|
||||
#define ES1688P(codec, x) ((codec)->port + e_s_s_ESS1688##x)
|
||||
|
||||
#define e_s_s_ESS1688RESET 0x6
|
||||
#define e_s_s_ESS1688READ 0xa
|
||||
#define e_s_s_ESS1688WRITE 0xc
|
||||
#define e_s_s_ESS1688COMMAND 0xc
|
||||
#define e_s_s_ESS1688STATUS 0xc
|
||||
#define e_s_s_ESS1688DATA_AVAIL 0xe
|
||||
#define e_s_s_ESS1688DATA_AVAIL_16 0xf
|
||||
#define e_s_s_ESS1688MIXER_ADDR 0x4
|
||||
#define e_s_s_ESS1688MIXER_DATA 0x5
|
||||
#define e_s_s_ESS1688OPL3_LEFT 0x0
|
||||
#define e_s_s_ESS1688OPL3_RIGHT 0x2
|
||||
#define e_s_s_ESS1688OPL3_BOTH 0x8
|
||||
#define e_s_s_ESS1688ENABLE0 0x0
|
||||
#define e_s_s_ESS1688ENABLE1 0x9
|
||||
#define e_s_s_ESS1688ENABLE2 0xb
|
||||
#define e_s_s_ESS1688INIT1 0x7
|
||||
|
||||
#define ES1688_DSP_CMD_DMAOFF 0xd0
|
||||
#define ES1688_DSP_CMD_SPKON 0xd1
|
||||
#define ES1688_DSP_CMD_SPKOFF 0xd3
|
||||
#define ES1688_DSP_CMD_DMAON 0xd4
|
||||
|
||||
#define ES1688_PCM_DEV 0x14
|
||||
#define ES1688_MIC_DEV 0x1a
|
||||
#define ES1688_REC_DEV 0x1c
|
||||
#define ES1688_MASTER_DEV 0x32
|
||||
#define ES1688_FM_DEV 0x36
|
||||
#define ES1688_CD_DEV 0x38
|
||||
#define ES1688_AUX_DEV 0x3a
|
||||
#define ES1688_SPEAKER_DEV 0x3c
|
||||
#define ES1688_LINE_DEV 0x3e
|
||||
#define ES1688_RECLEV_DEV 0xb4
|
||||
|
||||
#define ES1688_MIXS_MASK 0x17
|
||||
#define ES1688_MIXS_MIC 0x00
|
||||
#define ES1688_MIXS_MIC_MASTER 0x01
|
||||
#define ES1688_MIXS_CD 0x02
|
||||
#define ES1688_MIXS_AOUT 0x03
|
||||
#define ES1688_MIXS_MIC1 0x04
|
||||
#define ES1688_MIXS_REC_MIX 0x05
|
||||
#define ES1688_MIXS_LINE 0x06
|
||||
#define ES1688_MIXS_MASTER 0x07
|
||||
#define ES1688_MIXS_MUTE 0x10
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
void snd_es1688_mixer_write(struct snd_es1688 *chip, unsigned char reg, unsigned char data);
|
||||
|
||||
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,
|
||||
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 */
|
||||
694
include/sound/gus.h
Normal file
694
include/sound/gus.h
Normal file
@@ -0,0 +1,694 @@
|
||||
#ifndef __SOUND_GUS_H
|
||||
#define __SOUND_GUS_H
|
||||
|
||||
/*
|
||||
* Global structures used for GUS part of ALSA driver
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "pcm.h"
|
||||
#include "rawmidi.h"
|
||||
#include "timer.h"
|
||||
#include "seq_midi_emul.h"
|
||||
#include "seq_device.h"
|
||||
#include "ainstr_iw.h"
|
||||
#include "ainstr_gf1.h"
|
||||
#include "ainstr_simple.h"
|
||||
#include <asm/io.h>
|
||||
|
||||
#define SNDRV_SEQ_DEV_ID_GUS "gus-synth"
|
||||
|
||||
/* IO ports */
|
||||
|
||||
#define GUSP(gus, x) ((gus)->gf1.port + SNDRV_g_u_s_##x)
|
||||
|
||||
#define SNDRV_g_u_s_MIDICTRL (0x320-0x220)
|
||||
#define SNDRV_g_u_s_MIDISTAT (0x320-0x220)
|
||||
#define SNDRV_g_u_s_MIDIDATA (0x321-0x220)
|
||||
|
||||
#define SNDRV_g_u_s_GF1PAGE (0x322-0x220)
|
||||
#define SNDRV_g_u_s_GF1REGSEL (0x323-0x220)
|
||||
#define SNDRV_g_u_s_GF1DATALOW (0x324-0x220)
|
||||
#define SNDRV_g_u_s_GF1DATAHIGH (0x325-0x220)
|
||||
#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_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_MIXDATAPORT (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_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_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_REC_DMA_CONTROL 0x49
|
||||
#define SNDRV_GF1_GB_JOYSTICK_DAC_LEVEL 0x4b
|
||||
#define SNDRV_GF1_GB_RESET 0x4c
|
||||
#define SNDRV_GF1_GB_DRAM_DMA_HIGH 0x50
|
||||
#define SNDRV_GF1_GW_DRAM_IO16 0x51
|
||||
#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_SIZE 0x56
|
||||
#define SNDRV_GF1_GW_INTERLEAVE 0x57
|
||||
#define SNDRV_GF1_GB_COMPATIBILITY 0x59
|
||||
#define SNDRV_GF1_GB_DECODE_CONTROL 0x5a
|
||||
#define SNDRV_GF1_GB_VERSION_NUMBER 0x5b
|
||||
#define SNDRV_GF1_GB_MPU401_CONTROL_A 0x5c
|
||||
#define SNDRV_GF1_GB_MPU401_CONTROL_B 0x5d
|
||||
#define SNDRV_GF1_GB_EMULATION_IRQ 0x60
|
||||
/* voice specific registers */
|
||||
#define SNDRV_GF1_VB_ADDRESS_CONTROL 0x00
|
||||
#define SNDRV_GF1_VW_FREQUENCY 0x01
|
||||
#define SNDRV_GF1_VW_START_HIGH 0x02
|
||||
#define SNDRV_GF1_VW_START_LOW 0x03
|
||||
#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_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_VA_CURRENT SNDRV_GF1_VW_CURRENT_HIGH
|
||||
#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_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_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
|
||||
|
||||
/* ICS registers */
|
||||
|
||||
#define SNDRV_ICS_MIC_DEV 0
|
||||
#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
|
||||
|
||||
/* LFO */
|
||||
|
||||
#define SNDRV_LFO_TREMOLO 0
|
||||
#define SNDRV_LFO_VIBRATO 1
|
||||
|
||||
/* misc */
|
||||
|
||||
#define SNDRV_GF1_DMA_UNSIGNED 0x80
|
||||
#define SNDRV_GF1_DMA_16BIT 0x40
|
||||
#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
|
||||
|
||||
/* ramp ranges */
|
||||
|
||||
#define SNDRV_GF1_ATTEN(x) (snd_gf1_atten_table[x])
|
||||
#define SNDRV_GF1_MIN_VOLUME 1800
|
||||
#define SNDRV_GF1_MAX_VOLUME 4095
|
||||
#define SNDRV_GF1_MIN_OFFSET (SNDRV_GF1_MIN_VOLUME>>4)
|
||||
#define SNDRV_GF1_MAX_OFFSET 255
|
||||
#define SNDRV_GF1_MAX_TDEPTH 90
|
||||
|
||||
/* defines for memory manager */
|
||||
|
||||
#define SNDRV_GF1_MEM_BLOCK_16BIT 0x0001
|
||||
|
||||
#define SNDRV_GF1_MEM_OWNER_DRIVER 0x0001
|
||||
#define SNDRV_GF1_MEM_OWNER_WAVE_SIMPLE 0x0002
|
||||
#define SNDRV_GF1_MEM_OWNER_WAVE_GF1 0x0003
|
||||
#define SNDRV_GF1_MEM_OWNER_WAVE_IWFFFF 0x0004
|
||||
|
||||
/* 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_VOICE 0x00100000
|
||||
#define SNDRV_GF1_HANDLER_DMA_WRITE 0x00200000
|
||||
#define SNDRV_GF1_HANDLER_DMA_READ 0x00400000
|
||||
#define SNDRV_GF1_HANDLER_ALL (0xffff0000&~SNDRV_GF1_HANDLER_VOICE)
|
||||
|
||||
/* constants for DMA flags */
|
||||
|
||||
#define SNDRV_GF1_DMA_TRIGGER 1
|
||||
|
||||
/* --- */
|
||||
|
||||
struct snd_gus_card;
|
||||
|
||||
/* GF1 specific structure */
|
||||
|
||||
struct snd_gf1_bank_info {
|
||||
unsigned int address;
|
||||
unsigned int size;
|
||||
};
|
||||
|
||||
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 */
|
||||
unsigned int share_id[4]; /* share ID */
|
||||
unsigned int ptr;
|
||||
unsigned int size;
|
||||
char *name;
|
||||
struct snd_gf1_mem_block *next;
|
||||
struct snd_gf1_mem_block *prev;
|
||||
};
|
||||
|
||||
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 mutex memory_mutex;
|
||||
};
|
||||
|
||||
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)(struct snd_gus_card * gus, void *private_data);
|
||||
void *private_data;
|
||||
struct snd_gf1_dma_block *next;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
struct snd_gus_voice;
|
||||
|
||||
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_SYNTH 1
|
||||
#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)
|
||||
|
||||
enum snd_gus_volume_state {
|
||||
VENV_BEFORE,
|
||||
VENV_ATTACK,
|
||||
VENV_SUSTAIN,
|
||||
VENV_RELEASE,
|
||||
VENV_DONE,
|
||||
VENV_VOLUME
|
||||
};
|
||||
|
||||
struct snd_gus_voice {
|
||||
int number;
|
||||
unsigned int use: 1,
|
||||
pcm: 1,
|
||||
synth:1,
|
||||
midi: 1;
|
||||
unsigned int flags;
|
||||
unsigned char client;
|
||||
unsigned char port;
|
||||
unsigned char index;
|
||||
unsigned char pad;
|
||||
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
unsigned int interrupt_stat_wave;
|
||||
unsigned int interrupt_stat_volume;
|
||||
#endif
|
||||
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);
|
||||
|
||||
struct snd_gus_sample_ops *sample_ops;
|
||||
|
||||
struct snd_seq_instr instr;
|
||||
|
||||
/* running status / registers */
|
||||
|
||||
struct snd_seq_ev_volume sample_volume;
|
||||
|
||||
unsigned short fc_register;
|
||||
unsigned short fc_lfo;
|
||||
unsigned short gf1_volume;
|
||||
unsigned char control;
|
||||
unsigned char mode;
|
||||
unsigned char gf1_pan;
|
||||
unsigned char effect_accumulator;
|
||||
unsigned char volume_control;
|
||||
unsigned char venv_value_next;
|
||||
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;
|
||||
|
||||
/* --- */
|
||||
|
||||
void *private_data;
|
||||
void (*private_free)(struct snd_gus_voice *voice);
|
||||
};
|
||||
|
||||
struct snd_gf1 {
|
||||
|
||||
unsigned int enh_mode:1, /* enhanced mode (GFA1) */
|
||||
hw_lfo:1, /* use hardware LFO */
|
||||
sw_lfo:1, /* use software LFO */
|
||||
effect:1; /* use effect voices */
|
||||
|
||||
unsigned long port; /* port of GF1 chip */
|
||||
struct resource *res_port1;
|
||||
struct resource *res_port2;
|
||||
int irq; /* IRQ number */
|
||||
int dma1; /* DMA1 number */
|
||||
int dma2; /* DMA2 number */
|
||||
unsigned int memory; /* GUS's DRAM size in bytes */
|
||||
unsigned int rom_memory; /* GUS's ROM size in bytes */
|
||||
unsigned int rom_present; /* bitmask */
|
||||
unsigned int rom_banks; /* GUS's ROM banks */
|
||||
|
||||
struct snd_gf1_mem mem_alloc;
|
||||
|
||||
/* registers */
|
||||
unsigned short reg_page;
|
||||
unsigned short reg_regsel;
|
||||
unsigned short reg_data8;
|
||||
unsigned short reg_data16;
|
||||
unsigned short reg_irqstat;
|
||||
unsigned short reg_dram;
|
||||
unsigned short reg_timerctrl;
|
||||
unsigned short reg_timerdata;
|
||||
unsigned char ics_regs[6][2];
|
||||
/* --------- */
|
||||
|
||||
unsigned char active_voices; /* active voices */
|
||||
unsigned char active_voice; /* selected voice (GF1PAGE register) */
|
||||
|
||||
struct snd_gus_voice voices[32]; /* GF1 voices */
|
||||
|
||||
unsigned int default_voice_address;
|
||||
|
||||
unsigned short playback_freq; /* GF1 playback (mixing) frequency */
|
||||
unsigned short mode; /* see to SNDRV_GF1_MODE_XXXX */
|
||||
unsigned char volume_ramp;
|
||||
unsigned char smooth_pan;
|
||||
unsigned char full_range_pan;
|
||||
unsigned char pad0;
|
||||
|
||||
unsigned char *lfos;
|
||||
|
||||
/* interrupt handlers */
|
||||
|
||||
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;
|
||||
unsigned int interrupt_stat_midi_in;
|
||||
unsigned int interrupt_stat_timer1;
|
||||
unsigned int interrupt_stat_timer2;
|
||||
unsigned int interrupt_stat_dma_write;
|
||||
unsigned int interrupt_stat_dma_read;
|
||||
unsigned int interrupt_stat_voice_lost;
|
||||
#endif
|
||||
|
||||
/* synthesizer */
|
||||
|
||||
int seq_client;
|
||||
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;
|
||||
struct snd_timer *timer1;
|
||||
struct snd_timer *timer2;
|
||||
|
||||
/* midi */
|
||||
|
||||
unsigned short uart_cmd;
|
||||
unsigned int uart_framing;
|
||||
unsigned int uart_overrun;
|
||||
|
||||
/* dma operations */
|
||||
|
||||
unsigned int dma_flags;
|
||||
unsigned int dma_shared;
|
||||
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 */
|
||||
int pcm_channels;
|
||||
int pcm_alloc_voices;
|
||||
unsigned short pcm_volume_level_left;
|
||||
unsigned short pcm_volume_level_right;
|
||||
unsigned short pcm_volume_level_left1;
|
||||
unsigned short pcm_volume_level_right1;
|
||||
|
||||
unsigned char pcm_rcntrl_reg;
|
||||
unsigned char pad_end;
|
||||
};
|
||||
|
||||
/* main structure for GUS card */
|
||||
|
||||
struct snd_gus_card {
|
||||
struct snd_card *card;
|
||||
|
||||
unsigned int
|
||||
initialized: 1, /* resources were initialized */
|
||||
equal_irq:1, /* GF1 and CODEC shares IRQ (GUS MAX only) */
|
||||
equal_dma:1, /* if dma channels are equal (not valid for daughter board) */
|
||||
ics_flag:1, /* have we ICS mixer chip */
|
||||
ics_flipped:1, /* ICS mixer have flipped some channels? */
|
||||
codec_flag:1, /* have we CODEC chip? */
|
||||
max_flag:1, /* have we GUS MAX card? */
|
||||
max_ctrl_flag:1, /* have we original GUS MAX card? */
|
||||
daughter_flag:1, /* have we daughter board? */
|
||||
interwave:1, /* hey - we have InterWave card */
|
||||
ess_flag:1, /* ESS chip found... GUS Extreme */
|
||||
ace_flag:1, /* GUS ACE detected */
|
||||
uart_enable:1; /* enable MIDI UART */
|
||||
unsigned short revision; /* revision of chip */
|
||||
unsigned short max_cntrl_val; /* GUS MAX control value */
|
||||
unsigned short mix_cntrl_reg; /* mixer control register */
|
||||
unsigned short joystick_dac; /* joystick DAC level */
|
||||
int timer_dev; /* timer device */
|
||||
|
||||
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;
|
||||
|
||||
struct snd_rawmidi *midi_uart;
|
||||
struct snd_rawmidi_substream *midi_substream_output;
|
||||
struct snd_rawmidi_substream *midi_substream_input;
|
||||
|
||||
struct snd_seq_device *seq_dev;
|
||||
|
||||
spinlock_t reg_lock;
|
||||
spinlock_t voice_alloc;
|
||||
spinlock_t active_voice_lock;
|
||||
spinlock_t event_lock;
|
||||
spinlock_t dma_lock;
|
||||
spinlock_t pcm_volume_level_lock;
|
||||
spinlock_t uart_cmd_lock;
|
||||
struct mutex dma_mutex;
|
||||
struct mutex register_mutex;
|
||||
};
|
||||
|
||||
/* I/O functions for GF1/InterWave chip - gus_io.c */
|
||||
|
||||
static inline void snd_gf1_select_voice(struct snd_gus_card * gus, int voice)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&gus->active_voice_lock, flags);
|
||||
if (voice != gus->gf1.active_voice) {
|
||||
gus->gf1.active_voice = voice;
|
||||
outb(voice, GUSP(gus, GF1PAGE));
|
||||
}
|
||||
spin_unlock_irqrestore(&gus->active_voice_lock, flags);
|
||||
}
|
||||
|
||||
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(struct snd_gus_card * gus)
|
||||
{
|
||||
return inb(GUSP(gus, MIDISTAT));
|
||||
}
|
||||
|
||||
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(struct snd_gus_card * gus)
|
||||
{
|
||||
return inb(GUSP(gus, MIDIDATA));
|
||||
}
|
||||
|
||||
extern void snd_gf1_delay(struct snd_gus_card * gus);
|
||||
|
||||
extern void snd_gf1_ctrl_stop(struct snd_gus_card * 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(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(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(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(struct snd_gus_card * gus);
|
||||
|
||||
/* gus_lfo.c */
|
||||
|
||||
struct _SND_IW_LFO_PROGRAM {
|
||||
unsigned short freq_and_control;
|
||||
unsigned char depth_final;
|
||||
unsigned char depth_inc;
|
||||
unsigned short twave;
|
||||
unsigned short depth;
|
||||
};
|
||||
|
||||
#if 0
|
||||
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(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(struct snd_gus_card * gus, int voice, unsigned char *command);
|
||||
#endif
|
||||
|
||||
/* gus_mem.c */
|
||||
|
||||
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(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(struct snd_gus_card * gus);
|
||||
|
||||
/* gus_dma.c */
|
||||
|
||||
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(struct snd_gus_card * gus, unsigned int freq2);
|
||||
|
||||
/* gus_reset.c */
|
||||
|
||||
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(struct snd_gus_card * gus);
|
||||
|
||||
/* gus_pcm.c */
|
||||
|
||||
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(struct snd_gus_card * gus);
|
||||
#endif
|
||||
|
||||
/* gus.c */
|
||||
|
||||
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,
|
||||
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);
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
void snd_gus_irq_profile_init(struct snd_gus_card *gus);
|
||||
#endif
|
||||
|
||||
/* gus_uart.c */
|
||||
|
||||
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,
|
||||
struct _SND_INSTRUMENT_VOICE_COMMANDS *voice_cmds,
|
||||
struct _SND_INSTRUMENT_NOTE_COMMANDS *note_cmds,
|
||||
struct _SND_INSTRUMENT_CHANNEL_COMMANDS *channel_cmds);
|
||||
extern int snd_engine_instrument_register_ask(unsigned short mode);
|
||||
#endif
|
||||
|
||||
/* gus_dram.c */
|
||||
int snd_gus_dram_write(struct snd_gus_card *gus, char __user *ptr,
|
||||
unsigned int addr, unsigned int size);
|
||||
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(struct snd_seq_event *ev, struct snd_gus_port *p);
|
||||
|
||||
/* gus_simple.c */
|
||||
void snd_gf1_simple_init(struct snd_gus_voice *voice);
|
||||
|
||||
/* gus_instr.c */
|
||||
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, struct iwffff_wave *wave,
|
||||
char __user *data, long len, int atomic);
|
||||
int snd_gus_iwffff_remove_sample(void *private_data, struct iwffff_wave *wave,
|
||||
int atomic);
|
||||
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, struct gf1_wave *wave,
|
||||
char __user *data, long len, int atomic);
|
||||
int snd_gus_gf1_remove_sample(void *private_data, struct gf1_wave *wave,
|
||||
int atomic);
|
||||
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, struct simple_instrument *instr,
|
||||
char __user *data, long len, int atomic);
|
||||
int snd_gus_simple_remove_sample(void *private_data, struct simple_instrument *instr,
|
||||
int atomic);
|
||||
|
||||
#endif /* CONFIG_SND_SEQUENCER */
|
||||
|
||||
#endif /* __SOUND_GUS_H */
|
||||
107
include/sound/hdsp.h
Normal file
107
include/sound/hdsp.h
Normal file
@@ -0,0 +1,107 @@
|
||||
#ifndef __SOUND_HDSP_H
|
||||
#define __SOUND_HDSP_H
|
||||
|
||||
/*
|
||||
* Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#define HDSP_MATRIX_MIXER_SIZE 2048
|
||||
|
||||
enum HDSP_IO_Type {
|
||||
Digiface,
|
||||
Multiface,
|
||||
H9652,
|
||||
H9632,
|
||||
Undefined,
|
||||
};
|
||||
|
||||
struct hdsp_peak_rms {
|
||||
__u32 input_peaks[26];
|
||||
__u32 playback_peaks[26];
|
||||
__u32 output_peaks[28];
|
||||
__u64 input_rms[26];
|
||||
__u64 playback_rms[26];
|
||||
/* These are only used for H96xx cards */
|
||||
__u64 output_rms[26];
|
||||
};
|
||||
|
||||
#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdsp_peak_rms)
|
||||
|
||||
struct hdsp_config_info {
|
||||
unsigned char pref_sync_ref;
|
||||
unsigned char wordclock_sync_check;
|
||||
unsigned char spdif_sync_check;
|
||||
unsigned char adatsync_sync_check;
|
||||
unsigned char adat_sync_check[3];
|
||||
unsigned char spdif_in;
|
||||
unsigned char spdif_out;
|
||||
unsigned char spdif_professional;
|
||||
unsigned char spdif_emphasis;
|
||||
unsigned char spdif_nonaudio;
|
||||
unsigned int spdif_sample_rate;
|
||||
unsigned int system_sample_rate;
|
||||
unsigned int autosync_sample_rate;
|
||||
unsigned char system_clock_mode;
|
||||
unsigned char clock_source;
|
||||
unsigned char autosync_ref;
|
||||
unsigned char line_out;
|
||||
unsigned char passthru;
|
||||
unsigned char da_gain;
|
||||
unsigned char ad_gain;
|
||||
unsigned char phone_gain;
|
||||
unsigned char xlr_breakout_cable;
|
||||
unsigned char analog_extension_board;
|
||||
};
|
||||
|
||||
#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdsp_config_info)
|
||||
|
||||
struct hdsp_firmware {
|
||||
void __user *firmware_data; /* 24413 x 4 bytes */
|
||||
};
|
||||
|
||||
#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, struct hdsp_firmware)
|
||||
|
||||
struct hdsp_version {
|
||||
enum HDSP_IO_Type io_type;
|
||||
unsigned short firmware_rev;
|
||||
};
|
||||
|
||||
#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdsp_version)
|
||||
|
||||
struct hdsp_mixer {
|
||||
unsigned short matrix[HDSP_MATRIX_MIXER_SIZE];
|
||||
};
|
||||
|
||||
#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdsp_mixer)
|
||||
|
||||
struct hdsp_9632_aeb {
|
||||
int aebi;
|
||||
int aebo;
|
||||
};
|
||||
|
||||
#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 */
|
||||
128
include/sound/hdspm.h
Normal file
128
include/sound/hdspm.h
Normal file
@@ -0,0 +1,128 @@
|
||||
#ifndef __SOUND_HDSPM_H /* -*- linux-c -*- */
|
||||
#define __SOUND_HDSPM_H
|
||||
/*
|
||||
* Copyright (C) 2003 Winfried Ritsch (IEM)
|
||||
* based on hdsp.h from Thomas Charbonnel (thomas@undata.org)
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */
|
||||
#define HDSPM_MAX_CHANNELS 64
|
||||
|
||||
/* -------------------- IOCTL Peak/RMS Meters -------------------- */
|
||||
|
||||
/* peam rms level structure like we get from hardware
|
||||
|
||||
maybe in future we can memory map it so I just copy it
|
||||
to user on ioctl call now an dont change anything
|
||||
rms are made out of low and high values
|
||||
where (long) ????_rms = (????_rms_l >> 8) + ((????_rms_h & 0xFFFFFF00)<<24)
|
||||
(i asume so from the code)
|
||||
*/
|
||||
|
||||
struct hdspm_peak_rms {
|
||||
|
||||
unsigned int level_offset[1024];
|
||||
|
||||
unsigned int input_peak[64];
|
||||
unsigned int playback_peak[64];
|
||||
unsigned int output_peak[64];
|
||||
unsigned int xxx_peak[64]; /* not used */
|
||||
|
||||
unsigned int reserved[256]; /* not used */
|
||||
|
||||
unsigned int input_rms_l[64];
|
||||
unsigned int playback_rms_l[64];
|
||||
unsigned int output_rms_l[64];
|
||||
unsigned int xxx_rms_l[64]; /* not used */
|
||||
|
||||
unsigned int input_rms_h[64];
|
||||
unsigned int playback_rms_h[64];
|
||||
unsigned int output_rms_h[64];
|
||||
unsigned int xxx_rms_h[64]; /* not used */
|
||||
};
|
||||
|
||||
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 hdspm_peak_rms_ioctl)
|
||||
|
||||
/* ------------ CONFIG block IOCTL ---------------------- */
|
||||
|
||||
struct hdspm_config_info {
|
||||
unsigned char pref_sync_ref;
|
||||
unsigned char wordclock_sync_check;
|
||||
unsigned char madi_sync_check;
|
||||
unsigned int system_sample_rate;
|
||||
unsigned int autosync_sample_rate;
|
||||
unsigned char system_clock_mode;
|
||||
unsigned char clock_source;
|
||||
unsigned char autosync_ref;
|
||||
unsigned char line_out;
|
||||
unsigned int passthru;
|
||||
unsigned int analog_out;
|
||||
};
|
||||
|
||||
#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdspm_config_info)
|
||||
|
||||
|
||||
/* get Soundcard Version */
|
||||
|
||||
struct hdspm_version {
|
||||
unsigned short firmware_rev;
|
||||
};
|
||||
|
||||
#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdspm_version)
|
||||
|
||||
|
||||
/* ------------- get Matrix Mixer IOCTL --------------- */
|
||||
|
||||
/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte = 32768 Bytes */
|
||||
|
||||
/* organisation is 64 channelfader in a continous memory block */
|
||||
/* equivalent to hardware definition, maybe for future feature of mmap of them */
|
||||
/* each of 64 outputs has 64 infader and 64 outfader:
|
||||
Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
|
||||
|
||||
#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
|
||||
|
||||
struct hdspm_channelfader {
|
||||
unsigned int in[HDSPM_MIXER_CHANNELS];
|
||||
unsigned int pb[HDSPM_MIXER_CHANNELS];
|
||||
};
|
||||
|
||||
struct hdspm_mixer {
|
||||
struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS];
|
||||
};
|
||||
|
||||
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 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 */
|
||||
72
include/sound/hwdep.h
Normal file
72
include/sound/hwdep.h
Normal file
@@ -0,0 +1,72 @@
|
||||
#ifndef __SOUND_HWDEP_H
|
||||
#define __SOUND_HWDEP_H
|
||||
|
||||
/*
|
||||
* Hardware dependent layer
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sound/asound.h>
|
||||
#include <linux/poll.h>
|
||||
|
||||
struct snd_hwdep;
|
||||
|
||||
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 {
|
||||
struct snd_card *card;
|
||||
struct list_head list;
|
||||
int device;
|
||||
char id[32];
|
||||
char name[80];
|
||||
int iface;
|
||||
|
||||
#ifdef CONFIG_SND_OSSEMUL
|
||||
char oss_dev[32];
|
||||
int oss_type;
|
||||
int ossreg;
|
||||
#endif
|
||||
|
||||
struct snd_hwdep_ops ops;
|
||||
wait_queue_head_t open_wait;
|
||||
void *private_data;
|
||||
void (*private_free) (struct snd_hwdep *hwdep);
|
||||
|
||||
struct mutex open_mutex;
|
||||
int used;
|
||||
unsigned int dsp_loaded;
|
||||
unsigned int exclusive: 1;
|
||||
};
|
||||
|
||||
extern int snd_hwdep_new(struct snd_card *card, char *id, int device,
|
||||
struct snd_hwdep **rhwdep);
|
||||
|
||||
#endif /* __SOUND_HWDEP_H */
|
||||
104
include/sound/i2c.h
Normal file
104
include/sound/i2c.h
Normal file
@@ -0,0 +1,104 @@
|
||||
#ifndef __SOUND_I2C_H
|
||||
#define __SOUND_I2C_H
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#define SND_I2C_DEVICE_ADDRTEN (1<<0) /* 10-bit I2C address */
|
||||
|
||||
struct snd_i2c_device {
|
||||
struct list_head list;
|
||||
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)(struct snd_i2c_device *device);
|
||||
};
|
||||
|
||||
#define snd_i2c_device(n) list_entry(n, struct snd_i2c_device, list)
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
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 {
|
||||
struct snd_card *card; /* card which I2C belongs to */
|
||||
char name[32]; /* some useful label */
|
||||
|
||||
struct mutex lock_mutex;
|
||||
|
||||
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 {
|
||||
struct snd_i2c_bit_ops *bit;
|
||||
void *ops;
|
||||
} hw_ops; /* lowlevel operations */
|
||||
struct snd_i2c_ops *ops; /* midlevel operations */
|
||||
|
||||
unsigned long private_value;
|
||||
void *private_data;
|
||||
void (*private_free)(struct snd_i2c_bus *bus);
|
||||
};
|
||||
|
||||
#define snd_i2c_slave_bus(n) list_entry(n, struct snd_i2c_bus, buses)
|
||||
|
||||
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(struct snd_i2c_bus *bus)
|
||||
{
|
||||
if (bus->master)
|
||||
mutex_lock(&bus->master->lock_mutex);
|
||||
else
|
||||
mutex_lock(&bus->lock_mutex);
|
||||
}
|
||||
|
||||
static inline void snd_i2c_unlock(struct snd_i2c_bus *bus)
|
||||
{
|
||||
if (bus->master)
|
||||
mutex_unlock(&bus->master->lock_mutex);
|
||||
else
|
||||
mutex_unlock(&bus->lock_mutex);
|
||||
}
|
||||
|
||||
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 */
|
||||
192
include/sound/info.h
Normal file
192
include/sound/info.h
Normal file
@@ -0,0 +1,192 @@
|
||||
#ifndef __SOUND_INFO_H
|
||||
#define __SOUND_INFO_H
|
||||
|
||||
/*
|
||||
* Header file for info interface
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/poll.h>
|
||||
|
||||
/* buffer for information */
|
||||
struct snd_info_buffer {
|
||||
char *buffer; /* pointer to begin of buffer */
|
||||
unsigned int curr; /* current position in buffer */
|
||||
unsigned int size; /* current size */
|
||||
unsigned int len; /* total length of buffer */
|
||||
int stop; /* stop flag */
|
||||
int error; /* error code */
|
||||
};
|
||||
|
||||
#define SNDRV_INFO_CONTENT_TEXT 0
|
||||
#define SNDRV_INFO_CONTENT_DATA 1
|
||||
|
||||
struct snd_info_entry;
|
||||
|
||||
struct snd_info_entry_text {
|
||||
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) (struct snd_info_entry *entry,
|
||||
unsigned short mode, void **file_private_data);
|
||||
int (*release) (struct snd_info_entry * entry,
|
||||
unsigned short mode, 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) (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) (struct snd_info_entry *entry, void *file_private_data,
|
||||
struct file * file, long long offset, int orig);
|
||||
unsigned int (*poll) (struct snd_info_entry *entry, void *file_private_data,
|
||||
struct file * file, poll_table * wait);
|
||||
int (*ioctl) (struct snd_info_entry *entry, void *file_private_data,
|
||||
struct file * file, unsigned int cmd, unsigned long arg);
|
||||
int (*mmap) (struct snd_info_entry *entry, void *file_private_data,
|
||||
struct inode * inode, struct file * file,
|
||||
struct vm_area_struct * vma);
|
||||
};
|
||||
|
||||
struct snd_info_entry {
|
||||
const char *name;
|
||||
mode_t mode;
|
||||
long size;
|
||||
unsigned short content;
|
||||
union {
|
||||
struct snd_info_entry_text text;
|
||||
struct snd_info_entry_ops *ops;
|
||||
} c;
|
||||
struct snd_info_entry *parent;
|
||||
struct snd_card *card;
|
||||
struct module *module;
|
||||
void *private_data;
|
||||
void (*private_free)(struct snd_info_entry *entry);
|
||||
struct proc_dir_entry *p;
|
||||
struct mutex access;
|
||||
struct list_head children;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_PROC_FS)
|
||||
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 */
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
extern struct snd_info_entry *snd_seq_root;
|
||||
#ifdef CONFIG_SND_OSSEMUL
|
||||
extern struct snd_info_entry *snd_oss_root;
|
||||
#else
|
||||
#define snd_oss_root NULL
|
||||
#endif
|
||||
|
||||
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(struct snd_info_buffer * buffer, char *line, int len);
|
||||
char *snd_info_get_str(char *dest, char *src, int len);
|
||||
struct snd_info_entry *snd_info_create_module_entry(struct module * module,
|
||||
const char *name,
|
||||
struct snd_info_entry * parent);
|
||||
struct snd_info_entry *snd_info_create_card_entry(struct snd_card * card,
|
||||
const char *name,
|
||||
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(struct snd_card * card);
|
||||
int snd_info_card_register(struct snd_card * card);
|
||||
int snd_info_card_free(struct snd_card * card);
|
||||
void snd_info_card_disconnect(struct snd_card * card);
|
||||
int snd_info_register(struct snd_info_entry * entry);
|
||||
|
||||
/* for card drivers */
|
||||
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(struct snd_info_entry *entry,
|
||||
void *private_data,
|
||||
void (*read)(struct snd_info_entry *, struct snd_info_buffer *))
|
||||
{
|
||||
entry->private_data = private_data;
|
||||
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(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(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 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(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 void snd_info_card_disconnect(struct snd_card * card) { }
|
||||
static inline int snd_info_register(struct snd_info_entry * entry) { return 0; }
|
||||
|
||||
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,
|
||||
void (*read)(struct snd_info_entry *, struct snd_info_buffer *)) {}
|
||||
|
||||
static inline int snd_info_check_reserved_words(const char *str) { return 1; }
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* OSS info part
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_PROC_FS)
|
||||
|
||||
#define SNDRV_OSS_INFO_DEV_AUDIO 0
|
||||
#define SNDRV_OSS_INFO_DEV_SYNTH 1
|
||||
#define SNDRV_OSS_INFO_DEV_MIDI 2
|
||||
#define SNDRV_OSS_INFO_DEV_TIMERS 4
|
||||
#define SNDRV_OSS_INFO_DEV_MIXERS 5
|
||||
|
||||
#define SNDRV_OSS_INFO_DEV_COUNT 6
|
||||
|
||||
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 */
|
||||
|
||||
#endif /* __SOUND_INFO_H */
|
||||
90
include/sound/initval.h
Normal file
90
include/sound/initval.h
Normal file
@@ -0,0 +1,90 @@
|
||||
#ifndef __SOUND_INITVAL_H
|
||||
#define __SOUND_INITVAL_H
|
||||
|
||||
/*
|
||||
* Init values for soundcard modules
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#define SNDRV_AUTO_PORT 1
|
||||
#define SNDRV_AUTO_IRQ 0xffff
|
||||
#define SNDRV_AUTO_DMA 0xffff
|
||||
#define SNDRV_AUTO_DMA_SIZE (0x7fffffff)
|
||||
|
||||
#define SNDRV_DEFAULT_IDX1 (-1)
|
||||
#define SNDRV_DEFAULT_STR1 NULL
|
||||
#define SNDRV_DEFAULT_ENABLE1 1
|
||||
#define SNDRV_DEFAULT_PORT1 SNDRV_AUTO_PORT
|
||||
#define SNDRV_DEFAULT_IRQ1 SNDRV_AUTO_IRQ
|
||||
#define SNDRV_DEFAULT_DMA1 SNDRV_AUTO_DMA
|
||||
#define SNDRV_DEFAULT_DMA_SIZE1 SNDRV_AUTO_DMA_SIZE
|
||||
#define SNDRV_DEFAULT_PTR1 SNDRV_DEFAULT_STR1
|
||||
|
||||
#define SNDRV_DEFAULT_IDX { [0 ... (SNDRV_CARDS-1)] = -1 }
|
||||
#define SNDRV_DEFAULT_STR { [0 ... (SNDRV_CARDS-1)] = NULL }
|
||||
#define SNDRV_DEFAULT_ENABLE { 1, [1 ... (SNDRV_CARDS-1)] = 0 }
|
||||
#define SNDRV_DEFAULT_ENABLE_PNP { [0 ... (SNDRV_CARDS-1)] = 1 }
|
||||
#ifdef CONFIG_PNP
|
||||
#define SNDRV_DEFAULT_ENABLE_ISAPNP SNDRV_DEFAULT_ENABLE_PNP
|
||||
#else
|
||||
#define SNDRV_DEFAULT_ENABLE_ISAPNP SNDRV_DEFAULT_ENABLE
|
||||
#endif
|
||||
#define SNDRV_DEFAULT_PORT { [0 ... (SNDRV_CARDS-1)] = SNDRV_AUTO_PORT }
|
||||
#define SNDRV_DEFAULT_IRQ { [0 ... (SNDRV_CARDS-1)] = SNDRV_AUTO_IRQ }
|
||||
#define SNDRV_DEFAULT_DMA { [0 ... (SNDRV_CARDS-1)] = SNDRV_AUTO_DMA }
|
||||
#define SNDRV_DEFAULT_DMA_SIZE { [0 ... (SNDRV_CARDS-1)] = SNDRV_AUTO_DMA_SIZE }
|
||||
#define SNDRV_DEFAULT_PTR SNDRV_DEFAULT_STR
|
||||
|
||||
#ifdef SNDRV_LEGACY_FIND_FREE_IRQ
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
static irqreturn_t snd_legacy_empty_irq_handler(int irq, void *dev_id)
|
||||
{
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int snd_legacy_find_free_irq(int *irq_table)
|
||||
{
|
||||
while (*irq_table != -1) {
|
||||
if (!request_irq(*irq_table, snd_legacy_empty_irq_handler,
|
||||
IRQF_DISABLED | IRQF_PROBE_SHARED, "ALSA Test IRQ",
|
||||
(void *) irq_table)) {
|
||||
free_irq(*irq_table, (void *) irq_table);
|
||||
return *irq_table;
|
||||
}
|
||||
irq_table++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SNDRV_LEGACY_FIND_FREE_DMA
|
||||
static int snd_legacy_find_free_dma(int *dma_table)
|
||||
{
|
||||
while (*dma_table != -1) {
|
||||
if (!request_dma(*dma_table, "ALSA Test DMA")) {
|
||||
free_dma(*dma_table);
|
||||
return *dma_table;
|
||||
}
|
||||
dma_table++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_INITVAL_H */
|
||||
118
include/sound/memalloc.h
Normal file
118
include/sound/memalloc.h
Normal file
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
* Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* Generic memory allocators
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_MEMALLOC_H
|
||||
#define __SOUND_MEMALLOC_H
|
||||
|
||||
struct device;
|
||||
|
||||
/*
|
||||
* buffer device info
|
||||
*/
|
||||
struct snd_dma_device {
|
||||
int type; /* SNDRV_DMA_TYPE_XXX */
|
||||
struct device *dev; /* generic device */
|
||||
};
|
||||
|
||||
#ifndef snd_dma_pci_data
|
||||
#define snd_dma_pci_data(pci) (&(pci)->dev)
|
||||
#define snd_dma_isa_data() NULL
|
||||
#define snd_dma_sbus_data(sbus) ((struct device *)(sbus))
|
||||
#define snd_dma_continuous_data(x) ((struct device *)(unsigned long)(x))
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* buffer types
|
||||
*/
|
||||
#define SNDRV_DMA_TYPE_UNKNOWN 0 /* not defined */
|
||||
#define SNDRV_DMA_TYPE_CONTINUOUS 1 /* continuous no-DMA memory */
|
||||
#define SNDRV_DMA_TYPE_DEV 2 /* generic device continuous */
|
||||
#define SNDRV_DMA_TYPE_DEV_SG 3 /* generic device SG-buffer */
|
||||
#define SNDRV_DMA_TYPE_SBUS 4 /* SBUS continuous */
|
||||
|
||||
/*
|
||||
* info for buffer allocation
|
||||
*/
|
||||
struct snd_dma_buffer {
|
||||
struct snd_dma_device dev; /* device type */
|
||||
unsigned char *area; /* virtual pointer */
|
||||
dma_addr_t addr; /* physical address */
|
||||
size_t bytes; /* buffer size in bytes */
|
||||
void *private_data; /* private for allocator; don't touch */
|
||||
};
|
||||
|
||||
/*
|
||||
* Scatter-Gather generic device pages
|
||||
*/
|
||||
struct snd_sg_page {
|
||||
void *buf;
|
||||
dma_addr_t addr;
|
||||
};
|
||||
|
||||
struct snd_sg_buf {
|
||||
int size; /* allocated byte size */
|
||||
int pages; /* allocated pages */
|
||||
int tblsize; /* allocated table size */
|
||||
struct snd_sg_page *table; /* address table */
|
||||
struct page **page_table; /* page table (for vmap/vunmap) */
|
||||
struct device *dev;
|
||||
};
|
||||
|
||||
/*
|
||||
* return the pages matching with the given byte size
|
||||
*/
|
||||
static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
|
||||
{
|
||||
return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
/*
|
||||
* return the physical address at the corresponding offset
|
||||
*/
|
||||
static inline dma_addr_t snd_sgbuf_get_addr(struct snd_sg_buf *sgbuf, size_t offset)
|
||||
{
|
||||
return sgbuf->table[offset >> PAGE_SHIFT].addr + offset % PAGE_SIZE;
|
||||
}
|
||||
|
||||
|
||||
/* allocate/release a buffer */
|
||||
int snd_dma_alloc_pages(int type, struct device *dev, size_t size,
|
||||
struct snd_dma_buffer *dmab);
|
||||
int snd_dma_alloc_pages_fallback(int type, struct device *dev, size_t size,
|
||||
struct snd_dma_buffer *dmab);
|
||||
void snd_dma_free_pages(struct snd_dma_buffer *dmab);
|
||||
|
||||
/* buffer-preservation managements */
|
||||
|
||||
#define snd_dma_pci_buf_id(pci) (((unsigned int)(pci)->vendor << 16) | (pci)->device)
|
||||
|
||||
size_t snd_dma_get_reserved_buf(struct snd_dma_buffer *dmab, unsigned int id);
|
||||
int snd_dma_reserve_buf(struct snd_dma_buffer *dmab, unsigned int id);
|
||||
|
||||
/* basic memory allocation functions */
|
||||
void *snd_malloc_pages(size_t size, gfp_t gfp_flags);
|
||||
void snd_free_pages(void *ptr, size_t size);
|
||||
|
||||
#endif /* __SOUND_MEMALLOC_H */
|
||||
|
||||
108
include/sound/minors.h
Normal file
108
include/sound/minors.h
Normal file
@@ -0,0 +1,108 @@
|
||||
#ifndef __SOUND_MINORS_H
|
||||
#define __SOUND_MINORS_H
|
||||
|
||||
/*
|
||||
* MINOR numbers
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#define SNDRV_MINOR_DEVICES 32
|
||||
#define SNDRV_MINOR_CARD(minor) ((minor) >> 5)
|
||||
#define SNDRV_MINOR_DEVICE(minor) ((minor) & 0x001f)
|
||||
#define SNDRV_MINOR(card, dev) (((card) << 5) | (dev))
|
||||
|
||||
/* 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_RAWMIDI 8 /* 8 - 15 */
|
||||
#define SNDRV_MINOR_PCM_PLAYBACK 16 /* 16 - 23 */
|
||||
#define SNDRV_MINOR_PCM_CAPTURE 24 /* 24 - 31 */
|
||||
|
||||
/* 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
|
||||
#define SNDRV_DEVICE_TYPE_PCM_PLAYBACK SNDRV_MINOR_PCM_PLAYBACK
|
||||
#define SNDRV_DEVICE_TYPE_PCM_CAPTURE SNDRV_MINOR_PCM_CAPTURE
|
||||
#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
|
||||
#define SNDRV_MINOR_OSS_CARD(minor) ((minor) >> 4)
|
||||
#define SNDRV_MINOR_OSS_DEVICE(minor) ((minor) & 0x000f)
|
||||
#define SNDRV_MINOR_OSS(card, dev) (((card) << 4) | (dev))
|
||||
|
||||
#define SNDRV_MINOR_OSS_MIXER 0 /* /dev/mixer - OSS 3.XX compatible */
|
||||
#define SNDRV_MINOR_OSS_SEQUENCER 1 /* /dev/sequencer - OSS 3.XX compatible */
|
||||
#define SNDRV_MINOR_OSS_MIDI 2 /* /dev/midi - native midi interface - OSS 3.XX compatible - UART */
|
||||
#define SNDRV_MINOR_OSS_PCM 3 /* alias */
|
||||
#define SNDRV_MINOR_OSS_PCM_8 3 /* /dev/dsp - 8bit PCM - OSS 3.XX compatible */
|
||||
#define SNDRV_MINOR_OSS_AUDIO 4 /* /dev/audio - SunSparc compatible */
|
||||
#define SNDRV_MINOR_OSS_PCM_16 5 /* /dev/dsp16 - 16bit PCM - OSS 3.XX compatible */
|
||||
#define SNDRV_MINOR_OSS_SNDSTAT 6 /* /dev/sndstat - for compatibility with OSS */
|
||||
#define SNDRV_MINOR_OSS_RESERVED7 7 /* reserved for future use */
|
||||
#define SNDRV_MINOR_OSS_MUSIC 8 /* /dev/music - OSS 3.XX compatible */
|
||||
#define SNDRV_MINOR_OSS_DMMIDI 9 /* /dev/dmmidi0 - this device can have another minor # with OSS */
|
||||
#define SNDRV_MINOR_OSS_DMFM 10 /* /dev/dmfm0 - this device can have another minor # with OSS */
|
||||
#define SNDRV_MINOR_OSS_MIXER1 11 /* alternate mixer */
|
||||
#define SNDRV_MINOR_OSS_PCM1 12 /* alternate PCM (GF-A-1) */
|
||||
#define SNDRV_MINOR_OSS_MIDI1 13 /* alternate midi - SYNTH */
|
||||
#define SNDRV_MINOR_OSS_DMMIDI1 14 /* alternate dmmidi - SYNTH */
|
||||
#define SNDRV_MINOR_OSS_RESERVED15 15 /* reserved for future use */
|
||||
|
||||
#define SNDRV_OSS_DEVICE_TYPE_MIXER 0
|
||||
#define SNDRV_OSS_DEVICE_TYPE_SEQUENCER 1
|
||||
#define SNDRV_OSS_DEVICE_TYPE_PCM 2
|
||||
#define SNDRV_OSS_DEVICE_TYPE_MIDI 3
|
||||
#define SNDRV_OSS_DEVICE_TYPE_DMFM 4
|
||||
#define SNDRV_OSS_DEVICE_TYPE_SNDSTAT 5
|
||||
#define SNDRV_OSS_DEVICE_TYPE_MUSIC 6
|
||||
|
||||
#define MODULE_ALIAS_SNDRV_MINOR(type) \
|
||||
MODULE_ALIAS("sound-service-?-" __stringify(type))
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_MINORS_H */
|
||||
78
include/sound/mixer_oss.h
Normal file
78
include/sound/mixer_oss.h
Normal file
@@ -0,0 +1,78 @@
|
||||
#ifndef __SOUND_MIXER_OSS_H
|
||||
#define __SOUND_MIXER_OSS_H
|
||||
|
||||
/*
|
||||
* OSS MIXER API
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
|
||||
|
||||
#define SNDRV_OSS_MAX_MIXERS 32
|
||||
|
||||
struct snd_mixer_oss_file;
|
||||
|
||||
struct snd_mixer_oss_slot {
|
||||
int number;
|
||||
unsigned int stereo: 1;
|
||||
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)(struct snd_mixer_oss_slot *slot);
|
||||
int volume[2];
|
||||
};
|
||||
|
||||
struct snd_mixer_oss {
|
||||
struct snd_card *card;
|
||||
char id[16];
|
||||
char name[32];
|
||||
struct snd_mixer_oss_slot slots[SNDRV_OSS_MAX_MIXERS]; /* OSS mixer slots */
|
||||
unsigned int mask_recsrc; /* exclusive recsrc mask */
|
||||
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)(struct snd_mixer_oss *mixer);
|
||||
struct mutex reg_mutex;
|
||||
struct snd_info_entry *proc_entry;
|
||||
int oss_dev_alloc;
|
||||
/* --- */
|
||||
int oss_recsrc;
|
||||
};
|
||||
|
||||
struct snd_mixer_oss_file {
|
||||
struct snd_card *card;
|
||||
struct snd_mixer_oss *mixer;
|
||||
};
|
||||
|
||||
#endif /* CONFIG_SND_MIXER_OSS */
|
||||
|
||||
#endif /* __SOUND_MIXER_OSS_H */
|
||||
122
include/sound/mpu401.h
Normal file
122
include/sound/mpu401.h
Normal file
@@ -0,0 +1,122 @@
|
||||
#ifndef __SOUND_MPU401_H
|
||||
#define __SOUND_MPU401_H
|
||||
|
||||
/*
|
||||
* Header file for MPU-401 and compatible cards
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "rawmidi.h"
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#define MPU401_HW_MPU401 1 /* native MPU401 */
|
||||
#define MPU401_HW_SB 2 /* SoundBlaster MPU-401 UART */
|
||||
#define MPU401_HW_ES1688 3 /* AudioDrive ES1688 MPU-401 UART */
|
||||
#define MPU401_HW_OPL3SA2 4 /* Yamaha OPL3-SA2 */
|
||||
#define MPU401_HW_SONICVIBES 5 /* S3 SonicVibes */
|
||||
#define MPU401_HW_CS4232 6 /* CS4232 */
|
||||
#define MPU401_HW_ES18XX 7 /* AudioDrive ES18XX MPU-401 UART */
|
||||
#define MPU401_HW_FM801 8 /* ForteMedia FM801 */
|
||||
#define MPU401_HW_TRID4DWAVE 9 /* Trident 4DWave */
|
||||
#define MPU401_HW_AZT2320 10 /* Aztech AZT2320 */
|
||||
#define MPU401_HW_ALS100 11 /* Avance Logic ALS100 */
|
||||
#define MPU401_HW_ICE1712 12 /* Envy24 */
|
||||
#define MPU401_HW_VIA686A 13 /* VIA 82C686A */
|
||||
#define MPU401_HW_YMFPCI 14 /* YMF DS-XG PCI */
|
||||
#define MPU401_HW_CMIPCI 15 /* CMIPCI MPU-401 UART */
|
||||
#define MPU401_HW_ALS4000 16 /* Avance Logic ALS4000 */
|
||||
#define MPU401_HW_INTEL8X0 17 /* Intel8x0 driver */
|
||||
#define MPU401_HW_PC98II 18 /* Roland PC98II */
|
||||
#define MPU401_HW_AUREAL 19 /* Aureal Vortex */
|
||||
|
||||
#define MPU401_INFO_INPUT (1 << 0) /* input stream */
|
||||
#define MPU401_INFO_OUTPUT (1 << 1) /* output stream */
|
||||
#define MPU401_INFO_INTEGRATED (1 << 2) /* integrated h/w port */
|
||||
#define MPU401_INFO_MMIO (1 << 3) /* MMIO access */
|
||||
#define MPU401_INFO_TX_IRQ (1 << 4) /* independent TX irq */
|
||||
#define MPU401_INFO_UART_ONLY (1 << 5) /* No ENTER_UART cmd needed */
|
||||
|
||||
#define MPU401_MODE_BIT_INPUT 0
|
||||
#define MPU401_MODE_BIT_OUTPUT 1
|
||||
#define MPU401_MODE_BIT_INPUT_TRIGGER 2
|
||||
#define MPU401_MODE_BIT_OUTPUT_TRIGGER 3
|
||||
|
||||
#define MPU401_MODE_INPUT (1<<MPU401_MODE_BIT_INPUT)
|
||||
#define MPU401_MODE_OUTPUT (1<<MPU401_MODE_BIT_OUTPUT)
|
||||
#define MPU401_MODE_INPUT_TRIGGER (1<<MPU401_MODE_BIT_INPUT_TRIGGER)
|
||||
#define MPU401_MODE_OUTPUT_TRIGGER (1<<MPU401_MODE_BIT_OUTPUT_TRIGGER)
|
||||
|
||||
#define MPU401_MODE_INPUT_TIMER (1<<0)
|
||||
#define MPU401_MODE_OUTPUT_TIMER (1<<1)
|
||||
|
||||
struct snd_mpu401 {
|
||||
struct snd_rawmidi *rmidi;
|
||||
|
||||
unsigned short hardware; /* MPU401_HW_XXXX */
|
||||
unsigned int info_flags; /* MPU401_INFO_XXX */
|
||||
unsigned long port; /* base port of MPU-401 chip */
|
||||
unsigned long cport; /* port + 1 (usually) */
|
||||
struct resource *res; /* port resource */
|
||||
int irq; /* IRQ number of MPU-401 chip (-1 = poll) */
|
||||
int irq_flags;
|
||||
|
||||
unsigned long mode; /* MPU401_MODE_XXXX */
|
||||
int timer_invoked;
|
||||
|
||||
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;
|
||||
|
||||
struct snd_rawmidi_substream *substream_input;
|
||||
struct snd_rawmidi_substream *substream_output;
|
||||
|
||||
spinlock_t input_lock;
|
||||
spinlock_t output_lock;
|
||||
spinlock_t timer_lock;
|
||||
|
||||
struct timer_list timer;
|
||||
|
||||
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 */
|
||||
|
||||
#define MPU401C(mpu) (mpu)->cport
|
||||
#define MPU401D(mpu) (mpu)->port
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id);
|
||||
irqreturn_t snd_mpu401_uart_interrupt_tx(int irq, void *dev_id);
|
||||
|
||||
int snd_mpu401_uart_new(struct snd_card *card,
|
||||
int device,
|
||||
unsigned short hardware,
|
||||
unsigned long port,
|
||||
unsigned int info_flags,
|
||||
int irq,
|
||||
int irq_flags,
|
||||
struct snd_rawmidi ** rrawmidi);
|
||||
|
||||
#endif /* __SOUND_MPU401_H */
|
||||
340
include/sound/opl3.h
Normal file
340
include/sound/opl3.h
Normal file
@@ -0,0 +1,340 @@
|
||||
#ifndef __SOUND_OPL3_H
|
||||
#define __SOUND_OPL3_H
|
||||
|
||||
/*
|
||||
* Definitions of the OPL-3 registers.
|
||||
*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
||||
* Hannu Savolainen 1993-1996
|
||||
*
|
||||
*
|
||||
* The OPL-3 mode is switched on by writing 0x01, to the offset 5
|
||||
* of the right side.
|
||||
*
|
||||
* Another special register at the right side is at offset 4. It contains
|
||||
* a bit mask defining which voices are used as 4 OP voices.
|
||||
*
|
||||
* The percussive mode is implemented in the left side only.
|
||||
*
|
||||
* With the above exceptions the both sides can be operated independently.
|
||||
*
|
||||
* A 4 OP voice can be created by setting the corresponding
|
||||
* bit at offset 4 of the right side.
|
||||
*
|
||||
* For example setting the rightmost bit (0x01) changes the
|
||||
* first voice on the right side to the 4 OP mode. The fourth
|
||||
* voice is made inaccessible.
|
||||
*
|
||||
* If a voice is set to the 2 OP mode, it works like 2 OP modes
|
||||
* of the original YM3812 (AdLib). In addition the voice can
|
||||
* be connected the left, right or both stereo channels. It can
|
||||
* even be left unconnected. This works with 4 OP voices also.
|
||||
*
|
||||
* The stereo connection bits are located in the FEEDBACK_CONNECTION
|
||||
* register of the voice (0xC0-0xC8). In 4 OP voices these bits are
|
||||
* in the second half of the voice.
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "driver.h"
|
||||
#include <linux/time.h>
|
||||
#include <linux/mutex.h>
|
||||
#include "core.h"
|
||||
#include "hwdep.h"
|
||||
#include "timer.h"
|
||||
#include "seq_midi_emul.h"
|
||||
#ifdef CONFIG_SND_SEQUENCER_OSS
|
||||
#include "seq_oss.h"
|
||||
#include "seq_oss_legacy.h"
|
||||
#endif
|
||||
#include "seq_device.h"
|
||||
#include "ainstr_fm.h"
|
||||
|
||||
/*
|
||||
* Register numbers for the global registers
|
||||
*/
|
||||
|
||||
#define OPL3_REG_TEST 0x01
|
||||
#define OPL3_ENABLE_WAVE_SELECT 0x20
|
||||
|
||||
#define OPL3_REG_TIMER1 0x02
|
||||
#define OPL3_REG_TIMER2 0x03
|
||||
#define OPL3_REG_TIMER_CONTROL 0x04 /* Left side */
|
||||
#define OPL3_IRQ_RESET 0x80
|
||||
#define OPL3_TIMER1_MASK 0x40
|
||||
#define OPL3_TIMER2_MASK 0x20
|
||||
#define OPL3_TIMER1_START 0x01
|
||||
#define OPL3_TIMER2_START 0x02
|
||||
|
||||
#define OPL3_REG_CONNECTION_SELECT 0x04 /* Right side */
|
||||
#define OPL3_LEFT_4OP_0 0x01
|
||||
#define OPL3_LEFT_4OP_1 0x02
|
||||
#define OPL3_LEFT_4OP_2 0x04
|
||||
#define OPL3_RIGHT_4OP_0 0x08
|
||||
#define OPL3_RIGHT_4OP_1 0x10
|
||||
#define OPL3_RIGHT_4OP_2 0x20
|
||||
|
||||
#define OPL3_REG_MODE 0x05 /* Right side */
|
||||
#define OPL3_OPL3_ENABLE 0x01 /* OPL3 mode */
|
||||
#define OPL3_OPL4_ENABLE 0x02 /* OPL4 mode */
|
||||
|
||||
#define OPL3_REG_KBD_SPLIT 0x08 /* Left side */
|
||||
#define OPL3_COMPOSITE_SINE_WAVE_MODE 0x80 /* Don't use with OPL-3? */
|
||||
#define OPL3_KEYBOARD_SPLIT 0x40
|
||||
|
||||
#define OPL3_REG_PERCUSSION 0xbd /* Left side only */
|
||||
#define OPL3_TREMOLO_DEPTH 0x80
|
||||
#define OPL3_VIBRATO_DEPTH 0x40
|
||||
#define OPL3_PERCUSSION_ENABLE 0x20
|
||||
#define OPL3_BASSDRUM_ON 0x10
|
||||
#define OPL3_SNAREDRUM_ON 0x08
|
||||
#define OPL3_TOMTOM_ON 0x04
|
||||
#define OPL3_CYMBAL_ON 0x02
|
||||
#define OPL3_HIHAT_ON 0x01
|
||||
|
||||
/*
|
||||
* Offsets to the register banks for operators. To get the
|
||||
* register number just add the operator offset to the bank offset
|
||||
*
|
||||
* AM/VIB/EG/KSR/Multiple (0x20 to 0x35)
|
||||
*/
|
||||
#define OPL3_REG_AM_VIB 0x20
|
||||
#define OPL3_TREMOLO_ON 0x80
|
||||
#define OPL3_VIBRATO_ON 0x40
|
||||
#define OPL3_SUSTAIN_ON 0x20
|
||||
#define OPL3_KSR 0x10 /* Key scaling rate */
|
||||
#define OPL3_MULTIPLE_MASK 0x0f /* Frequency multiplier */
|
||||
|
||||
/*
|
||||
* KSL/Total level (0x40 to 0x55)
|
||||
*/
|
||||
#define OPL3_REG_KSL_LEVEL 0x40
|
||||
#define OPL3_KSL_MASK 0xc0 /* Envelope scaling bits */
|
||||
#define OPL3_TOTAL_LEVEL_MASK 0x3f /* Strength (volume) of OP */
|
||||
|
||||
/*
|
||||
* Attack / Decay rate (0x60 to 0x75)
|
||||
*/
|
||||
#define OPL3_REG_ATTACK_DECAY 0x60
|
||||
#define OPL3_ATTACK_MASK 0xf0
|
||||
#define OPL3_DECAY_MASK 0x0f
|
||||
|
||||
/*
|
||||
* Sustain level / Release rate (0x80 to 0x95)
|
||||
*/
|
||||
#define OPL3_REG_SUSTAIN_RELEASE 0x80
|
||||
#define OPL3_SUSTAIN_MASK 0xf0
|
||||
#define OPL3_RELEASE_MASK 0x0f
|
||||
|
||||
/*
|
||||
* Wave select (0xE0 to 0xF5)
|
||||
*/
|
||||
#define OPL3_REG_WAVE_SELECT 0xe0
|
||||
#define OPL3_WAVE_SELECT_MASK 0x07
|
||||
|
||||
/*
|
||||
* Offsets to the register banks for voices. Just add to the
|
||||
* voice number to get the register number.
|
||||
*
|
||||
* F-Number low bits (0xA0 to 0xA8).
|
||||
*/
|
||||
#define OPL3_REG_FNUM_LOW 0xa0
|
||||
|
||||
/*
|
||||
* F-number high bits / Key on / Block (octave) (0xB0 to 0xB8)
|
||||
*/
|
||||
#define OPL3_REG_KEYON_BLOCK 0xb0
|
||||
#define OPL3_KEYON_BIT 0x20
|
||||
#define OPL3_BLOCKNUM_MASK 0x1c
|
||||
#define OPL3_FNUM_HIGH_MASK 0x03
|
||||
|
||||
/*
|
||||
* Feedback / Connection (0xc0 to 0xc8)
|
||||
*
|
||||
* These registers have two new bits when the OPL-3 mode
|
||||
* is selected. These bits controls connecting the voice
|
||||
* to the stereo channels. For 4 OP voices this bit is
|
||||
* defined in the second half of the voice (add 3 to the
|
||||
* register offset).
|
||||
*
|
||||
* For 4 OP voices the connection bit is used in the
|
||||
* both halves (gives 4 ways to connect the operators).
|
||||
*/
|
||||
#define OPL3_REG_FEEDBACK_CONNECTION 0xc0
|
||||
#define OPL3_FEEDBACK_MASK 0x0e /* Valid just for 1st OP of a voice */
|
||||
#define OPL3_CONNECTION_BIT 0x01
|
||||
/*
|
||||
* In the 4 OP mode there is four possible configurations how the
|
||||
* operators can be connected together (in 2 OP modes there is just
|
||||
* AM or FM). The 4 OP connection mode is defined by the rightmost
|
||||
* bit of the FEEDBACK_CONNECTION (0xC0-0xC8) on the both halves.
|
||||
*
|
||||
* First half Second half Mode
|
||||
*
|
||||
* +---+
|
||||
* v |
|
||||
* 0 0 >+-1-+--2--3--4-->
|
||||
*
|
||||
*
|
||||
*
|
||||
* +---+
|
||||
* | |
|
||||
* 0 1 >+-1-+--2-+
|
||||
* |->
|
||||
* >--3----4-+
|
||||
*
|
||||
* +---+
|
||||
* | |
|
||||
* 1 0 >+-1-+-----+
|
||||
* |->
|
||||
* >--2--3--4-+
|
||||
*
|
||||
* +---+
|
||||
* | |
|
||||
* 1 1 >+-1-+--+
|
||||
* |
|
||||
* >--2--3-+->
|
||||
* |
|
||||
* >--4----+
|
||||
*/
|
||||
#define OPL3_STEREO_BITS 0x30 /* OPL-3 only */
|
||||
#define OPL3_VOICE_TO_LEFT 0x10
|
||||
#define OPL3_VOICE_TO_RIGHT 0x20
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
#define OPL3_LEFT 0x0000
|
||||
#define OPL3_RIGHT 0x0100
|
||||
|
||||
#define OPL3_HW_AUTO 0x0000
|
||||
#define OPL3_HW_OPL2 0x0200
|
||||
#define OPL3_HW_OPL3 0x0300
|
||||
#define OPL3_HW_OPL3_SV 0x0301 /* S3 SonicVibes */
|
||||
#define OPL3_HW_OPL3_CS 0x0302 /* CS4232/CS4236+ */
|
||||
#define OPL3_HW_OPL3_FM801 0x0303 /* FM801 */
|
||||
#define OPL3_HW_OPL3_CS4281 0x0304 /* CS4281 */
|
||||
#define OPL3_HW_OPL4 0x0400 /* YMF278B/YMF295 */
|
||||
#define OPL3_HW_OPL4_ML 0x0401 /* YMF704/YMF721 */
|
||||
#define OPL3_HW_MASK 0xff00
|
||||
|
||||
#define MAX_OPL2_VOICES 9
|
||||
#define MAX_OPL3_VOICES 18
|
||||
|
||||
struct snd_opl3;
|
||||
|
||||
/*
|
||||
* A structure to keep track of each hardware 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 */
|
||||
#define SNDRV_OPL3_ST_ON_4OP 2 /* 4op voice is allocated */
|
||||
#define SNDRV_OPL3_ST_NOT_AVAIL -1 /* voice is not available */
|
||||
|
||||
unsigned int time; /* An allocation time */
|
||||
unsigned char note; /* Note currently assigned to this voice */
|
||||
|
||||
unsigned long note_off; /* note-off time */
|
||||
int note_off_check; /* check note-off time */
|
||||
|
||||
unsigned char keyon_reg; /* KON register shadow */
|
||||
|
||||
struct snd_midi_channel *chan; /* Midi channel for this note */
|
||||
};
|
||||
|
||||
struct snd_opl3 {
|
||||
unsigned long l_port;
|
||||
unsigned long r_port;
|
||||
struct resource *res_l_port;
|
||||
struct resource *res_r_port;
|
||||
unsigned short hardware;
|
||||
/* hardware access */
|
||||
void (*command) (struct snd_opl3 * opl3, unsigned short cmd, unsigned char val);
|
||||
unsigned short timer_enable;
|
||||
int seq_dev_num; /* sequencer device number */
|
||||
struct snd_timer *timer1;
|
||||
struct snd_timer *timer2;
|
||||
spinlock_t timer_lock;
|
||||
|
||||
void *private_data;
|
||||
void (*private_free)(struct snd_opl3 *);
|
||||
|
||||
spinlock_t reg_lock;
|
||||
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 */
|
||||
unsigned char max_voices; /* max number of voices */
|
||||
#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
|
||||
#define SNDRV_OPL3_MODE_SYNTH 0 /* OSS - voices allocated by application */
|
||||
#define SNDRV_OPL3_MODE_SEQ 1 /* ALSA - driver handles voice allocation */
|
||||
int synth_mode; /* synth mode */
|
||||
int seq_client;
|
||||
|
||||
struct snd_seq_device *seq_dev; /* sequencer device */
|
||||
struct snd_midi_channel_set * chset;
|
||||
|
||||
#ifdef CONFIG_SND_SEQUENCER_OSS
|
||||
struct snd_seq_device *oss_seq_dev; /* OSS sequencer device */
|
||||
struct snd_midi_channel_set * oss_chset;
|
||||
#endif
|
||||
|
||||
struct snd_seq_kinstr_ops fm_ops;
|
||||
struct snd_seq_kinstr_list *ilist;
|
||||
|
||||
struct snd_opl3_voice voices[MAX_OPL3_VOICES]; /* Voices (OPL3 'channel') */
|
||||
int use_time; /* allocation counter */
|
||||
|
||||
unsigned short connection_reg; /* connection reg shadow */
|
||||
unsigned char drum_reg; /* percussion reg shadow */
|
||||
|
||||
spinlock_t voice_lock; /* Lock for voice access */
|
||||
|
||||
struct timer_list tlist; /* timer for note-offs and effects */
|
||||
int sys_timer_status; /* system timer run status */
|
||||
spinlock_t sys_timer_lock; /* Lock for system timer access */
|
||||
#endif
|
||||
struct mutex access_mutex; /* locking */
|
||||
};
|
||||
|
||||
/* opl3.c */
|
||||
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,
|
||||
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(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(struct snd_hwdep * hw, struct file *file);
|
||||
|
||||
void snd_opl3_reset(struct snd_opl3 * opl3);
|
||||
|
||||
#endif /* __SOUND_OPL3_H */
|
||||
32
include/sound/opl4.h
Normal file
32
include/sound/opl4.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef __SOUND_OPL4_H
|
||||
#define __SOUND_OPL4_H
|
||||
|
||||
/*
|
||||
* Global definitions for the OPL4 driver
|
||||
* Copyright (c) 2003 by Clemens Ladisch <clemens@ladisch.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <sound/opl3.h>
|
||||
|
||||
struct snd_opl4;
|
||||
|
||||
extern int snd_opl4_create(struct snd_card *card,
|
||||
unsigned long fm_port, unsigned long pcm_port,
|
||||
int seq_device,
|
||||
struct snd_opl3 **opl3, struct snd_opl4 **opl4);
|
||||
|
||||
#endif /* __SOUND_OPL4_H */
|
||||
177
include/sound/pcm-indirect.h
Normal file
177
include/sound/pcm-indirect.h
Normal file
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* Helper functions for indirect PCM data transfer
|
||||
*
|
||||
* Copyright (c) by Takashi Iwai <tiwai@suse.de>
|
||||
* Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_PCM_INDIRECT_H
|
||||
#define __SOUND_PCM_INDIRECT_H
|
||||
|
||||
#include <sound/pcm.h>
|
||||
|
||||
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 */
|
||||
unsigned int hw_io; /* Ring buffer hw pointer */
|
||||
int hw_ready; /* Bytes ready for play (or captured) in hw ring buffer */
|
||||
unsigned int sw_buffer_size; /* Byte size of software buffer */
|
||||
unsigned int sw_data; /* Offset to next dst (or src) in sw ring buffer */
|
||||
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 */
|
||||
};
|
||||
|
||||
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(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_indirect *rec,
|
||||
snd_pcm_indirect_copy_t copy)
|
||||
{
|
||||
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;
|
||||
|
||||
if (diff) {
|
||||
if (diff < -(snd_pcm_sframes_t) (runtime->boundary / 2))
|
||||
diff += runtime->boundary;
|
||||
rec->sw_ready += (int)frames_to_bytes(runtime, diff);
|
||||
rec->appl_ptr = appl_ptr;
|
||||
}
|
||||
qsize = rec->hw_queue_size ? rec->hw_queue_size : rec->hw_buffer_size;
|
||||
while (rec->hw_ready < qsize && rec->sw_ready > 0) {
|
||||
unsigned int hw_to_end = rec->hw_buffer_size - rec->hw_data;
|
||||
unsigned int sw_to_end = rec->sw_buffer_size - rec->sw_data;
|
||||
unsigned int bytes = qsize - rec->hw_ready;
|
||||
if (rec->sw_ready < (int)bytes)
|
||||
bytes = rec->sw_ready;
|
||||
if (hw_to_end < bytes)
|
||||
bytes = hw_to_end;
|
||||
if (sw_to_end < bytes)
|
||||
bytes = sw_to_end;
|
||||
if (! bytes)
|
||||
break;
|
||||
copy(substream, rec, bytes);
|
||||
rec->hw_data += bytes;
|
||||
if (rec->hw_data == rec->hw_buffer_size)
|
||||
rec->hw_data = 0;
|
||||
rec->sw_data += bytes;
|
||||
if (rec->sw_data == rec->sw_buffer_size)
|
||||
rec->sw_data = 0;
|
||||
rec->hw_ready += bytes;
|
||||
rec->sw_ready -= bytes;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* helper function for playback pointer callback
|
||||
* ptr = current byte pointer
|
||||
*/
|
||||
static inline snd_pcm_uframes_t
|
||||
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)
|
||||
bytes += rec->hw_buffer_size;
|
||||
rec->hw_io = ptr;
|
||||
rec->hw_ready -= bytes;
|
||||
rec->sw_io += bytes;
|
||||
if (rec->sw_io >= rec->sw_buffer_size)
|
||||
rec->sw_io -= rec->sw_buffer_size;
|
||||
if (substream->ops->ack)
|
||||
substream->ops->ack(substream);
|
||||
return bytes_to_frames(substream->runtime, rec->sw_io);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* helper function for capture ack callback
|
||||
*/
|
||||
static inline void
|
||||
snd_pcm_indirect_capture_transfer(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_indirect *rec,
|
||||
snd_pcm_indirect_copy_t copy)
|
||||
{
|
||||
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;
|
||||
|
||||
if (diff) {
|
||||
if (diff < -(snd_pcm_sframes_t) (runtime->boundary / 2))
|
||||
diff += runtime->boundary;
|
||||
rec->sw_ready -= frames_to_bytes(runtime, diff);
|
||||
rec->appl_ptr = appl_ptr;
|
||||
}
|
||||
while (rec->hw_ready > 0 &&
|
||||
rec->sw_ready < (int)rec->sw_buffer_size) {
|
||||
size_t hw_to_end = rec->hw_buffer_size - rec->hw_data;
|
||||
size_t sw_to_end = rec->sw_buffer_size - rec->sw_data;
|
||||
size_t bytes = rec->sw_buffer_size - rec->sw_ready;
|
||||
if (rec->hw_ready < (int)bytes)
|
||||
bytes = rec->hw_ready;
|
||||
if (hw_to_end < bytes)
|
||||
bytes = hw_to_end;
|
||||
if (sw_to_end < bytes)
|
||||
bytes = sw_to_end;
|
||||
if (! bytes)
|
||||
break;
|
||||
copy(substream, rec, bytes);
|
||||
rec->hw_data += bytes;
|
||||
if ((int)rec->hw_data == rec->hw_buffer_size)
|
||||
rec->hw_data = 0;
|
||||
rec->sw_data += bytes;
|
||||
if (rec->sw_data == rec->sw_buffer_size)
|
||||
rec->sw_data = 0;
|
||||
rec->hw_ready -= bytes;
|
||||
rec->sw_ready += bytes;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* helper function for capture pointer callback,
|
||||
* ptr = current byte pointer
|
||||
*/
|
||||
static inline snd_pcm_uframes_t
|
||||
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;
|
||||
if (bytes < 0)
|
||||
bytes += rec->hw_buffer_size;
|
||||
rec->hw_io = ptr;
|
||||
rec->hw_ready += bytes;
|
||||
qsize = rec->hw_queue_size ? rec->hw_queue_size : rec->hw_buffer_size;
|
||||
if (rec->hw_ready > qsize)
|
||||
return SNDRV_PCM_POS_XRUN;
|
||||
rec->sw_io += bytes;
|
||||
if (rec->sw_io >= rec->sw_buffer_size)
|
||||
rec->sw_io -= rec->sw_buffer_size;
|
||||
if (substream->ops->ack)
|
||||
substream->ops->ack(substream);
|
||||
return bytes_to_frames(substream->runtime, rec->sw_io);
|
||||
}
|
||||
|
||||
#endif /* __SOUND_PCM_INDIRECT_H */
|
||||
1015
include/sound/pcm.h
Normal file
1015
include/sound/pcm.h
Normal file
File diff suppressed because it is too large
Load Diff
89
include/sound/pcm_oss.h
Normal file
89
include/sound/pcm_oss.h
Normal file
@@ -0,0 +1,89 @@
|
||||
#ifndef __SOUND_PCM_OSS_H
|
||||
#define __SOUND_PCM_OSS_H
|
||||
|
||||
/*
|
||||
* Digital Audio (PCM) - OSS compatibility abstract layer
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
struct snd_pcm_oss_setup {
|
||||
char *task_name;
|
||||
unsigned int disable:1,
|
||||
direct:1,
|
||||
block:1,
|
||||
nonblock:1,
|
||||
partialfrag:1,
|
||||
nosilence:1,
|
||||
buggyptr:1;
|
||||
unsigned int periods;
|
||||
unsigned int period_size;
|
||||
struct snd_pcm_oss_setup *next;
|
||||
};
|
||||
|
||||
struct snd_pcm_oss_runtime {
|
||||
unsigned params: 1, /* format/parameter change */
|
||||
prepare: 1, /* need to prepare the operation */
|
||||
trigger: 1, /* trigger flag */
|
||||
sync_trigger: 1; /* sync trigger flag */
|
||||
int rate; /* requested rate */
|
||||
int format; /* requested OSS format */
|
||||
unsigned int channels; /* requested channels */
|
||||
unsigned int fragshift;
|
||||
unsigned int maxfrags;
|
||||
unsigned int subdivision; /* requested subdivision */
|
||||
size_t period_bytes; /* requested period size */
|
||||
size_t period_frames; /* period frames for poll */
|
||||
size_t period_ptr; /* actual write pointer to period */
|
||||
unsigned int periods;
|
||||
size_t buffer_bytes; /* requested buffer size */
|
||||
size_t bytes; /* total # bytes processed */
|
||||
size_t mmap_bytes;
|
||||
char *buffer; /* vmallocated period */
|
||||
size_t buffer_used; /* used length from period buffer */
|
||||
struct mutex params_lock;
|
||||
#ifdef CONFIG_SND_PCM_OSS_PLUGINS
|
||||
struct snd_pcm_plugin *plugin_first;
|
||||
struct snd_pcm_plugin *plugin_last;
|
||||
#endif
|
||||
unsigned int prev_hw_ptr_interrupt;
|
||||
};
|
||||
|
||||
struct snd_pcm_oss_file {
|
||||
struct snd_pcm_substream *streams[2];
|
||||
};
|
||||
|
||||
struct snd_pcm_oss_substream {
|
||||
unsigned oss: 1; /* oss mode */
|
||||
struct snd_pcm_oss_setup setup; /* active setup */
|
||||
};
|
||||
|
||||
struct snd_pcm_oss_stream {
|
||||
struct snd_pcm_oss_setup *setup_list; /* setup list */
|
||||
struct mutex setup_mutex;
|
||||
#ifdef CONFIG_SND_VERBOSE_PROCFS
|
||||
struct snd_info_entry *proc_entry;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct snd_pcm_oss {
|
||||
int reg;
|
||||
unsigned int reg_mask;
|
||||
};
|
||||
|
||||
#endif /* __SOUND_PCM_OSS_H */
|
||||
341
include/sound/pcm_params.h
Normal file
341
include/sound/pcm_params.h
Normal file
@@ -0,0 +1,341 @@
|
||||
#ifndef __SOUND_PCM_PARAMS_H
|
||||
#define __SOUND_PCM_PARAMS_H
|
||||
|
||||
/*
|
||||
* PCM params helpers
|
||||
* Copyright (c) by Abramo Bagnara <abramo@alsa-project.org>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm,
|
||||
struct snd_pcm_hw_params *params,
|
||||
snd_pcm_hw_param_t var, int *dir);
|
||||
int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm,
|
||||
struct snd_pcm_hw_params *params,
|
||||
snd_pcm_hw_param_t var, int *dir);
|
||||
int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params,
|
||||
snd_pcm_hw_param_t var, int *dir);
|
||||
|
||||
#define SNDRV_MASK_BITS 64 /* we use so far 64bits only */
|
||||
#define SNDRV_MASK_SIZE (SNDRV_MASK_BITS / 32)
|
||||
#define MASK_OFS(i) ((i) >> 5)
|
||||
#define MASK_BIT(i) (1U << ((i) & 31))
|
||||
|
||||
static inline unsigned int ld2(u_int32_t v)
|
||||
{
|
||||
unsigned r = 0;
|
||||
|
||||
if (v >= 0x10000) {
|
||||
v >>= 16;
|
||||
r += 16;
|
||||
}
|
||||
if (v >= 0x100) {
|
||||
v >>= 8;
|
||||
r += 8;
|
||||
}
|
||||
if (v >= 0x10) {
|
||||
v >>= 4;
|
||||
r += 4;
|
||||
}
|
||||
if (v >= 4) {
|
||||
v >>= 2;
|
||||
r += 2;
|
||||
}
|
||||
if (v >= 2)
|
||||
r++;
|
||||
return r;
|
||||
}
|
||||
|
||||
static inline size_t snd_mask_sizeof(void)
|
||||
{
|
||||
return sizeof(struct snd_mask);
|
||||
}
|
||||
|
||||
static inline void snd_mask_none(struct snd_mask *mask)
|
||||
{
|
||||
memset(mask, 0, sizeof(*mask));
|
||||
}
|
||||
|
||||
static inline void snd_mask_any(struct snd_mask *mask)
|
||||
{
|
||||
memset(mask, 0xff, SNDRV_MASK_SIZE * sizeof(u_int32_t));
|
||||
}
|
||||
|
||||
static inline int snd_mask_empty(const struct snd_mask *mask)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < SNDRV_MASK_SIZE; i++)
|
||||
if (mask->bits[i])
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline unsigned int snd_mask_min(const struct snd_mask *mask)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < SNDRV_MASK_SIZE; i++) {
|
||||
if (mask->bits[i])
|
||||
return ffs(mask->bits[i]) - 1 + (i << 5);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned int snd_mask_max(const struct snd_mask *mask)
|
||||
{
|
||||
int i;
|
||||
for (i = SNDRV_MASK_SIZE - 1; i >= 0; i--) {
|
||||
if (mask->bits[i])
|
||||
return ld2(mask->bits[i]) + (i << 5);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void snd_mask_set(struct snd_mask *mask, unsigned int val)
|
||||
{
|
||||
mask->bits[MASK_OFS(val)] |= MASK_BIT(val);
|
||||
}
|
||||
|
||||
static inline void snd_mask_reset(struct snd_mask *mask, unsigned int val)
|
||||
{
|
||||
mask->bits[MASK_OFS(val)] &= ~MASK_BIT(val);
|
||||
}
|
||||
|
||||
static inline void snd_mask_set_range(struct snd_mask *mask,
|
||||
unsigned int from, unsigned int to)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = from; i <= to; i++)
|
||||
mask->bits[MASK_OFS(i)] |= MASK_BIT(i);
|
||||
}
|
||||
|
||||
static inline void snd_mask_reset_range(struct snd_mask *mask,
|
||||
unsigned int from, unsigned int to)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = from; i <= to; i++)
|
||||
mask->bits[MASK_OFS(i)] &= ~MASK_BIT(i);
|
||||
}
|
||||
|
||||
static inline void snd_mask_leave(struct snd_mask *mask, unsigned int val)
|
||||
{
|
||||
unsigned int v;
|
||||
v = mask->bits[MASK_OFS(val)] & MASK_BIT(val);
|
||||
snd_mask_none(mask);
|
||||
mask->bits[MASK_OFS(val)] = v;
|
||||
}
|
||||
|
||||
static 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];
|
||||
}
|
||||
|
||||
static 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));
|
||||
}
|
||||
|
||||
static inline void snd_mask_copy(struct snd_mask *mask,
|
||||
const struct snd_mask *v)
|
||||
{
|
||||
*mask = *v;
|
||||
}
|
||||
|
||||
static inline int snd_mask_test(const struct snd_mask *mask, unsigned int val)
|
||||
{
|
||||
return mask->bits[MASK_OFS(val)] & MASK_BIT(val);
|
||||
}
|
||||
|
||||
static inline int snd_mask_single(const struct snd_mask *mask)
|
||||
{
|
||||
int i, c = 0;
|
||||
for (i = 0; i < SNDRV_MASK_SIZE; i++) {
|
||||
if (! mask->bits[i])
|
||||
continue;
|
||||
if (mask->bits[i] & (mask->bits[i] - 1))
|
||||
return 0;
|
||||
if (c)
|
||||
return 0;
|
||||
c++;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int snd_mask_refine(struct snd_mask *mask,
|
||||
const struct snd_mask *v)
|
||||
{
|
||||
struct snd_mask old;
|
||||
snd_mask_copy(&old, mask);
|
||||
snd_mask_intersect(mask, v);
|
||||
if (snd_mask_empty(mask))
|
||||
return -EINVAL;
|
||||
return !snd_mask_eq(mask, &old);
|
||||
}
|
||||
|
||||
static inline int snd_mask_refine_first(struct snd_mask *mask)
|
||||
{
|
||||
if (snd_mask_single(mask))
|
||||
return 0;
|
||||
snd_mask_leave(mask, snd_mask_min(mask));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int snd_mask_refine_last(struct snd_mask *mask)
|
||||
{
|
||||
if (snd_mask_single(mask))
|
||||
return 0;
|
||||
snd_mask_leave(mask, snd_mask_max(mask));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int snd_mask_refine_min(struct snd_mask *mask, unsigned int val)
|
||||
{
|
||||
if (snd_mask_min(mask) >= val)
|
||||
return 0;
|
||||
snd_mask_reset_range(mask, 0, val - 1);
|
||||
if (snd_mask_empty(mask))
|
||||
return -EINVAL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int snd_mask_refine_max(struct snd_mask *mask, unsigned int val)
|
||||
{
|
||||
if (snd_mask_max(mask) <= val)
|
||||
return 0;
|
||||
snd_mask_reset_range(mask, val + 1, SNDRV_MASK_BITS);
|
||||
if (snd_mask_empty(mask))
|
||||
return -EINVAL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int snd_mask_refine_set(struct snd_mask *mask, unsigned int val)
|
||||
{
|
||||
int changed;
|
||||
changed = !snd_mask_single(mask);
|
||||
snd_mask_leave(mask, val);
|
||||
if (snd_mask_empty(mask))
|
||||
return -EINVAL;
|
||||
return changed;
|
||||
}
|
||||
|
||||
static inline int snd_mask_value(const struct snd_mask *mask)
|
||||
{
|
||||
return snd_mask_min(mask);
|
||||
}
|
||||
|
||||
static inline void snd_interval_any(struct snd_interval *i)
|
||||
{
|
||||
i->min = 0;
|
||||
i->openmin = 0;
|
||||
i->max = UINT_MAX;
|
||||
i->openmax = 0;
|
||||
i->integer = 0;
|
||||
i->empty = 0;
|
||||
}
|
||||
|
||||
static inline void snd_interval_none(struct snd_interval *i)
|
||||
{
|
||||
i->empty = 1;
|
||||
}
|
||||
|
||||
static inline int snd_interval_checkempty(const struct snd_interval *i)
|
||||
{
|
||||
return (i->min > i->max ||
|
||||
(i->min == i->max && (i->openmin || i->openmax)));
|
||||
}
|
||||
|
||||
static inline int snd_interval_empty(const struct snd_interval *i)
|
||||
{
|
||||
return i->empty;
|
||||
}
|
||||
|
||||
static inline int snd_interval_single(const struct snd_interval *i)
|
||||
{
|
||||
return (i->min == i->max ||
|
||||
(i->min + 1 == i->max && i->openmax));
|
||||
}
|
||||
|
||||
static inline int snd_interval_value(const struct snd_interval *i)
|
||||
{
|
||||
return i->min;
|
||||
}
|
||||
|
||||
static inline int snd_interval_min(const struct snd_interval *i)
|
||||
{
|
||||
return i->min;
|
||||
}
|
||||
|
||||
static inline int snd_interval_max(const struct snd_interval *i)
|
||||
{
|
||||
unsigned int v;
|
||||
v = i->max;
|
||||
if (i->openmax)
|
||||
v--;
|
||||
return v;
|
||||
}
|
||||
|
||||
static 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)));
|
||||
}
|
||||
|
||||
static inline void snd_interval_copy(struct snd_interval *d, const struct snd_interval *s)
|
||||
{
|
||||
*d = *s;
|
||||
}
|
||||
|
||||
static inline int snd_interval_setinteger(struct snd_interval *i)
|
||||
{
|
||||
if (i->integer)
|
||||
return 0;
|
||||
if (i->openmin && i->openmax && i->min == i->max)
|
||||
return -EINVAL;
|
||||
i->integer = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int snd_interval_eq(const struct snd_interval *i1, const struct snd_interval *i2)
|
||||
{
|
||||
if (i1->empty)
|
||||
return i2->empty;
|
||||
if (i2->empty)
|
||||
return i1->empty;
|
||||
return i1->min == i2->min && i1->openmin == i2->openmin &&
|
||||
i1->max == i2->max && i1->openmax == i2->openmax;
|
||||
}
|
||||
|
||||
static inline unsigned int add(unsigned int a, unsigned int b)
|
||||
{
|
||||
if (a >= UINT_MAX - b)
|
||||
return UINT_MAX;
|
||||
return a + b;
|
||||
}
|
||||
|
||||
static inline unsigned int sub(unsigned int a, unsigned int b)
|
||||
{
|
||||
if (a > b)
|
||||
return a - b;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* __SOUND_PCM_PARAMS_H */
|
||||
|
||||
37
include/sound/pt2258.h
Normal file
37
include/sound/pt2258.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* ALSA Driver for the PT2258 volume controller.
|
||||
*
|
||||
* Copyright (c) 2006 Jochen Voss <voss@seehuhn.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_PT2258_H
|
||||
#define __SOUND_PT2258_H
|
||||
|
||||
struct snd_pt2258 {
|
||||
struct snd_card *card;
|
||||
struct snd_i2c_bus *i2c_bus;
|
||||
struct snd_i2c_device *i2c_dev;
|
||||
|
||||
unsigned char volume[6];
|
||||
int mute;
|
||||
};
|
||||
|
||||
extern int snd_pt2258_reset(struct snd_pt2258 *pt);
|
||||
extern int snd_pt2258_build_controls(struct snd_pt2258 *pt);
|
||||
|
||||
#endif /* __SOUND_PT2258_H */
|
||||
186
include/sound/rawmidi.h
Normal file
186
include/sound/rawmidi.h
Normal file
@@ -0,0 +1,186 @@
|
||||
#ifndef __SOUND_RAWMIDI_H
|
||||
#define __SOUND_RAWMIDI_H
|
||||
|
||||
/*
|
||||
* Abstract layer for MIDI v1.0 stream
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sound/asound.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
|
||||
#include "seq_device.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Raw MIDI interface
|
||||
*/
|
||||
|
||||
#define SNDRV_RAWMIDI_DEVICES 8
|
||||
|
||||
#define SNDRV_RAWMIDI_LFLG_OUTPUT (1<<0)
|
||||
#define SNDRV_RAWMIDI_LFLG_INPUT (1<<1)
|
||||
#define SNDRV_RAWMIDI_LFLG_OPEN (3<<0)
|
||||
#define SNDRV_RAWMIDI_LFLG_APPEND (1<<2)
|
||||
#define SNDRV_RAWMIDI_LFLG_NOOPENLOCK (1<<3)
|
||||
|
||||
struct snd_rawmidi;
|
||||
struct snd_rawmidi_substream;
|
||||
struct snd_seq_port_info;
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
struct snd_rawmidi_global_ops {
|
||||
int (*dev_register) (struct snd_rawmidi * rmidi);
|
||||
int (*dev_unregister) (struct snd_rawmidi * rmidi);
|
||||
void (*get_port_info)(struct snd_rawmidi *rmidi, int number,
|
||||
struct snd_seq_port_info *info);
|
||||
};
|
||||
|
||||
struct snd_rawmidi_runtime {
|
||||
unsigned int drain: 1, /* drain stage */
|
||||
oss: 1; /* OSS compatible mode */
|
||||
/* midi stream buffer */
|
||||
unsigned char *buffer; /* buffer for MIDI data */
|
||||
size_t buffer_size; /* size of buffer */
|
||||
size_t appl_ptr; /* application pointer */
|
||||
size_t hw_ptr; /* hardware pointer */
|
||||
size_t avail_min; /* min avail for wakeup */
|
||||
size_t avail; /* max used buffer for wakeup */
|
||||
size_t xruns; /* over/underruns counter */
|
||||
/* misc */
|
||||
spinlock_t lock;
|
||||
wait_queue_head_t sleep;
|
||||
/* event handler (new bytes, input only) */
|
||||
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)(struct snd_rawmidi_substream *substream);
|
||||
};
|
||||
|
||||
struct snd_rawmidi_substream {
|
||||
struct list_head list; /* list of all substream for given stream */
|
||||
int stream; /* direction */
|
||||
int number; /* substream number */
|
||||
unsigned int opened: 1, /* open flag */
|
||||
append: 1, /* append flag (merge more streams) */
|
||||
active_sensing: 1; /* send active sensing when close */
|
||||
int use_count; /* use counter (for output) */
|
||||
size_t bytes;
|
||||
struct snd_rawmidi *rmidi;
|
||||
struct snd_rawmidi_str *pstr;
|
||||
char name[32];
|
||||
struct snd_rawmidi_runtime *runtime;
|
||||
/* hardware layer */
|
||||
struct snd_rawmidi_ops *ops;
|
||||
};
|
||||
|
||||
struct snd_rawmidi_file {
|
||||
struct snd_rawmidi *rmidi;
|
||||
struct snd_rawmidi_substream *input;
|
||||
struct snd_rawmidi_substream *output;
|
||||
};
|
||||
|
||||
struct snd_rawmidi_str {
|
||||
unsigned int substream_count;
|
||||
unsigned int substream_opened;
|
||||
struct list_head substreams;
|
||||
};
|
||||
|
||||
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];
|
||||
char name[80];
|
||||
|
||||
#ifdef CONFIG_SND_OSSEMUL
|
||||
int ossreg;
|
||||
#endif
|
||||
|
||||
struct snd_rawmidi_global_ops *ops;
|
||||
|
||||
struct snd_rawmidi_str streams[2];
|
||||
|
||||
void *private_data;
|
||||
void (*private_free) (struct snd_rawmidi *rmidi);
|
||||
|
||||
struct mutex open_mutex;
|
||||
wait_queue_head_t open_wait;
|
||||
|
||||
struct snd_info_entry *dev;
|
||||
struct snd_info_entry *proc_entry;
|
||||
|
||||
#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
|
||||
struct snd_seq_device *seq_dev;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* main rawmidi functions */
|
||||
|
||||
int snd_rawmidi_new(struct snd_card *card, char *id, int device,
|
||||
int output_count, int input_count,
|
||||
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(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(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 */
|
||||
367
include/sound/sb.h
Normal file
367
include/sound/sb.h
Normal file
@@ -0,0 +1,367 @@
|
||||
#ifndef __SOUND_SB_H
|
||||
#define __SOUND_SB_H
|
||||
|
||||
/*
|
||||
* Header file for SoundBlaster cards
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "pcm.h"
|
||||
#include "rawmidi.h"
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
enum sb_hw_type {
|
||||
SB_HW_AUTO,
|
||||
SB_HW_10,
|
||||
SB_HW_20,
|
||||
SB_HW_201,
|
||||
SB_HW_PRO,
|
||||
SB_HW_16,
|
||||
SB_HW_16CSP, /* SB16 with CSP chip */
|
||||
SB_HW_ALS100, /* Avance Logic ALS100 chip */
|
||||
SB_HW_ALS4000, /* Avance Logic ALS4000 chip */
|
||||
SB_HW_DT019X, /* Diamond Tech. DT-019X / Avance Logic ALS-007 */
|
||||
SB_HW_CS5530, /* Cyrix/NatSemi 5530 VSA1 */
|
||||
};
|
||||
|
||||
#define SB_OPEN_PCM 0x01
|
||||
#define SB_OPEN_MIDI_INPUT 0x02
|
||||
#define SB_OPEN_MIDI_OUTPUT 0x04
|
||||
#define SB_OPEN_MIDI_INPUT_TRIGGER 0x08
|
||||
#define SB_OPEN_MIDI_OUTPUT_TRIGGER 0x10
|
||||
|
||||
#define SB_MODE_HALT 0x00
|
||||
#define SB_MODE_PLAYBACK_8 0x01
|
||||
#define SB_MODE_PLAYBACK_16 0x02
|
||||
#define SB_MODE_PLAYBACK (SB_MODE_PLAYBACK_8 | SB_MODE_PLAYBACK_16)
|
||||
#define SB_MODE_CAPTURE_8 0x04
|
||||
#define SB_MODE_CAPTURE_16 0x08
|
||||
#define SB_MODE_CAPTURE (SB_MODE_CAPTURE_8 | SB_MODE_CAPTURE_16)
|
||||
|
||||
#define SB_RATE_LOCK_PLAYBACK 0x10
|
||||
#define SB_RATE_LOCK_CAPTURE 0x20
|
||||
#define SB_RATE_LOCK (SB_RATE_LOCK_PLAYBACK | SB_RATE_LOCK_CAPTURE)
|
||||
|
||||
#define SB_MPU_INPUT 1
|
||||
|
||||
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+ */
|
||||
int irq; /* IRQ number of DSP chip */
|
||||
int dma8; /* 8-bit DMA */
|
||||
int dma16; /* 16-bit DMA */
|
||||
unsigned short version; /* version of DSP chip */
|
||||
enum sb_hw_type hardware; /* see to SB_HW_XXXX */
|
||||
|
||||
unsigned long alt_port; /* alternate port (ALS4000) */
|
||||
struct pci_dev *pci; /* ALS4000 */
|
||||
|
||||
unsigned int open; /* see to SB_OPEN_XXXX for sb8 */
|
||||
/* also SNDRV_SB_CSP_MODE_XXX for sb16_csp */
|
||||
unsigned int mode; /* current mode of stream */
|
||||
unsigned int force_mode16; /* force 16-bit mode of streams */
|
||||
unsigned int locked_rate; /* sb16 duplex */
|
||||
unsigned int playback_format;
|
||||
unsigned int capture_format;
|
||||
struct timer_list midi_timer;
|
||||
unsigned int p_dma_size;
|
||||
unsigned int p_period_size;
|
||||
unsigned int c_dma_size;
|
||||
unsigned int c_period_size;
|
||||
|
||||
spinlock_t mixer_lock;
|
||||
|
||||
char name[32];
|
||||
|
||||
void *csp; /* used only when CONFIG_SND_SB16_CSP is set */
|
||||
|
||||
struct snd_card *card;
|
||||
struct snd_pcm *pcm;
|
||||
struct snd_pcm_substream *playback_substream;
|
||||
struct snd_pcm_substream *capture_substream;
|
||||
|
||||
struct snd_rawmidi *rmidi;
|
||||
struct snd_rawmidi_substream *midi_substream_input;
|
||||
struct snd_rawmidi_substream *midi_substream_output;
|
||||
irq_handler_t rmidi_callback;
|
||||
|
||||
spinlock_t reg_lock;
|
||||
spinlock_t open_lock;
|
||||
spinlock_t midi_input_lock;
|
||||
|
||||
struct snd_info_entry *proc_entry;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
unsigned char saved_regs[0x20];
|
||||
#endif
|
||||
};
|
||||
|
||||
/* I/O ports */
|
||||
|
||||
#define SBP(chip, x) ((chip)->port + s_b_SB_##x)
|
||||
#define SBP1(port, x) ((port) + s_b_SB_##x)
|
||||
|
||||
#define s_b_SB_RESET 0x6
|
||||
#define s_b_SB_READ 0xa
|
||||
#define s_b_SB_WRITE 0xc
|
||||
#define s_b_SB_COMMAND 0xc
|
||||
#define s_b_SB_STATUS 0xc
|
||||
#define s_b_SB_DATA_AVAIL 0xe
|
||||
#define s_b_SB_DATA_AVAIL_16 0xf
|
||||
#define s_b_SB_MIXER_ADDR 0x4
|
||||
#define s_b_SB_MIXER_DATA 0x5
|
||||
#define s_b_SB_OPL3_LEFT 0x0
|
||||
#define s_b_SB_OPL3_RIGHT 0x2
|
||||
#define s_b_SB_OPL3_BOTH 0x8
|
||||
|
||||
#define SB_DSP_OUTPUT 0x14
|
||||
#define SB_DSP_INPUT 0x24
|
||||
#define SB_DSP_BLOCK_SIZE 0x48
|
||||
#define SB_DSP_HI_OUTPUT 0x91
|
||||
#define SB_DSP_HI_INPUT 0x99
|
||||
#define SB_DSP_LO_OUTPUT_AUTO 0x1c
|
||||
#define SB_DSP_LO_INPUT_AUTO 0x2c
|
||||
#define SB_DSP_HI_OUTPUT_AUTO 0x90
|
||||
#define SB_DSP_HI_INPUT_AUTO 0x98
|
||||
#define SB_DSP_IMMED_INT 0xf2
|
||||
#define SB_DSP_GET_VERSION 0xe1
|
||||
#define SB_DSP_SPEAKER_ON 0xd1
|
||||
#define SB_DSP_SPEAKER_OFF 0xd3
|
||||
#define SB_DSP_DMA8_OFF 0xd0
|
||||
#define SB_DSP_DMA8_ON 0xd4
|
||||
#define SB_DSP_DMA8_EXIT 0xda
|
||||
#define SB_DSP_DMA16_OFF 0xd5
|
||||
#define SB_DSP_DMA16_ON 0xd6
|
||||
#define SB_DSP_DMA16_EXIT 0xd9
|
||||
#define SB_DSP_SAMPLE_RATE 0x40
|
||||
#define SB_DSP_SAMPLE_RATE_OUT 0x41
|
||||
#define SB_DSP_SAMPLE_RATE_IN 0x42
|
||||
#define SB_DSP_MONO_8BIT 0xa0
|
||||
#define SB_DSP_MONO_16BIT 0xa4
|
||||
#define SB_DSP_STEREO_8BIT 0xa8
|
||||
#define SB_DSP_STEREO_16BIT 0xac
|
||||
|
||||
#define SB_DSP_MIDI_INPUT_IRQ 0x31
|
||||
#define SB_DSP_MIDI_UART_IRQ 0x35
|
||||
#define SB_DSP_MIDI_OUTPUT 0x38
|
||||
|
||||
#define SB_DSP4_OUT8_AI 0xc6
|
||||
#define SB_DSP4_IN8_AI 0xce
|
||||
#define SB_DSP4_OUT16_AI 0xb6
|
||||
#define SB_DSP4_IN16_AI 0xbe
|
||||
#define SB_DSP4_MODE_UNS_MONO 0x00
|
||||
#define SB_DSP4_MODE_SIGN_MONO 0x10
|
||||
#define SB_DSP4_MODE_UNS_STEREO 0x20
|
||||
#define SB_DSP4_MODE_SIGN_STEREO 0x30
|
||||
|
||||
#define SB_DSP4_OUTPUT 0x3c
|
||||
#define SB_DSP4_INPUT_LEFT 0x3d
|
||||
#define SB_DSP4_INPUT_RIGHT 0x3e
|
||||
|
||||
/* registers for SB 2.0 mixer */
|
||||
#define SB_DSP20_MASTER_DEV 0x02
|
||||
#define SB_DSP20_PCM_DEV 0x0A
|
||||
#define SB_DSP20_CD_DEV 0x08
|
||||
#define SB_DSP20_FM_DEV 0x06
|
||||
|
||||
/* registers for SB PRO mixer */
|
||||
#define SB_DSP_MASTER_DEV 0x22
|
||||
#define SB_DSP_PCM_DEV 0x04
|
||||
#define SB_DSP_LINE_DEV 0x2e
|
||||
#define SB_DSP_CD_DEV 0x28
|
||||
#define SB_DSP_FM_DEV 0x26
|
||||
#define SB_DSP_MIC_DEV 0x0a
|
||||
#define SB_DSP_CAPTURE_SOURCE 0x0c
|
||||
#define SB_DSP_CAPTURE_FILT 0x0c
|
||||
#define SB_DSP_PLAYBACK_FILT 0x0e
|
||||
#define SB_DSP_STEREO_SW 0x0e
|
||||
|
||||
#define SB_DSP_MIXS_MIC0 0x00 /* same as MIC */
|
||||
#define SB_DSP_MIXS_CD 0x01
|
||||
#define SB_DSP_MIXS_MIC 0x02
|
||||
#define SB_DSP_MIXS_LINE 0x03
|
||||
|
||||
/* registers (only for left channel) for SB 16 mixer */
|
||||
#define SB_DSP4_MASTER_DEV 0x30
|
||||
#define SB_DSP4_BASS_DEV 0x46
|
||||
#define SB_DSP4_TREBLE_DEV 0x44
|
||||
#define SB_DSP4_SYNTH_DEV 0x34
|
||||
#define SB_DSP4_PCM_DEV 0x32
|
||||
#define SB_DSP4_SPEAKER_DEV 0x3b
|
||||
#define SB_DSP4_LINE_DEV 0x38
|
||||
#define SB_DSP4_MIC_DEV 0x3a
|
||||
#define SB_DSP4_OUTPUT_SW 0x3c
|
||||
#define SB_DSP4_CD_DEV 0x36
|
||||
#define SB_DSP4_IGAIN_DEV 0x3f
|
||||
#define SB_DSP4_OGAIN_DEV 0x41
|
||||
#define SB_DSP4_MIC_AGC 0x43
|
||||
|
||||
/* additional registers for SB 16 mixer */
|
||||
#define SB_DSP4_IRQSETUP 0x80
|
||||
#define SB_DSP4_DMASETUP 0x81
|
||||
#define SB_DSP4_IRQSTATUS 0x82
|
||||
#define SB_DSP4_MPUSETUP 0x84
|
||||
|
||||
#define SB_DSP4_3DSE 0x90
|
||||
|
||||
/* Registers for DT-019x / ALS-007 mixer */
|
||||
#define SB_DT019X_MASTER_DEV 0x62
|
||||
#define SB_DT019X_PCM_DEV 0x64
|
||||
#define SB_DT019X_SYNTH_DEV 0x66
|
||||
#define SB_DT019X_CD_DEV 0x68
|
||||
#define SB_DT019X_MIC_DEV 0x6a
|
||||
#define SB_DT019X_SPKR_DEV 0x6a
|
||||
#define SB_DT019X_LINE_DEV 0x6e
|
||||
#define SB_DT019X_OUTPUT_SW2 0x4c
|
||||
#define SB_DT019X_CAPTURE_SW 0x6c
|
||||
|
||||
#define SB_DT019X_CAP_CD 0x02
|
||||
#define SB_DT019X_CAP_MIC 0x04
|
||||
#define SB_DT019X_CAP_LINE 0x06
|
||||
#define SB_DT019X_CAP_SYNTH 0x07
|
||||
#define SB_DT019X_CAP_MAIN 0x07
|
||||
|
||||
#define SB_ALS4000_MONO_IO_CTRL 0x4b
|
||||
#define SB_ALS4000_MIC_IN_GAIN 0x4d
|
||||
#define SB_ALS4000_FMDAC 0x4f
|
||||
#define SB_ALS4000_3D_SND_FX 0x50
|
||||
#define SB_ALS4000_3D_TIME_DELAY 0x51
|
||||
#define SB_ALS4000_3D_AUTO_MUTE 0x52
|
||||
#define SB_ALS4000_QSOUND 0xdb
|
||||
|
||||
/* IRQ setting bitmap */
|
||||
#define SB_IRQSETUP_IRQ9 0x01
|
||||
#define SB_IRQSETUP_IRQ5 0x02
|
||||
#define SB_IRQSETUP_IRQ7 0x04
|
||||
#define SB_IRQSETUP_IRQ10 0x08
|
||||
|
||||
/* IRQ types */
|
||||
#define SB_IRQTYPE_8BIT 0x01
|
||||
#define SB_IRQTYPE_16BIT 0x02
|
||||
#define SB_IRQTYPE_MPUIN 0x04
|
||||
|
||||
/* DMA setting bitmap */
|
||||
#define SB_DMASETUP_DMA0 0x01
|
||||
#define SB_DMASETUP_DMA1 0x02
|
||||
#define SB_DMASETUP_DMA3 0x08
|
||||
#define SB_DMASETUP_DMA5 0x20
|
||||
#define SB_DMASETUP_DMA6 0x40
|
||||
#define SB_DMASETUP_DMA7 0x80
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
static inline void snd_sb_ack_8bit(struct snd_sb *chip)
|
||||
{
|
||||
inb(SBP(chip, DATA_AVAIL));
|
||||
}
|
||||
|
||||
static inline void snd_sb_ack_16bit(struct snd_sb *chip)
|
||||
{
|
||||
inb(SBP(chip, DATA_AVAIL_16));
|
||||
}
|
||||
|
||||
/* sb_common.c */
|
||||
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,
|
||||
irq_handler_t irq_handler,
|
||||
int dma8, int dma16,
|
||||
unsigned short hardware,
|
||||
struct snd_sb **r_chip);
|
||||
/* sb_mixer.c */
|
||||
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(struct snd_sb *chip, int device, struct snd_pcm ** rpcm);
|
||||
/* sb8.c */
|
||||
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(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(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);
|
||||
|
||||
/* exported mixer stuffs */
|
||||
enum {
|
||||
SB_MIX_SINGLE,
|
||||
SB_MIX_DOUBLE,
|
||||
SB_MIX_INPUT_SW,
|
||||
SB_MIX_CAPTURE_PRO,
|
||||
SB_MIX_CAPTURE_DT019X
|
||||
};
|
||||
|
||||
#define SB_MIXVAL_DOUBLE(left_reg, right_reg, left_shift, right_shift, mask) \
|
||||
((left_reg) | ((right_reg) << 8) | ((left_shift) << 16) | ((right_shift) << 19) | ((mask) << 24))
|
||||
#define SB_MIXVAL_SINGLE(reg, shift, mask) \
|
||||
((reg) | ((shift) << 16) | ((mask) << 24))
|
||||
#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(struct snd_sb *chip, const char *name, int index, int type, unsigned long value);
|
||||
|
||||
/* for ease of use */
|
||||
struct sbmix_elem {
|
||||
const char *name;
|
||||
int type;
|
||||
unsigned long private_value;
|
||||
};
|
||||
|
||||
#define SB_SINGLE(xname, reg, shift, mask) \
|
||||
{ .name = xname, \
|
||||
.type = SB_MIX_SINGLE, \
|
||||
.private_value = SB_MIXVAL_SINGLE(reg, shift, mask) }
|
||||
|
||||
#define SB_DOUBLE(xname, left_reg, right_reg, left_shift, right_shift, mask) \
|
||||
{ .name = xname, \
|
||||
.type = SB_MIX_DOUBLE, \
|
||||
.private_value = SB_MIXVAL_DOUBLE(left_reg, right_reg, left_shift, right_shift, mask) }
|
||||
|
||||
#define SB16_INPUT_SW(xname, reg1, reg2, left_shift, right_shift) \
|
||||
{ .name = xname, \
|
||||
.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(struct snd_sb *chip, const struct sbmix_elem *c)
|
||||
{
|
||||
return snd_sbmixer_add_ctl(chip, c->name, 0, c->type, c->private_value);
|
||||
}
|
||||
|
||||
#endif /* __SOUND_SB_H */
|
||||
181
include/sound/sb16_csp.h
Normal file
181
include/sound/sb16_csp.h
Normal file
@@ -0,0 +1,181 @@
|
||||
#ifndef __SOUND_SB16_CSP_H
|
||||
#define __SOUND_SB16_CSP_H
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si>
|
||||
* Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* SB16ASP/AWE32 CSP control
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/* CSP modes */
|
||||
#define SNDRV_SB_CSP_MODE_NONE 0x00
|
||||
#define SNDRV_SB_CSP_MODE_DSP_READ 0x01 /* Record from DSP */
|
||||
#define SNDRV_SB_CSP_MODE_DSP_WRITE 0x02 /* Play to DSP */
|
||||
#define SNDRV_SB_CSP_MODE_QSOUND 0x04 /* QSound */
|
||||
|
||||
/* CSP load flags */
|
||||
#define SNDRV_SB_CSP_LOAD_FROMUSER 0x01
|
||||
#define SNDRV_SB_CSP_LOAD_INITBLOCK 0x02
|
||||
|
||||
/* CSP sample width */
|
||||
#define SNDRV_SB_CSP_SAMPLE_8BIT 0x01
|
||||
#define SNDRV_SB_CSP_SAMPLE_16BIT 0x02
|
||||
|
||||
/* CSP channels */
|
||||
#define SNDRV_SB_CSP_MONO 0x01
|
||||
#define SNDRV_SB_CSP_STEREO 0x02
|
||||
|
||||
/* CSP rates */
|
||||
#define SNDRV_SB_CSP_RATE_8000 0x01
|
||||
#define SNDRV_SB_CSP_RATE_11025 0x02
|
||||
#define SNDRV_SB_CSP_RATE_22050 0x04
|
||||
#define SNDRV_SB_CSP_RATE_44100 0x08
|
||||
#define SNDRV_SB_CSP_RATE_ALL 0x0f
|
||||
|
||||
/* CSP running state */
|
||||
#define SNDRV_SB_CSP_ST_IDLE 0x00
|
||||
#define SNDRV_SB_CSP_ST_LOADED 0x01
|
||||
#define SNDRV_SB_CSP_ST_RUNNING 0x02
|
||||
#define SNDRV_SB_CSP_ST_PAUSED 0x04
|
||||
#define SNDRV_SB_CSP_ST_AUTO 0x08
|
||||
#define SNDRV_SB_CSP_ST_QSOUND 0x10
|
||||
|
||||
/* maximum QSound value (180 degrees right) */
|
||||
#define SNDRV_SB_CSP_QSOUND_MAX_RIGHT 0x20
|
||||
|
||||
/* maximum microcode RIFF file size */
|
||||
#define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE 0x3000
|
||||
|
||||
/* microcode header */
|
||||
struct snd_sb_csp_mc_header {
|
||||
char codec_name[16]; /* id name of codec */
|
||||
unsigned short func_req; /* requested function */
|
||||
};
|
||||
|
||||
/* microcode to be loaded */
|
||||
struct snd_sb_csp_microcode {
|
||||
struct snd_sb_csp_mc_header info;
|
||||
unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE];
|
||||
};
|
||||
|
||||
/* start CSP with sample_width in mono/stereo */
|
||||
struct snd_sb_csp_start {
|
||||
int sample_width; /* sample width, look above */
|
||||
int channels; /* channels, look above */
|
||||
};
|
||||
|
||||
/* CSP information */
|
||||
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 */
|
||||
unsigned short acc_channels; /* accepted channels */
|
||||
unsigned short acc_width; /* accepted sample width */
|
||||
unsigned short acc_rates; /* accepted sample rates */
|
||||
unsigned short csp_mode; /* CSP mode, see above */
|
||||
unsigned short run_channels; /* current channels */
|
||||
unsigned short run_width; /* current sample width */
|
||||
unsigned short version; /* version id: 0x10 - 0x1f */
|
||||
unsigned short state; /* state bits */
|
||||
};
|
||||
|
||||
/* HWDEP controls */
|
||||
/* get CSP information */
|
||||
#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, 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, struct snd_sb_csp_start)
|
||||
/* stop CSP */
|
||||
#define SNDRV_SB_CSP_IOCTL_STOP _IO('H', 0x14)
|
||||
/* pause CSP and DMA transfer */
|
||||
#define SNDRV_SB_CSP_IOCTL_PAUSE _IO('H', 0x15)
|
||||
/* restart CSP and DMA transfer */
|
||||
#define SNDRV_SB_CSP_IOCTL_RESTART _IO('H', 0x16)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include "sb.h"
|
||||
#include "hwdep.h"
|
||||
#include <linux/firmware.h>
|
||||
|
||||
struct snd_sb_csp;
|
||||
|
||||
/* indices for the known CSP programs */
|
||||
enum {
|
||||
CSP_PROGRAM_MULAW,
|
||||
CSP_PROGRAM_ALAW,
|
||||
CSP_PROGRAM_ADPCM_INIT,
|
||||
CSP_PROGRAM_ADPCM_PLAYBACK,
|
||||
CSP_PROGRAM_ADPCM_CAPTURE,
|
||||
|
||||
CSP_PROGRAM_COUNT
|
||||
};
|
||||
|
||||
/*
|
||||
* CSP operators
|
||||
*/
|
||||
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 {
|
||||
struct snd_sb *chip; /* SB16 DSP */
|
||||
int used; /* usage flag - exclusive */
|
||||
char codec_name[16]; /* name of codec */
|
||||
unsigned short func_nr; /* function number */
|
||||
unsigned int acc_format; /* accepted PCM formats */
|
||||
int acc_channels; /* accepted channels */
|
||||
int acc_width; /* accepted sample width */
|
||||
int acc_rates; /* accepted sample rates */
|
||||
int mode; /* MODE */
|
||||
int run_channels; /* current CSP channels */
|
||||
int run_width; /* current sample width */
|
||||
int version; /* CSP version (0x10 - 0x1f) */
|
||||
int running; /* running state */
|
||||
|
||||
struct snd_sb_csp_ops ops; /* operators */
|
||||
|
||||
spinlock_t q_lock; /* locking */
|
||||
int q_enabled; /* enabled flag */
|
||||
int qpos_left; /* left position */
|
||||
int qpos_right; /* right position */
|
||||
int qpos_changed; /* position changed flag */
|
||||
|
||||
struct snd_kcontrol *qsound_switch;
|
||||
struct snd_kcontrol *qsound_space;
|
||||
|
||||
struct mutex access_mutex; /* locking */
|
||||
|
||||
const struct firmware *csp_programs[CSP_PROGRAM_COUNT];
|
||||
};
|
||||
|
||||
int snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep);
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_SB16_CSP */
|
||||
84
include/sound/seq_device.h
Normal file
84
include/sound/seq_device.h
Normal file
@@ -0,0 +1,84 @@
|
||||
#ifndef __SOUND_SEQ_DEVICE_H
|
||||
#define __SOUND_SEQ_DEVICE_H
|
||||
|
||||
/*
|
||||
* ALSA sequencer device management
|
||||
* Copyright (c) 1999 by Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* registered device information
|
||||
*/
|
||||
|
||||
#define ID_LEN 32
|
||||
|
||||
/* status flag */
|
||||
#define SNDRV_SEQ_DEVICE_FREE 0
|
||||
#define SNDRV_SEQ_DEVICE_REGISTERED 1
|
||||
|
||||
struct snd_seq_device {
|
||||
/* device info */
|
||||
struct snd_card *card; /* sound card */
|
||||
int device; /* device number */
|
||||
char id[ID_LEN]; /* driver id */
|
||||
char name[80]; /* device name */
|
||||
int argsize; /* size of the argument */
|
||||
void *driver_data; /* private data for driver */
|
||||
int status; /* flag - read only */
|
||||
void *private_data; /* private data for the caller */
|
||||
void (*private_free)(struct snd_seq_device *device);
|
||||
struct list_head list; /* link to next device */
|
||||
};
|
||||
|
||||
|
||||
/* driver operators
|
||||
* init_device:
|
||||
* Initialize the device with given parameters.
|
||||
* Typically,
|
||||
* 1. call snd_hwdep_new
|
||||
* 2. allocate private data and initialize it
|
||||
* 3. call snd_hwdep_register
|
||||
* 4. store the instance to dev->driver_data pointer.
|
||||
*
|
||||
* free_device:
|
||||
* Release the private data.
|
||||
* Typically, call snd_device_free(dev->card, dev->driver_data)
|
||||
*/
|
||||
struct snd_seq_dev_ops {
|
||||
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(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(struct snd_seq_device))
|
||||
|
||||
|
||||
/*
|
||||
* id strings for generic devices
|
||||
*/
|
||||
#define SNDRV_SEQ_DEV_ID_MIDISYNTH "seq-midi"
|
||||
#define SNDRV_SEQ_DEV_ID_OPL3 "opl3-synth"
|
||||
|
||||
#endif /* __SOUND_SEQ_DEVICE_H */
|
||||
110
include/sound/seq_instr.h
Normal file
110
include/sound/seq_instr.h
Normal file
@@ -0,0 +1,110 @@
|
||||
#ifndef __SOUND_SEQ_INSTR_H
|
||||
#define __SOUND_SEQ_INSTR_H
|
||||
|
||||
/*
|
||||
* Main kernel header file for the ALSA sequencer
|
||||
* Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
#include "seq_kernel.h"
|
||||
|
||||
/* Instrument cluster */
|
||||
struct snd_seq_kcluster {
|
||||
snd_seq_instr_cluster_t cluster;
|
||||
char name[32];
|
||||
int priority;
|
||||
struct snd_seq_kcluster *next;
|
||||
};
|
||||
|
||||
/* return pointer to private data */
|
||||
#define KINSTR_DATA(kinstr) (void *)(((char *)kinstr) + sizeof(struct snd_seq_kinstr))
|
||||
|
||||
/* Instrument structure */
|
||||
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 */
|
||||
struct snd_seq_kinstr_ops *ops; /* operations */
|
||||
struct snd_seq_kinstr *next;
|
||||
};
|
||||
|
||||
#define SNDRV_SEQ_INSTR_HASH_SIZE 32
|
||||
|
||||
/* Instrument flags */
|
||||
#define SNDRV_SEQ_INSTR_FLG_DIRECT (1<<0) /* accept only direct events */
|
||||
|
||||
/* List of all instruments */
|
||||
struct snd_seq_kinstr_list {
|
||||
struct snd_seq_kinstr *hash[SNDRV_SEQ_INSTR_HASH_SIZE];
|
||||
int count; /* count of all instruments */
|
||||
|
||||
struct snd_seq_kcluster *chash[SNDRV_SEQ_INSTR_HASH_SIZE];
|
||||
int ccount; /* count of all clusters */
|
||||
|
||||
int owner; /* current owner of the instrument list */
|
||||
unsigned int flags;
|
||||
|
||||
spinlock_t lock;
|
||||
spinlock_t ops_lock;
|
||||
struct mutex ops_mutex;
|
||||
unsigned long ops_flags;
|
||||
};
|
||||
|
||||
#define SNDRV_SEQ_INSTR_NOTIFY_REMOVE 0
|
||||
#define SNDRV_SEQ_INSTR_NOTIFY_CHANGE 1
|
||||
|
||||
struct snd_seq_kinstr_ops {
|
||||
void *private_data;
|
||||
long add_len; /* additional length */
|
||||
char *instr_type;
|
||||
int (*info)(void *private_data, char *info_data, long len);
|
||||
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, struct snd_seq_kinstr *kinstr,
|
||||
char __user *instr_data, long len, int atomic, int cmd);
|
||||
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 */
|
||||
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);
|
||||
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);
|
||||
|
||||
#endif /* __SOUND_SEQ_INSTR_H */
|
||||
116
include/sound/seq_kernel.h
Normal file
116
include/sound/seq_kernel.h
Normal file
@@ -0,0 +1,116 @@
|
||||
#ifndef __SOUND_SEQ_KERNEL_H
|
||||
#define __SOUND_SEQ_KERNEL_H
|
||||
|
||||
/*
|
||||
* Main kernel header file for the ALSA sequencer
|
||||
* Copyright (c) 1998 by Frank van de Pol <fvdpol@coil.demon.nl>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
#include <linux/time.h>
|
||||
#include "asequencer.h"
|
||||
|
||||
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
|
||||
|
||||
/* maximum number of queues */
|
||||
#define SNDRV_SEQ_MAX_QUEUES 8
|
||||
|
||||
/* max number of concurrent clients */
|
||||
#define SNDRV_SEQ_MAX_CLIENTS 192
|
||||
|
||||
/* max number of concurrent ports */
|
||||
#define SNDRV_SEQ_MAX_PORTS 254
|
||||
|
||||
/* max number of events in memory pool */
|
||||
#define SNDRV_SEQ_MAX_EVENTS 2000
|
||||
|
||||
/* default number of events in memory chunk */
|
||||
#define SNDRV_SEQ_DEFAULT_CHUNK_EVENTS 64
|
||||
|
||||
/* default number of events in memory pool */
|
||||
#define SNDRV_SEQ_DEFAULT_EVENTS 500
|
||||
|
||||
/* max number of events in memory pool for one client (outqueue) */
|
||||
#define SNDRV_SEQ_MAX_CLIENT_EVENTS 2000
|
||||
|
||||
/* default number of events in memory pool for one client (outqueue) */
|
||||
#define SNDRV_SEQ_DEFAULT_CLIENT_EVENTS 200
|
||||
|
||||
/* max delivery path length */
|
||||
#define SNDRV_SEQ_MAX_HOPS 10
|
||||
|
||||
/* max size of event size */
|
||||
#define SNDRV_SEQ_MAX_EVENT_LEN 0x3fffffff
|
||||
|
||||
/* call-backs for kernel port */
|
||||
struct snd_seq_port_callback {
|
||||
struct module *owner;
|
||||
void *private_data;
|
||||
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 */
|
||||
/*...*/
|
||||
};
|
||||
|
||||
/* interface for kernel client */
|
||||
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 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, struct snd_seq_queue_tempo *tempo);
|
||||
|
||||
/* port callback routines */
|
||||
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, 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);
|
||||
|
||||
#ifdef CONFIG_KMOD
|
||||
void snd_seq_autoload_lock(void);
|
||||
void snd_seq_autoload_unlock(void);
|
||||
#else
|
||||
#define snd_seq_autoload_lock()
|
||||
#define snd_seq_autoload_unlock()
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_SEQ_KERNEL_H */
|
||||
197
include/sound/seq_midi_emul.h
Normal file
197
include/sound/seq_midi_emul.h
Normal file
@@ -0,0 +1,197 @@
|
||||
#ifndef __SOUND_SEQ_MIDI_EMUL_H
|
||||
#define __SOUND_SEQ_MIDI_EMUL_H
|
||||
|
||||
/*
|
||||
* Midi channel definition for optional channel management.
|
||||
*
|
||||
* Copyright (C) 1999 Steve Ratcliffe
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "seq_kernel.h"
|
||||
|
||||
/*
|
||||
* This structure is used to keep track of the current state on each
|
||||
* channel. All drivers for hardware that does not understand midi
|
||||
* directly will probably need to use this structure.
|
||||
*/
|
||||
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 */
|
||||
int port; /* The port associated with this channel */
|
||||
|
||||
unsigned char midi_mode; /* GM, GS, XG etc */
|
||||
unsigned int
|
||||
drum_channel:1, /* Drum channel */
|
||||
param_type:1 /* RPN/NRPN */
|
||||
;
|
||||
|
||||
unsigned char midi_aftertouch; /* Aftertouch (key pressure) */
|
||||
unsigned char midi_pressure; /* Channel pressure */
|
||||
unsigned char midi_program; /* Instrument number */
|
||||
short midi_pitchbend; /* Pitch bend amount */
|
||||
|
||||
unsigned char control[128]; /* Current value of all controls */
|
||||
unsigned char note[128]; /* Current status for all notes */
|
||||
|
||||
short gm_rpn_pitch_bend_range; /* Pitch bend range */
|
||||
short gm_rpn_fine_tuning; /* Master fine tuning */
|
||||
short gm_rpn_coarse_tuning; /* Master coarse tuning */
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* 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 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.
|
||||
*/
|
||||
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 */
|
||||
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;
|
||||
|
||||
};
|
||||
|
||||
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
|
||||
* distinguished from controller values.
|
||||
*/
|
||||
/* 0-127 controller values */
|
||||
#define MIDI_CTL_PITCHBEND 0x80
|
||||
#define MIDI_CTL_AFTERTOUCH 0x81
|
||||
#define MIDI_CTL_CHAN_PRESSURE 0x82
|
||||
|
||||
/*
|
||||
* These names exist to allow symbolic access to the controls array.
|
||||
* The usage is eg: chan->gm_bank_select. Another implementation would
|
||||
* be really have these members in the struct, and not the array.
|
||||
*/
|
||||
#define gm_bank_select control[0]
|
||||
#define gm_modulation control[1]
|
||||
#define gm_breath control[2]
|
||||
#define gm_foot_pedal control[4]
|
||||
#define gm_portamento_time control[5]
|
||||
#define gm_data_entry control[6]
|
||||
#define gm_volume control[7]
|
||||
#define gm_balance control[8]
|
||||
#define gm_pan control[10]
|
||||
#define gm_expression control[11]
|
||||
#define gm_effect_control1 control[12]
|
||||
#define gm_effect_control2 control[13]
|
||||
#define gm_slider1 control[16]
|
||||
#define gm_slider2 control[17]
|
||||
#define gm_slider3 control[18]
|
||||
#define gm_slider4 control[19]
|
||||
|
||||
#define gm_bank_select_lsb control[32]
|
||||
#define gm_modulation_wheel_lsb control[33]
|
||||
#define gm_breath_lsb control[34]
|
||||
#define gm_foot_pedal_lsb control[36]
|
||||
#define gm_portamento_time_lsb control[37]
|
||||
#define gm_data_entry_lsb control[38]
|
||||
#define gm_volume_lsb control[39]
|
||||
#define gm_balance_lsb control[40]
|
||||
#define gm_pan_lsb control[42]
|
||||
#define gm_expression_lsb control[43]
|
||||
#define gm_effect_control1_lsb control[44]
|
||||
#define gm_effect_control2_lsb control[45]
|
||||
|
||||
#define gm_sustain control[MIDI_CTL_SUSTAIN]
|
||||
#define gm_hold gm_sustain
|
||||
#define gm_portamento control[MIDI_CTL_PORTAMENTO]
|
||||
#define gm_sostenuto control[MIDI_CTL_SOSTENUTO]
|
||||
|
||||
/*
|
||||
* These macros give the complete value of the controls that consist
|
||||
* of coarse and fine pairs. Of course the fine controls are seldom used
|
||||
* but there is no harm in being complete.
|
||||
*/
|
||||
#define SNDRV_GM_BANK_SELECT(cp) (((cp)->control[0]<<7)|((cp)->control[32]))
|
||||
#define SNDRV_GM_MODULATION_WHEEL(cp) (((cp)->control[1]<<7)|((cp)->control[33]))
|
||||
#define SNDRV_GM_BREATH(cp) (((cp)->control[2]<<7)|((cp)->control[34]))
|
||||
#define SNDRV_GM_FOOT_PEDAL(cp) (((cp)->control[4]<<7)|((cp)->control[36]))
|
||||
#define SNDRV_GM_PORTAMENTO_TIME(cp) (((cp)->control[5]<<7)|((cp)->control[37]))
|
||||
#define SNDRV_GM_DATA_ENTRY(cp) (((cp)->control[6]<<7)|((cp)->control[38]))
|
||||
#define SNDRV_GM_VOLUME(cp) (((cp)->control[7]<<7)|((cp)->control[39]))
|
||||
#define SNDRV_GM_BALANCE(cp) (((cp)->control[8]<<7)|((cp)->control[40]))
|
||||
#define SNDRV_GM_PAN(cp) (((cp)->control[10]<<7)|((cp)->control[42]))
|
||||
#define SNDRV_GM_EXPRESSION(cp) (((cp)->control[11]<<7)|((cp)->control[43]))
|
||||
|
||||
|
||||
/* MIDI mode */
|
||||
#define SNDRV_MIDI_MODE_NONE 0 /* Generic midi */
|
||||
#define SNDRV_MIDI_MODE_GM 1
|
||||
#define SNDRV_MIDI_MODE_GS 2
|
||||
#define SNDRV_MIDI_MODE_XG 3
|
||||
#define SNDRV_MIDI_MODE_MT32 4
|
||||
|
||||
/* MIDI note state */
|
||||
#define SNDRV_MIDI_NOTE_OFF 0x00
|
||||
#define SNDRV_MIDI_NOTE_ON 0x01
|
||||
#define SNDRV_MIDI_NOTE_RELEASED 0x02
|
||||
#define SNDRV_MIDI_NOTE_SOSTENUTO 0x04
|
||||
|
||||
#define SNDRV_MIDI_PARAM_TYPE_REGISTERED 0
|
||||
#define SNDRV_MIDI_PARAM_TYPE_NONREGISTERED 1
|
||||
|
||||
/* SYSEX parse flag */
|
||||
enum {
|
||||
SNDRV_MIDI_SYSEX_NOT_PARSED = 0,
|
||||
SNDRV_MIDI_SYSEX_GM_ON,
|
||||
SNDRV_MIDI_SYSEX_GS_ON,
|
||||
SNDRV_MIDI_SYSEX_GS_RESET,
|
||||
SNDRV_MIDI_SYSEX_GS_CHORUS_MODE,
|
||||
SNDRV_MIDI_SYSEX_GS_REVERB_MODE,
|
||||
SNDRV_MIDI_SYSEX_GS_MASTER_VOLUME,
|
||||
SNDRV_MIDI_SYSEX_GS_PROGRAM,
|
||||
SNDRV_MIDI_SYSEX_GS_DRUM_CHANNEL,
|
||||
SNDRV_MIDI_SYSEX_XG_ON,
|
||||
};
|
||||
|
||||
/* Prototypes for midi_process.c */
|
||||
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 */
|
||||
54
include/sound/seq_midi_event.h
Normal file
54
include/sound/seq_midi_event.h
Normal file
@@ -0,0 +1,54 @@
|
||||
#ifndef __SOUND_SEQ_MIDI_EVENT_H
|
||||
#define __SOUND_SEQ_MIDI_EVENT_H
|
||||
|
||||
/*
|
||||
* MIDI byte <-> sequencer event coder
|
||||
*
|
||||
* Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de>,
|
||||
* Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "asequencer.h"
|
||||
|
||||
#define MAX_MIDI_EVENT_BUF 256
|
||||
|
||||
/* midi status */
|
||||
struct snd_midi_event {
|
||||
int qlen; /* queue length */
|
||||
int read; /* chars read */
|
||||
int type; /* current event type */
|
||||
unsigned char lastcmd; /* last command (for MIDI state handling) */
|
||||
unsigned char nostat; /* no state flag */
|
||||
int bufsize; /* allocated buffer size */
|
||||
unsigned char *buf; /* input buffer */
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
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(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(struct snd_midi_event *dev, unsigned char *buf, long count,
|
||||
struct snd_seq_event *ev);
|
||||
|
||||
#endif /* __SOUND_SEQ_MIDI_EVENT_H */
|
||||
96
include/sound/seq_oss.h
Normal file
96
include/sound/seq_oss.h
Normal file
@@ -0,0 +1,96 @@
|
||||
#ifndef __SOUND_SEQ_OSS_H
|
||||
#define __SOUND_SEQ_OSS_H
|
||||
|
||||
/*
|
||||
* OSS compatible sequencer driver
|
||||
*
|
||||
* Copyright (C) 1998,99 Takashi Iwai
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "asequencer.h"
|
||||
#include "seq_kernel.h"
|
||||
|
||||
/*
|
||||
* argument structure for synthesizer operations
|
||||
*/
|
||||
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 */
|
||||
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,
|
||||
* but configurable by drivers - see below
|
||||
*/
|
||||
int event_passing;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* synthesizer operation callbacks
|
||||
*/
|
||||
struct snd_seq_oss_callback {
|
||||
struct module *owner;
|
||||
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 */
|
||||
#define SNDRV_SEQ_OSS_FILE_ACMODE 3
|
||||
#define SNDRV_SEQ_OSS_FILE_READ 1
|
||||
#define SNDRV_SEQ_OSS_FILE_WRITE 2
|
||||
#define SNDRV_SEQ_OSS_FILE_NONBLOCK 4
|
||||
|
||||
/* flag: seq_mode */
|
||||
#define SNDRV_SEQ_OSS_MODE_SYNTH 0
|
||||
#define SNDRV_SEQ_OSS_MODE_MUSIC 1
|
||||
|
||||
/* flag: event_passing */
|
||||
#define SNDRV_SEQ_OSS_PROCESS_EVENTS 0 /* key == 255 is processed as velocity change */
|
||||
#define SNDRV_SEQ_OSS_PASS_EVENTS 1 /* pass all events to callback */
|
||||
#define SNDRV_SEQ_OSS_PROCESS_KEYPRESS 2 /* key >= 128 will be processed as key-pressure */
|
||||
|
||||
/* default control rate: fixed */
|
||||
#define SNDRV_SEQ_OSS_CTRLRATE 100
|
||||
|
||||
/* default max queue length: configurable by module option */
|
||||
#define SNDRV_SEQ_OSS_MAX_QLEN 1024
|
||||
|
||||
|
||||
/*
|
||||
* data pointer to snd_seq_register_device
|
||||
*/
|
||||
struct snd_seq_oss_reg {
|
||||
int type;
|
||||
int subtype;
|
||||
int nvoices;
|
||||
struct snd_seq_oss_callback oper;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
/* device id */
|
||||
#define SNDRV_SEQ_DEV_ID_OSS "seq-oss"
|
||||
|
||||
#endif /* __SOUND_SEQ_OSS_H */
|
||||
31
include/sound/seq_oss_legacy.h
Normal file
31
include/sound/seq_oss_legacy.h
Normal file
@@ -0,0 +1,31 @@
|
||||
#ifndef __SOUND_SEQ_OSS_LEGACY_H
|
||||
#define __SOUND_SEQ_OSS_LEGACY_H
|
||||
|
||||
/*
|
||||
* OSS compatible macro definitions
|
||||
*
|
||||
* Copyright (C) 2000 Abramo Bagnara <abramo@alsa-project.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/soundcard.h>
|
||||
|
||||
#ifndef SAMPLE_TYPE_AWE32
|
||||
#define SAMPLE_TYPE_AWE32 0x20
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_SEQ_OSS_LEGACY_H */
|
||||
|
||||
81
include/sound/seq_virmidi.h
Normal file
81
include/sound/seq_virmidi.h
Normal file
@@ -0,0 +1,81 @@
|
||||
#ifndef __SOUND_SEQ_VIRMIDI_H
|
||||
#define __SOUND_SEQ_VIRMIDI_H
|
||||
|
||||
/*
|
||||
* Virtual Raw MIDI client on Sequencer
|
||||
* Copyright (c) 2000 by Takashi Iwai <tiwai@suse.de>,
|
||||
* Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "rawmidi.h"
|
||||
#include "seq_midi_event.h"
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
struct snd_virmidi {
|
||||
struct list_head list;
|
||||
int seq_mode;
|
||||
int client;
|
||||
int port;
|
||||
unsigned int trigger: 1;
|
||||
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)
|
||||
|
||||
/*
|
||||
* device record:
|
||||
* Each virtual midi device has one device instance. It contains
|
||||
* common information and the linked-list of opened files,
|
||||
*/
|
||||
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 */
|
||||
int port; /* created/attached port */
|
||||
unsigned int flags; /* SNDRV_VIRMIDI_* */
|
||||
rwlock_t filelist_lock;
|
||||
struct list_head filelist;
|
||||
};
|
||||
|
||||
/* sequencer mode:
|
||||
* ATTACH = input/output events from midi device are routed to the
|
||||
* attached sequencer port. sequencer port is not created
|
||||
* by virmidi itself.
|
||||
* the input to rawmidi must be processed by passing the
|
||||
* incoming events via snd_virmidi_receive()
|
||||
* DISPATCH = input/output events are routed to subscribers.
|
||||
* sequencer port is created in virmidi.
|
||||
*/
|
||||
#define SNDRV_VIRMIDI_SEQ_NONE 0
|
||||
#define SNDRV_VIRMIDI_SEQ_ATTACH 1
|
||||
#define SNDRV_VIRMIDI_SEQ_DISPATCH 2
|
||||
|
||||
int snd_virmidi_new(struct snd_card *card, int device, struct snd_rawmidi **rrmidi);
|
||||
|
||||
#endif /* __SOUND_SEQ_VIRMIDI */
|
||||
214
include/sound/sfnt_info.h
Normal file
214
include/sound/sfnt_info.h
Normal file
@@ -0,0 +1,214 @@
|
||||
#ifndef __SOUND_SFNT_INFO_H
|
||||
#define __SOUND_SFNT_INFO_H
|
||||
|
||||
/*
|
||||
* Patch record compatible with AWE driver on OSS
|
||||
*
|
||||
* Copyright (C) 1999-2000 Takashi Iwai
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sound/asound.h>
|
||||
|
||||
/*
|
||||
* patch information record
|
||||
*/
|
||||
|
||||
#ifdef SNDRV_BIG_ENDIAN
|
||||
#define SNDRV_OSS_PATCHKEY(id) (0xfd00|id)
|
||||
#else
|
||||
#define SNDRV_OSS_PATCHKEY(id) ((id<<8)|0xfd)
|
||||
#endif
|
||||
|
||||
/* patch interface header: 16 bytes */
|
||||
struct soundfont_patch_info {
|
||||
unsigned short key; /* use the key below */
|
||||
#define SNDRV_OSS_SOUNDFONT_PATCH SNDRV_OSS_PATCHKEY(0x07)
|
||||
|
||||
short device_no; /* synthesizer number */
|
||||
unsigned short sf_id; /* file id (should be zero) */
|
||||
short optarg; /* optional argument */
|
||||
int len; /* data length (without this header) */
|
||||
|
||||
short type; /* patch operation type */
|
||||
#define SNDRV_SFNT_LOAD_INFO 0 /* awe_voice_rec */
|
||||
#define SNDRV_SFNT_LOAD_DATA 1 /* awe_sample_info */
|
||||
#define SNDRV_SFNT_OPEN_PATCH 2 /* awe_open_parm */
|
||||
#define SNDRV_SFNT_CLOSE_PATCH 3 /* none */
|
||||
/* 4 is obsolete */
|
||||
#define SNDRV_SFNT_REPLACE_DATA 5 /* awe_sample_info (optarg=#channels)*/
|
||||
#define SNDRV_SFNT_MAP_PRESET 6 /* awe_voice_map */
|
||||
/* 7 is not used */
|
||||
#define SNDRV_SFNT_PROBE_DATA 8 /* optarg=sample */
|
||||
#define SNDRV_SFNT_REMOVE_INFO 9 /* optarg=(bank<<8)|instr */
|
||||
|
||||
short reserved; /* word alignment data */
|
||||
|
||||
/* the actual patch data begins after this */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* open patch
|
||||
*/
|
||||
|
||||
#define SNDRV_SFNT_PATCH_NAME_LEN 32
|
||||
|
||||
struct soundfont_open_parm {
|
||||
unsigned short type; /* sample type */
|
||||
#define SNDRV_SFNT_PAT_TYPE_MISC 0
|
||||
#define SNDRV_SFNT_PAT_TYPE_GUS 6
|
||||
#define SNDRV_SFNT_PAT_TYPE_MAP 7
|
||||
#define SNDRV_SFNT_PAT_LOCKED 0x100 /* lock the samples */
|
||||
#define SNDRV_SFNT_PAT_SHARED 0x200 /* sample is shared */
|
||||
|
||||
short reserved;
|
||||
char name[SNDRV_SFNT_PATCH_NAME_LEN];
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* raw voice information record
|
||||
*/
|
||||
|
||||
/* wave table envelope & effect parameters to control EMU8000 */
|
||||
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) */
|
||||
unsigned short modrelease; /* modulation release time (0x807f) */
|
||||
short modkeyhold, modkeydecay; /* envelope change per key (not used) */
|
||||
unsigned short voldelay; /* volume delay (0x8000) */
|
||||
unsigned short volatkhld; /* volume attack & hold time (0x7f7f) */
|
||||
unsigned short voldcysus; /* volume decay & sustain (0x7f7f) */
|
||||
unsigned short volrelease; /* volume release time (0x807f) */
|
||||
short volkeyhold, volkeydecay; /* envelope change per key (not used) */
|
||||
unsigned short lfo1delay; /* LFO1 delay (0x8000) */
|
||||
unsigned short lfo2delay; /* LFO2 delay (0x8000) */
|
||||
unsigned short pefe; /* modulation pitch & cutoff (0x0000) */
|
||||
unsigned short fmmod; /* LFO1 pitch & cutoff (0x0000) */
|
||||
unsigned short tremfrq; /* LFO1 volume & freq (0x0000) */
|
||||
unsigned short fm2frq2; /* LFO2 pitch & freq (0x0000) */
|
||||
unsigned char cutoff; /* initial cutoff (0xff) */
|
||||
unsigned char filterQ; /* initial filter Q [0-15] (0x0) */
|
||||
unsigned char chorus; /* chorus send (0x00) */
|
||||
unsigned char reverb; /* reverb send (0x00) */
|
||||
unsigned short reserved[4]; /* not used */
|
||||
};
|
||||
|
||||
|
||||
/* wave table parameters: 92 bytes */
|
||||
struct soundfont_voice_info {
|
||||
unsigned short sf_id; /* file id (should be zero) */
|
||||
unsigned short sample; /* sample id */
|
||||
int start, end; /* sample offset correction */
|
||||
int loopstart, loopend; /* loop offset correction */
|
||||
short rate_offset; /* sample rate pitch offset */
|
||||
unsigned short mode; /* sample mode */
|
||||
#define SNDRV_SFNT_MODE_ROMSOUND 0x8000
|
||||
#define SNDRV_SFNT_MODE_STEREO 1
|
||||
#define SNDRV_SFNT_MODE_LOOPING 2
|
||||
#define SNDRV_SFNT_MODE_NORELEASE 4 /* obsolete */
|
||||
#define SNDRV_SFNT_MODE_INIT_PARM 8
|
||||
|
||||
short root; /* midi root key */
|
||||
short tune; /* pitch tuning (in cents) */
|
||||
unsigned char low, high; /* key note range */
|
||||
unsigned char vellow, velhigh; /* velocity range */
|
||||
signed char fixkey, fixvel; /* fixed key, velocity */
|
||||
signed char pan, fixpan; /* panning, fixed panning */
|
||||
short exclusiveClass; /* exclusive class (0 = none) */
|
||||
unsigned char amplitude; /* sample volume (127 max) */
|
||||
unsigned char attenuation; /* attenuation (0.375dB) */
|
||||
short scaleTuning; /* pitch scale tuning(%), normally 100 */
|
||||
struct soundfont_voice_parm parm; /* voice envelope parameters */
|
||||
unsigned short sample_mode; /* sample mode_flag (set by driver) */
|
||||
};
|
||||
|
||||
|
||||
/* instrument info header: 4 bytes */
|
||||
struct soundfont_voice_rec_hdr {
|
||||
unsigned char bank; /* midi bank number */
|
||||
unsigned char instr; /* midi preset number */
|
||||
char nvoices; /* number of voices */
|
||||
char write_mode; /* write mode; normally 0 */
|
||||
#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 */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* sample wave information
|
||||
*/
|
||||
|
||||
/* wave table sample header: 32 bytes */
|
||||
struct soundfont_sample_info {
|
||||
unsigned short sf_id; /* file id (should be zero) */
|
||||
unsigned short sample; /* sample id */
|
||||
int start, end; /* start & end offset */
|
||||
int loopstart, loopend; /* loop start & end offset */
|
||||
int size; /* size (0 = ROM) */
|
||||
short dummy; /* not used */
|
||||
unsigned short mode_flags; /* mode flags */
|
||||
#define SNDRV_SFNT_SAMPLE_8BITS 1 /* wave data is 8bits */
|
||||
#define SNDRV_SFNT_SAMPLE_UNSIGNED 2 /* wave data is unsigned */
|
||||
#define SNDRV_SFNT_SAMPLE_NO_BLANK 4 /* no blank loop is attached */
|
||||
#define SNDRV_SFNT_SAMPLE_SINGLESHOT 8 /* single-shot w/o loop */
|
||||
#define SNDRV_SFNT_SAMPLE_BIDIR_LOOP 16 /* bidirectional looping */
|
||||
#define SNDRV_SFNT_SAMPLE_STEREO_LEFT 32 /* stereo left sound */
|
||||
#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) */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* voice preset mapping (aliasing)
|
||||
*/
|
||||
|
||||
struct soundfont_voice_map {
|
||||
int map_bank, map_instr, map_key; /* key = -1 means all keys */
|
||||
int src_bank, src_instr, src_key;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* ioctls for hwdep
|
||||
*/
|
||||
|
||||
#define SNDRV_EMUX_HWDEP_NAME "Emux WaveTable"
|
||||
|
||||
#define SNDRV_EMUX_VERSION ((1 << 16) | (0 << 8) | 0) /* 1.0.0 */
|
||||
|
||||
struct snd_emux_misc_mode {
|
||||
int port; /* -1 = all */
|
||||
int mode;
|
||||
int value;
|
||||
int value2; /* reserved */
|
||||
};
|
||||
|
||||
enum {
|
||||
SNDRV_EMUX_IOCTL_VERSION = _IOR('H', 0x80, unsigned int),
|
||||
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 snd_emux_misc_mode),
|
||||
};
|
||||
|
||||
#endif /* __SOUND_SFNT_INFO_H */
|
||||
143
include/sound/snd_wavefront.h
Normal file
143
include/sound/snd_wavefront.h
Normal file
@@ -0,0 +1,143 @@
|
||||
#ifndef __SOUND_SND_WAVEFRONT_H__
|
||||
#define __SOUND_SND_WAVEFRONT_H__
|
||||
|
||||
#include "cs4231.h"
|
||||
#include "mpu401.h"
|
||||
#include "hwdep.h"
|
||||
#include "rawmidi.h"
|
||||
#include "wavefront.h" /* generic OSS/ALSA/user-level wavefront header */
|
||||
|
||||
/* MIDI interface */
|
||||
|
||||
struct _snd_wavefront_midi;
|
||||
struct _snd_wavefront_card;
|
||||
struct _snd_wavefront;
|
||||
|
||||
typedef struct _snd_wavefront_midi snd_wavefront_midi_t;
|
||||
typedef struct _snd_wavefront_card snd_wavefront_card_t;
|
||||
typedef struct _snd_wavefront snd_wavefront_t;
|
||||
|
||||
typedef enum { internal_mpu = 0, external_mpu = 1 } snd_wavefront_mpu_id;
|
||||
|
||||
struct _snd_wavefront_midi {
|
||||
unsigned long base; /* I/O port address */
|
||||
char isvirtual; /* doing virtual MIDI stuff ? */
|
||||
char istimer; /* timer is used */
|
||||
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 */
|
||||
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 */
|
||||
};
|
||||
|
||||
#define OUTPUT_READY 0x40
|
||||
#define INPUT_AVAIL 0x80
|
||||
#define MPU_ACK 0xFE
|
||||
#define UART_MODE_ON 0x3F
|
||||
|
||||
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 *);
|
||||
extern void snd_wavefront_midi_interrupt (snd_wavefront_card_t *);
|
||||
extern int snd_wavefront_midi_start (snd_wavefront_card_t *);
|
||||
|
||||
struct _snd_wavefront {
|
||||
unsigned long irq; /* "you were one, one of the few ..." */
|
||||
unsigned long base; /* low i/o port address */
|
||||
struct resource *res_base; /* i/o port resource allocation */
|
||||
|
||||
#define mpu_data_port base
|
||||
#define mpu_command_port base + 1 /* write semantics */
|
||||
#define mpu_status_port base + 1 /* read semantics */
|
||||
#define data_port base + 2
|
||||
#define status_port base + 3 /* read semantics */
|
||||
#define control_port base + 3 /* write semantics */
|
||||
#define block_port base + 4 /* 16 bit, writeonly */
|
||||
#define last_block_port base + 6 /* 16 bit, writeonly */
|
||||
|
||||
/* FX ports. These are mapped through the ICS2115 to the YS225.
|
||||
The ICS2115 takes care of flipping the relevant pins on the
|
||||
YS225 so that access to each of these ports does the right
|
||||
thing. Note: these are NOT documented by Turtle Beach.
|
||||
*/
|
||||
|
||||
#define fx_status base + 8
|
||||
#define fx_op base + 8
|
||||
#define fx_lcr base + 9
|
||||
#define fx_dsp_addr base + 0xa
|
||||
#define fx_dsp_page base + 0xb
|
||||
#define fx_dsp_lsb base + 0xc
|
||||
#define fx_dsp_msb base + 0xd
|
||||
#define fx_mod_addr base + 0xe
|
||||
#define fx_mod_data base + 0xf
|
||||
|
||||
volatile int irq_ok; /* set by interrupt handler */
|
||||
volatile int irq_cnt; /* ditto */
|
||||
char debug; /* debugging flags */
|
||||
int freemem; /* installed RAM, in bytes */
|
||||
|
||||
char fw_version[2]; /* major = [0], minor = [1] */
|
||||
char hw_version[2]; /* major = [0], minor = [1] */
|
||||
char israw; /* needs Motorola microcode */
|
||||
char has_fx; /* has FX processor (Tropez+) */
|
||||
char fx_initialized; /* FX's register pages initialized */
|
||||
char prog_status[WF_MAX_PROGRAM]; /* WF_SLOT_* */
|
||||
char patch_status[WF_MAX_PATCH]; /* WF_SLOT_* */
|
||||
char sample_status[WF_MAX_SAMPLE]; /* WF_ST_* | WF_SLOT_* */
|
||||
int samples_used; /* how many */
|
||||
char interrupts_are_midi; /* h/w MPU interrupts enabled ? */
|
||||
char rom_samples_rdonly; /* can we write on ROM samples */
|
||||
spinlock_t irq_lock;
|
||||
wait_queue_head_t interrupt_sleeper;
|
||||
snd_wavefront_midi_t midi; /* ICS2115 MIDI interface */
|
||||
struct snd_card *card;
|
||||
};
|
||||
|
||||
struct _snd_wavefront_card {
|
||||
snd_wavefront_t wavefront;
|
||||
#ifdef CONFIG_PNP
|
||||
struct pnp_dev *wss;
|
||||
struct pnp_dev *ctrl;
|
||||
struct pnp_dev *mpu;
|
||||
struct pnp_dev *synth;
|
||||
#endif /* CONFIG_PNP */
|
||||
};
|
||||
|
||||
extern void snd_wavefront_internal_interrupt (snd_wavefront_card_t *card);
|
||||
extern int snd_wavefront_detect_irq (snd_wavefront_t *dev) ;
|
||||
extern int snd_wavefront_check_irq (snd_wavefront_t *dev, int irq);
|
||||
extern int snd_wavefront_restart (snd_wavefront_t *dev);
|
||||
extern int snd_wavefront_start (snd_wavefront_t *dev);
|
||||
extern int snd_wavefront_detect (snd_wavefront_card_t *card);
|
||||
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 (struct snd_hwdep *,
|
||||
struct file *,
|
||||
unsigned int cmd,
|
||||
unsigned long arg);
|
||||
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 (struct snd_hwdep *,
|
||||
struct file *,
|
||||
unsigned int cmd,
|
||||
unsigned long arg);
|
||||
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 */
|
||||
|
||||
#define LOGNAME "WaveFront: "
|
||||
|
||||
#endif /* __SOUND_SND_WAVEFRONT_H__ */
|
||||
305
include/sound/soc-dapm.h
Normal file
305
include/sound/soc-dapm.h
Normal file
@@ -0,0 +1,305 @@
|
||||
/*
|
||||
* linux/sound/soc-dapm.h -- ALSA SoC Dynamic Audio Power Management
|
||||
*
|
||||
* Author: Liam Girdwood
|
||||
* Created: Aug 11th 2005
|
||||
* Copyright: Wolfson Microelectronics. PLC.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_SOC_DAPM_H
|
||||
#define __LINUX_SND_SOC_DAPM_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/types.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/soc.h>
|
||||
|
||||
/* widget has no PM register bit */
|
||||
#define SND_SOC_NOPM -1
|
||||
|
||||
/*
|
||||
* SoC dynamic audio power managment
|
||||
*
|
||||
* We can have upto 4 power domains
|
||||
* 1. Codec domain - VREF, VMID
|
||||
* Usually controlled at codec probe/remove, although can be set
|
||||
* at stream time if power is not needed for sidetone, etc.
|
||||
* 2. Platform/Machine domain - physically connected inputs and outputs
|
||||
* Is platform/machine and user action specific, is set in the machine
|
||||
* driver and by userspace e.g when HP are inserted
|
||||
* 3. Path domain - Internal codec path mixers
|
||||
* Are automatically set when mixer and mux settings are
|
||||
* changed by the user.
|
||||
* 4. Stream domain - DAC's and ADC's.
|
||||
* Enabled when stream playback/capture is started.
|
||||
*/
|
||||
|
||||
/* codec domain */
|
||||
#define SND_SOC_DAPM_VMID(wname) \
|
||||
{ .id = snd_soc_dapm_vmid, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0}
|
||||
|
||||
/* platform domain */
|
||||
#define SND_SOC_DAPM_INPUT(wname) \
|
||||
{ .id = snd_soc_dapm_input, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0}
|
||||
#define SND_SOC_DAPM_OUTPUT(wname) \
|
||||
{ .id = snd_soc_dapm_output, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0}
|
||||
#define SND_SOC_DAPM_MIC(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_mic, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
|
||||
#define SND_SOC_DAPM_HP(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_hp, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
|
||||
#define SND_SOC_DAPM_SPK(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_spk, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
|
||||
#define SND_SOC_DAPM_LINE(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_line, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
|
||||
|
||||
/* path domain */
|
||||
#define SND_SOC_DAPM_PGA(wname, wreg, wshift, winvert,\
|
||||
wcontrols, wncontrols) \
|
||||
{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
|
||||
#define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \
|
||||
wcontrols, wncontrols)\
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
|
||||
#define SND_SOC_DAPM_MICBIAS(wname, wreg, wshift, winvert) \
|
||||
{ .id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = NULL, .num_kcontrols = 0}
|
||||
#define SND_SOC_DAPM_SWITCH(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
|
||||
#define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
|
||||
|
||||
/* path domain with event - event handler must return 0 for success */
|
||||
#define SND_SOC_DAPM_PGA_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wncontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_MIXER_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wncontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_MICBIAS_E(wname, wreg, wshift, winvert, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = NULL, .num_kcontrols = 0, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_SWITCH_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1 \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_MUX_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
|
||||
/* events that are pre and post DAPM */
|
||||
#define SND_SOC_DAPM_PRE(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_pre, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD}
|
||||
#define SND_SOC_DAPM_POST(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_post, .name = wname, .kcontrols = NULL, \
|
||||
.num_kcontrols = 0, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD}
|
||||
|
||||
/* stream domain */
|
||||
#define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \
|
||||
{ .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \
|
||||
.shift = wshift, .invert = winvert}
|
||||
#define SND_SOC_DAPM_ADC(wname, stname, wreg, wshift, winvert) \
|
||||
{ .id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \
|
||||
.shift = wshift, .invert = winvert}
|
||||
|
||||
/* dapm kcontrol types */
|
||||
#define SOC_DAPM_SINGLE(xname, reg, shift, mask, invert) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_volsw, \
|
||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||
.private_value = SOC_SINGLE_VALUE(reg, shift, mask, invert) }
|
||||
#define SOC_DAPM_DOUBLE(xname, reg, shift_left, shift_right, mask, invert, \
|
||||
power) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
|
||||
.info = snd_soc_info_volsw, \
|
||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||
.private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\
|
||||
((mask) << 16) | ((invert) << 24) }
|
||||
|
||||
#define SOC_DAPM_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_volsw, \
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
|
||||
.tlv.p = (tlv_array), \
|
||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert) }
|
||||
|
||||
#define SOC_DAPM_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, \
|
||||
power, tlv_array) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
|
||||
.tlv.p = (tlv_array), \
|
||||
.info = snd_soc_info_volsw, \
|
||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||
.private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\
|
||||
((max) << 16) | ((invert) << 24) }
|
||||
|
||||
#define SOC_DAPM_ENUM(xname, xenum) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_enum_double, \
|
||||
.get = snd_soc_dapm_get_enum_double, \
|
||||
.put = snd_soc_dapm_put_enum_double, \
|
||||
.private_value = (unsigned long)&xenum }
|
||||
|
||||
/* dapm stream operations */
|
||||
#define SND_SOC_DAPM_STREAM_NOP 0x0
|
||||
#define SND_SOC_DAPM_STREAM_START 0x1
|
||||
#define SND_SOC_DAPM_STREAM_STOP 0x2
|
||||
#define SND_SOC_DAPM_STREAM_SUSPEND 0x4
|
||||
#define SND_SOC_DAPM_STREAM_RESUME 0x8
|
||||
#define SND_SOC_DAPM_STREAM_PAUSE_PUSH 0x10
|
||||
#define SND_SOC_DAPM_STREAM_PAUSE_RELEASE 0x20
|
||||
|
||||
/* dapm event types */
|
||||
#define SND_SOC_DAPM_PRE_PMU 0x1 /* before widget power up */
|
||||
#define SND_SOC_DAPM_POST_PMU 0x2 /* after widget power up */
|
||||
#define SND_SOC_DAPM_PRE_PMD 0x4 /* before widget power down */
|
||||
#define SND_SOC_DAPM_POST_PMD 0x8 /* after widget power down */
|
||||
#define SND_SOC_DAPM_PRE_REG 0x10 /* before audio path setup */
|
||||
#define SND_SOC_DAPM_POST_REG 0x20 /* after audio path setup */
|
||||
|
||||
/* convenience event type detection */
|
||||
#define SND_SOC_DAPM_EVENT_ON(e) \
|
||||
(e & (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU))
|
||||
#define SND_SOC_DAPM_EVENT_OFF(e) \
|
||||
(e & (SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD))
|
||||
|
||||
struct snd_soc_dapm_widget;
|
||||
enum snd_soc_dapm_type;
|
||||
struct snd_soc_dapm_path;
|
||||
struct snd_soc_dapm_pin;
|
||||
|
||||
/* dapm controls */
|
||||
int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_dapm_new_control(struct snd_soc_codec *codec,
|
||||
const struct snd_soc_dapm_widget *widget);
|
||||
|
||||
/* dapm path setup */
|
||||
int snd_soc_dapm_connect_input(struct snd_soc_codec *codec,
|
||||
const char *sink_name, const char *control_name, const char *src_name);
|
||||
int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec);
|
||||
void snd_soc_dapm_free(struct snd_soc_device *socdev);
|
||||
|
||||
/* dapm events */
|
||||
int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream,
|
||||
int event);
|
||||
|
||||
/* dapm sys fs - used by the core */
|
||||
int snd_soc_dapm_sys_add(struct device *dev);
|
||||
|
||||
/* dapm audio endpoint control */
|
||||
int snd_soc_dapm_set_endpoint(struct snd_soc_codec *codec,
|
||||
char *pin, int status);
|
||||
int snd_soc_dapm_sync_endpoints(struct snd_soc_codec *codec);
|
||||
|
||||
/* dapm widget types */
|
||||
enum snd_soc_dapm_type {
|
||||
snd_soc_dapm_input = 0, /* input pin */
|
||||
snd_soc_dapm_output, /* output pin */
|
||||
snd_soc_dapm_mux, /* selects 1 analog signal from many inputs */
|
||||
snd_soc_dapm_mixer, /* mixes several analog signals together */
|
||||
snd_soc_dapm_pga, /* programmable gain/attenuation (volume) */
|
||||
snd_soc_dapm_adc, /* analog to digital converter */
|
||||
snd_soc_dapm_dac, /* digital to analog converter */
|
||||
snd_soc_dapm_micbias, /* microphone bias (power) */
|
||||
snd_soc_dapm_mic, /* microphone */
|
||||
snd_soc_dapm_hp, /* headphones */
|
||||
snd_soc_dapm_spk, /* speaker */
|
||||
snd_soc_dapm_line, /* line input/output */
|
||||
snd_soc_dapm_switch, /* analog switch */
|
||||
snd_soc_dapm_vmid, /* codec bias/vmid - to minimise pops */
|
||||
snd_soc_dapm_pre, /* machine specific pre widget - exec first */
|
||||
snd_soc_dapm_post, /* machine specific post widget - exec last */
|
||||
};
|
||||
|
||||
/* dapm audio path between two widgets */
|
||||
struct snd_soc_dapm_path {
|
||||
char *name;
|
||||
char *long_name;
|
||||
|
||||
/* source (input) and sink (output) widgets */
|
||||
struct snd_soc_dapm_widget *source;
|
||||
struct snd_soc_dapm_widget *sink;
|
||||
struct snd_kcontrol *kcontrol;
|
||||
|
||||
/* status */
|
||||
u32 connect:1; /* source and sink widgets are connected */
|
||||
u32 walked:1; /* path has been walked */
|
||||
|
||||
struct list_head list_source;
|
||||
struct list_head list_sink;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/* dapm widget */
|
||||
struct snd_soc_dapm_widget {
|
||||
enum snd_soc_dapm_type id;
|
||||
char *name; /* widget name */
|
||||
char *sname; /* stream name */
|
||||
struct snd_soc_codec *codec;
|
||||
struct list_head list;
|
||||
|
||||
/* dapm control */
|
||||
short reg; /* negative reg = no direct dapm */
|
||||
unsigned char shift; /* bits to shift */
|
||||
unsigned int saved_value; /* widget saved value */
|
||||
unsigned int value; /* widget current value */
|
||||
unsigned char power:1; /* block power status */
|
||||
unsigned char invert:1; /* invert the power bit */
|
||||
unsigned char active:1; /* active stream on DAC, ADC's */
|
||||
unsigned char connected:1; /* connected codec pin */
|
||||
unsigned char new:1; /* cnew complete */
|
||||
unsigned char ext:1; /* has external widgets */
|
||||
unsigned char muted:1; /* muted for pop reduction */
|
||||
unsigned char suspend:1; /* was active before suspend */
|
||||
unsigned char pmdown:1; /* waiting for timeout */
|
||||
|
||||
/* external events */
|
||||
unsigned short event_flags; /* flags to specify event types */
|
||||
int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);
|
||||
|
||||
/* kcontrols that relate to this widget */
|
||||
int num_kcontrols;
|
||||
const struct snd_kcontrol_new *kcontrols;
|
||||
|
||||
/* widget input and outputs */
|
||||
struct list_head sources;
|
||||
struct list_head sinks;
|
||||
};
|
||||
|
||||
#endif
|
||||
505
include/sound/soc.h
Normal file
505
include/sound/soc.h
Normal file
@@ -0,0 +1,505 @@
|
||||
/*
|
||||
* linux/sound/soc.h -- ALSA SoC Layer
|
||||
*
|
||||
* Author: Liam Girdwood
|
||||
* Created: Aug 11th 2005
|
||||
* Copyright: Wolfson Microelectronics. PLC.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_SOC_H
|
||||
#define __LINUX_SND_SOC_H
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <sound/driver.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/ac97_codec.h>
|
||||
|
||||
|
||||
#define SND_SOC_VERSION "0.13.2"
|
||||
|
||||
/*
|
||||
* Convenience kcontrol builders
|
||||
*/
|
||||
#define SOC_SINGLE_VALUE(reg,shift,max,invert) ((reg) | ((shift) << 8) |\
|
||||
((shift) << 12) | ((max) << 16) | ((invert) << 24))
|
||||
#define SOC_SINGLE_VALUE_EXT(reg,max,invert) ((reg) | ((max) << 16) |\
|
||||
((invert) << 31))
|
||||
#define SOC_SINGLE(xname, reg, shift, max, invert) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
|
||||
.put = snd_soc_put_volsw, \
|
||||
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert) }
|
||||
#define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
|
||||
.tlv.p = (tlv_array), \
|
||||
.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
|
||||
.put = snd_soc_put_volsw, \
|
||||
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert) }
|
||||
#define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
|
||||
.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
|
||||
.put = snd_soc_put_volsw, \
|
||||
.private_value = (reg) | ((shift_left) << 8) | \
|
||||
((shift_right) << 12) | ((max) << 16) | ((invert) << 24) }
|
||||
#define SOC_DOUBLE_R(xname, reg_left, reg_right, shift, max, invert) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
|
||||
.info = snd_soc_info_volsw_2r, \
|
||||
.get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \
|
||||
.private_value = (reg_left) | ((shift) << 8) | \
|
||||
((max) << 12) | ((invert) << 20) | ((reg_right) << 24) }
|
||||
#define SOC_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, tlv_array) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
|
||||
.tlv.p = (tlv_array), \
|
||||
.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
|
||||
.put = snd_soc_put_volsw, \
|
||||
.private_value = (reg) | ((shift_left) << 8) | \
|
||||
((shift_right) << 12) | ((max) << 16) | ((invert) << 24) }
|
||||
#define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, shift, max, invert, tlv_array) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
|
||||
.tlv.p = (tlv_array), \
|
||||
.info = snd_soc_info_volsw_2r, \
|
||||
.get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \
|
||||
.private_value = (reg_left) | ((shift) << 8) | \
|
||||
((max) << 12) | ((invert) << 20) | ((reg_right) << 24) }
|
||||
#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xtexts) \
|
||||
{ .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
|
||||
.mask = xmask, .texts = xtexts }
|
||||
#define SOC_ENUM_SINGLE(xreg, xshift, xmask, xtexts) \
|
||||
SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xtexts)
|
||||
#define SOC_ENUM_SINGLE_EXT(xmask, xtexts) \
|
||||
{ .mask = xmask, .texts = xtexts }
|
||||
#define SOC_ENUM(xname, xenum) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
|
||||
.info = snd_soc_info_enum_double, \
|
||||
.get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \
|
||||
.private_value = (unsigned long)&xenum }
|
||||
#define SOC_SINGLE_EXT(xname, xreg, xshift, xmask, xinvert,\
|
||||
xhandler_get, xhandler_put) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_volsw, \
|
||||
.get = xhandler_get, .put = xhandler_put, \
|
||||
.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmask, xinvert) }
|
||||
#define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_bool_ext, \
|
||||
.get = xhandler_get, .put = xhandler_put, \
|
||||
.private_value = xdata }
|
||||
#define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_enum_ext, \
|
||||
.get = xhandler_get, .put = xhandler_put, \
|
||||
.private_value = (unsigned long)&xenum }
|
||||
|
||||
/*
|
||||
* Digital Audio Interface (DAI) types
|
||||
*/
|
||||
#define SND_SOC_DAI_AC97 0x1
|
||||
#define SND_SOC_DAI_I2S 0x2
|
||||
#define SND_SOC_DAI_PCM 0x4
|
||||
#define SND_SOC_DAI_AC97_BUS 0x8 /* for custom i.e. non ac97_codec.c */
|
||||
|
||||
/*
|
||||
* DAI hardware audio formats
|
||||
*/
|
||||
#define SND_SOC_DAIFMT_I2S 0 /* I2S mode */
|
||||
#define SND_SOC_DAIFMT_RIGHT_J 1 /* Right justified mode */
|
||||
#define SND_SOC_DAIFMT_LEFT_J 2 /* Left Justified mode */
|
||||
#define SND_SOC_DAIFMT_DSP_A 3 /* L data msb after FRM or LRC */
|
||||
#define SND_SOC_DAIFMT_DSP_B 4 /* L data msb during FRM or LRC */
|
||||
#define SND_SOC_DAIFMT_AC97 5 /* AC97 */
|
||||
|
||||
#define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J
|
||||
#define SND_SOC_DAIFMT_LSB SND_SOC_DAIFMT_RIGHT_J
|
||||
|
||||
/*
|
||||
* DAI Gating
|
||||
*/
|
||||
#define SND_SOC_DAIFMT_CONT (0 << 4) /* continuous clock */
|
||||
#define SND_SOC_DAIFMT_GATED (1 << 4) /* clock is gated when not Tx/Rx */
|
||||
|
||||
/*
|
||||
* DAI Sync
|
||||
* Synchronous LR (Left Right) clocks and Frame signals.
|
||||
*/
|
||||
#define SND_SOC_DAIFMT_SYNC (0 << 5) /* Tx FRM = Rx FRM */
|
||||
#define SND_SOC_DAIFMT_ASYNC (1 << 5) /* Tx FRM ~ Rx FRM */
|
||||
|
||||
/*
|
||||
* TDM
|
||||
*/
|
||||
#define SND_SOC_DAIFMT_TDM (1 << 6)
|
||||
|
||||
/*
|
||||
* DAI hardware signal inversions
|
||||
*/
|
||||
#define SND_SOC_DAIFMT_NB_NF (0 << 8) /* normal bit clock + frame */
|
||||
#define SND_SOC_DAIFMT_NB_IF (1 << 8) /* normal bclk + inv frm */
|
||||
#define SND_SOC_DAIFMT_IB_NF (2 << 8) /* invert bclk + nor frm */
|
||||
#define SND_SOC_DAIFMT_IB_IF (3 << 8) /* invert bclk + frm */
|
||||
|
||||
/*
|
||||
* DAI hardware clock masters
|
||||
* This is wrt the codec, the inverse is true for the interface
|
||||
* i.e. if the codec is clk and frm master then the interface is
|
||||
* clk and frame slave.
|
||||
*/
|
||||
#define SND_SOC_DAIFMT_CBM_CFM (0 << 12) /* codec clk & frm master */
|
||||
#define SND_SOC_DAIFMT_CBS_CFM (1 << 12) /* codec clk slave & frm master */
|
||||
#define SND_SOC_DAIFMT_CBM_CFS (2 << 12) /* codec clk master & frame slave */
|
||||
#define SND_SOC_DAIFMT_CBS_CFS (3 << 12) /* codec clk & frm slave */
|
||||
|
||||
#define SND_SOC_DAIFMT_FORMAT_MASK 0x000f
|
||||
#define SND_SOC_DAIFMT_CLOCK_MASK 0x00f0
|
||||
#define SND_SOC_DAIFMT_INV_MASK 0x0f00
|
||||
#define SND_SOC_DAIFMT_MASTER_MASK 0xf000
|
||||
|
||||
|
||||
/*
|
||||
* Master Clock Directions
|
||||
*/
|
||||
#define SND_SOC_CLOCK_IN 0
|
||||
#define SND_SOC_CLOCK_OUT 1
|
||||
|
||||
/*
|
||||
* AC97 codec ID's bitmask
|
||||
*/
|
||||
#define SND_SOC_DAI_AC97_ID0 (1 << 0)
|
||||
#define SND_SOC_DAI_AC97_ID1 (1 << 1)
|
||||
#define SND_SOC_DAI_AC97_ID2 (1 << 2)
|
||||
#define SND_SOC_DAI_AC97_ID3 (1 << 3)
|
||||
|
||||
struct snd_soc_device;
|
||||
struct snd_soc_pcm_stream;
|
||||
struct snd_soc_ops;
|
||||
struct snd_soc_dai_mode;
|
||||
struct snd_soc_pcm_runtime;
|
||||
struct snd_soc_codec_dai;
|
||||
struct snd_soc_cpu_dai;
|
||||
struct snd_soc_codec;
|
||||
struct snd_soc_machine_config;
|
||||
struct soc_enum;
|
||||
struct snd_soc_ac97_ops;
|
||||
struct snd_soc_clock_info;
|
||||
|
||||
typedef int (*hw_write_t)(void *,const char* ,int);
|
||||
typedef int (*hw_read_t)(void *,char* ,int);
|
||||
|
||||
extern struct snd_ac97_bus_ops soc_ac97_ops;
|
||||
|
||||
/* pcm <-> DAI connect */
|
||||
void snd_soc_free_pcms(struct snd_soc_device *socdev);
|
||||
int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid);
|
||||
int snd_soc_register_card(struct snd_soc_device *socdev);
|
||||
|
||||
/* set runtime hw params */
|
||||
int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
|
||||
const struct snd_pcm_hardware *hw);
|
||||
|
||||
/* codec IO */
|
||||
#define snd_soc_read(codec, reg) codec->read(codec, reg)
|
||||
#define snd_soc_write(codec, reg, value) codec->write(codec, reg, value)
|
||||
|
||||
/* codec register bit access */
|
||||
int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
|
||||
unsigned short mask, unsigned short value);
|
||||
int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
|
||||
unsigned short mask, unsigned short value);
|
||||
|
||||
int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
|
||||
struct snd_ac97_bus_ops *ops, int num);
|
||||
void snd_soc_free_ac97_codec(struct snd_soc_codec *codec);
|
||||
|
||||
/*
|
||||
*Controls
|
||||
*/
|
||||
struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
|
||||
void *data, char *long_name);
|
||||
int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_soc_info_bool_ext(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
|
||||
/* SoC PCM stream information */
|
||||
struct snd_soc_pcm_stream {
|
||||
char *stream_name;
|
||||
u64 formats; /* SNDRV_PCM_FMTBIT_* */
|
||||
unsigned int rates; /* SNDRV_PCM_RATE_* */
|
||||
unsigned int rate_min; /* min rate */
|
||||
unsigned int rate_max; /* max rate */
|
||||
unsigned int channels_min; /* min channels */
|
||||
unsigned int channels_max; /* max channels */
|
||||
unsigned int active:1; /* stream is in use */
|
||||
};
|
||||
|
||||
/* SoC audio ops */
|
||||
struct snd_soc_ops {
|
||||
int (*startup)(struct snd_pcm_substream *);
|
||||
void (*shutdown)(struct snd_pcm_substream *);
|
||||
int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
|
||||
int (*hw_free)(struct snd_pcm_substream *);
|
||||
int (*prepare)(struct snd_pcm_substream *);
|
||||
int (*trigger)(struct snd_pcm_substream *, int);
|
||||
};
|
||||
|
||||
/* ASoC codec DAI ops */
|
||||
struct snd_soc_codec_ops {
|
||||
/* codec DAI clocking configuration */
|
||||
int (*set_sysclk)(struct snd_soc_codec_dai *codec_dai,
|
||||
int clk_id, unsigned int freq, int dir);
|
||||
int (*set_pll)(struct snd_soc_codec_dai *codec_dai,
|
||||
int pll_id, unsigned int freq_in, unsigned int freq_out);
|
||||
int (*set_clkdiv)(struct snd_soc_codec_dai *codec_dai,
|
||||
int div_id, int div);
|
||||
|
||||
/* CPU DAI format configuration */
|
||||
int (*set_fmt)(struct snd_soc_codec_dai *codec_dai,
|
||||
unsigned int fmt);
|
||||
int (*set_tdm_slot)(struct snd_soc_codec_dai *codec_dai,
|
||||
unsigned int mask, int slots);
|
||||
int (*set_tristate)(struct snd_soc_codec_dai *, int tristate);
|
||||
|
||||
/* digital mute */
|
||||
int (*digital_mute)(struct snd_soc_codec_dai *, int mute);
|
||||
};
|
||||
|
||||
/* ASoC cpu DAI ops */
|
||||
struct snd_soc_cpu_ops {
|
||||
/* CPU DAI clocking configuration */
|
||||
int (*set_sysclk)(struct snd_soc_cpu_dai *cpu_dai,
|
||||
int clk_id, unsigned int freq, int dir);
|
||||
int (*set_clkdiv)(struct snd_soc_cpu_dai *cpu_dai,
|
||||
int div_id, int div);
|
||||
int (*set_pll)(struct snd_soc_cpu_dai *cpu_dai,
|
||||
int pll_id, unsigned int freq_in, unsigned int freq_out);
|
||||
|
||||
/* CPU DAI format configuration */
|
||||
int (*set_fmt)(struct snd_soc_cpu_dai *cpu_dai,
|
||||
unsigned int fmt);
|
||||
int (*set_tdm_slot)(struct snd_soc_cpu_dai *cpu_dai,
|
||||
unsigned int mask, int slots);
|
||||
int (*set_tristate)(struct snd_soc_cpu_dai *, int tristate);
|
||||
};
|
||||
|
||||
/* SoC Codec DAI */
|
||||
struct snd_soc_codec_dai {
|
||||
char *name;
|
||||
int id;
|
||||
unsigned char type;
|
||||
|
||||
/* DAI capabilities */
|
||||
struct snd_soc_pcm_stream playback;
|
||||
struct snd_soc_pcm_stream capture;
|
||||
|
||||
/* DAI runtime info */
|
||||
struct snd_soc_codec *codec;
|
||||
unsigned int active;
|
||||
unsigned char pop_wait:1;
|
||||
|
||||
/* ops */
|
||||
struct snd_soc_ops ops;
|
||||
struct snd_soc_codec_ops dai_ops;
|
||||
|
||||
/* DAI private data */
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
/* SoC CPU DAI */
|
||||
struct snd_soc_cpu_dai {
|
||||
|
||||
/* DAI description */
|
||||
char *name;
|
||||
unsigned int id;
|
||||
unsigned char type;
|
||||
|
||||
/* DAI callbacks */
|
||||
int (*probe)(struct platform_device *pdev);
|
||||
void (*remove)(struct platform_device *pdev);
|
||||
int (*suspend)(struct platform_device *pdev,
|
||||
struct snd_soc_cpu_dai *cpu_dai);
|
||||
int (*resume)(struct platform_device *pdev,
|
||||
struct snd_soc_cpu_dai *cpu_dai);
|
||||
|
||||
/* ops */
|
||||
struct snd_soc_ops ops;
|
||||
struct snd_soc_cpu_ops dai_ops;
|
||||
|
||||
/* DAI capabilities */
|
||||
struct snd_soc_pcm_stream capture;
|
||||
struct snd_soc_pcm_stream playback;
|
||||
|
||||
/* DAI runtime info */
|
||||
struct snd_pcm_runtime *runtime;
|
||||
unsigned char active:1;
|
||||
void *dma_data;
|
||||
|
||||
/* DAI private data */
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
/* SoC Audio Codec */
|
||||
struct snd_soc_codec {
|
||||
char *name;
|
||||
struct module *owner;
|
||||
struct mutex mutex;
|
||||
|
||||
/* callbacks */
|
||||
int (*dapm_event)(struct snd_soc_codec *codec, int event);
|
||||
|
||||
/* runtime */
|
||||
struct snd_card *card;
|
||||
struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */
|
||||
unsigned int active;
|
||||
unsigned int pcm_devs;
|
||||
void *private_data;
|
||||
|
||||
/* codec IO */
|
||||
void *control_data; /* codec control (i2c/3wire) data */
|
||||
unsigned int (*read)(struct snd_soc_codec *, unsigned int);
|
||||
int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
|
||||
hw_write_t hw_write;
|
||||
hw_read_t hw_read;
|
||||
void *reg_cache;
|
||||
short reg_cache_size;
|
||||
short reg_cache_step;
|
||||
|
||||
/* dapm */
|
||||
struct list_head dapm_widgets;
|
||||
struct list_head dapm_paths;
|
||||
unsigned int dapm_state;
|
||||
unsigned int suspend_dapm_state;
|
||||
struct delayed_work delayed_work;
|
||||
|
||||
/* codec DAI's */
|
||||
struct snd_soc_codec_dai *dai;
|
||||
unsigned int num_dai;
|
||||
};
|
||||
|
||||
/* codec device */
|
||||
struct snd_soc_codec_device {
|
||||
int (*probe)(struct platform_device *pdev);
|
||||
int (*remove)(struct platform_device *pdev);
|
||||
int (*suspend)(struct platform_device *pdev, pm_message_t state);
|
||||
int (*resume)(struct platform_device *pdev);
|
||||
};
|
||||
|
||||
/* SoC platform interface */
|
||||
struct snd_soc_platform {
|
||||
char *name;
|
||||
|
||||
int (*probe)(struct platform_device *pdev);
|
||||
int (*remove)(struct platform_device *pdev);
|
||||
int (*suspend)(struct platform_device *pdev,
|
||||
struct snd_soc_cpu_dai *cpu_dai);
|
||||
int (*resume)(struct platform_device *pdev,
|
||||
struct snd_soc_cpu_dai *cpu_dai);
|
||||
|
||||
/* pcm creation and destruction */
|
||||
int (*pcm_new)(struct snd_card *, struct snd_soc_codec_dai *,
|
||||
struct snd_pcm *);
|
||||
void (*pcm_free)(struct snd_pcm *);
|
||||
|
||||
/* platform stream ops */
|
||||
struct snd_pcm_ops *pcm_ops;
|
||||
};
|
||||
|
||||
/* SoC machine DAI configuration, glues a codec and cpu DAI together */
|
||||
struct snd_soc_dai_link {
|
||||
char *name; /* Codec name */
|
||||
char *stream_name; /* Stream name */
|
||||
|
||||
/* DAI */
|
||||
struct snd_soc_codec_dai *codec_dai;
|
||||
struct snd_soc_cpu_dai *cpu_dai;
|
||||
|
||||
/* machine stream operations */
|
||||
struct snd_soc_ops *ops;
|
||||
|
||||
/* codec/machine specific init - e.g. add machine controls */
|
||||
int (*init)(struct snd_soc_codec *codec);
|
||||
|
||||
/* DAI pcm */
|
||||
struct snd_pcm *pcm;
|
||||
};
|
||||
|
||||
/* SoC machine */
|
||||
struct snd_soc_machine {
|
||||
char *name;
|
||||
|
||||
int (*probe)(struct platform_device *pdev);
|
||||
int (*remove)(struct platform_device *pdev);
|
||||
|
||||
/* the pre and post PM functions are used to do any PM work before and
|
||||
* after the codec and DAI's do any PM work. */
|
||||
int (*suspend_pre)(struct platform_device *pdev, pm_message_t state);
|
||||
int (*suspend_post)(struct platform_device *pdev, pm_message_t state);
|
||||
int (*resume_pre)(struct platform_device *pdev);
|
||||
int (*resume_post)(struct platform_device *pdev);
|
||||
|
||||
/* callbacks */
|
||||
int (*dapm_event)(struct snd_soc_machine *, int event);
|
||||
|
||||
/* CPU <--> Codec DAI links */
|
||||
struct snd_soc_dai_link *dai_link;
|
||||
int num_links;
|
||||
};
|
||||
|
||||
/* SoC Device - the audio subsystem */
|
||||
struct snd_soc_device {
|
||||
struct device *dev;
|
||||
struct snd_soc_machine *machine;
|
||||
struct snd_soc_platform *platform;
|
||||
struct snd_soc_codec *codec;
|
||||
struct snd_soc_codec_device *codec_dev;
|
||||
struct delayed_work delayed_work;
|
||||
void *codec_data;
|
||||
};
|
||||
|
||||
/* runtime channel data */
|
||||
struct snd_soc_pcm_runtime {
|
||||
struct snd_soc_dai_link *dai;
|
||||
struct snd_soc_device *socdev;
|
||||
};
|
||||
|
||||
/* enumerated kcontrol */
|
||||
struct soc_enum {
|
||||
unsigned short reg;
|
||||
unsigned short reg2;
|
||||
unsigned char shift_l;
|
||||
unsigned char shift_r;
|
||||
unsigned int mask;
|
||||
const char **texts;
|
||||
void *dapm;
|
||||
};
|
||||
|
||||
#endif
|
||||
129
include/sound/soundfont.h
Normal file
129
include/sound/soundfont.h
Normal file
@@ -0,0 +1,129 @@
|
||||
#ifndef __SOUND_SOUNDFONT_H
|
||||
#define __SOUND_SOUNDFONT_H
|
||||
|
||||
/*
|
||||
* Soundfont defines and definitions.
|
||||
*
|
||||
* Copyright (C) 1999 Steve Ratcliffe
|
||||
* Copyright (c) 1999-2000 Takashi iwai <tiwai@suse.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "sfnt_info.h"
|
||||
#include "util_mem.h"
|
||||
|
||||
#define SF_MAX_INSTRUMENTS 128 /* maximum instrument number */
|
||||
#define SF_MAX_PRESETS 256 /* drums are mapped from 128 to 256 */
|
||||
#define SF_IS_DRUM_BANK(z) ((z) == 128)
|
||||
|
||||
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 */
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
struct snd_sf_sample {
|
||||
struct soundfont_sample_info v;
|
||||
int counter;
|
||||
struct snd_util_memblk *block; /* allocated data block */
|
||||
struct snd_sf_sample *next;
|
||||
};
|
||||
|
||||
/*
|
||||
* This represents all the information relating to a 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 */
|
||||
struct snd_sf_zone *zones; /* Font information */
|
||||
struct snd_sf_sample *samples; /* The sample headers */
|
||||
};
|
||||
|
||||
/*
|
||||
* Type of the sample access callback
|
||||
*/
|
||||
struct snd_sf_callback {
|
||||
void *private_data;
|
||||
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.
|
||||
*/
|
||||
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 */
|
||||
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 */
|
||||
struct snd_sf_callback callback; /* callback functions */
|
||||
int presets_locked;
|
||||
struct mutex presets_mutex;
|
||||
spinlock_t lock;
|
||||
struct snd_util_memhdr *memhdr;
|
||||
};
|
||||
|
||||
/* Prototypes for soundfont.c */
|
||||
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(struct snd_sf_list *sflist, int client);
|
||||
|
||||
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(struct snd_sf_list *sflist);
|
||||
int snd_soundfont_remove_unlocked(struct snd_sf_list *sflist);
|
||||
|
||||
int snd_soundfont_search_zone(struct snd_sf_list *sflist, int *notep, int vel,
|
||||
int preset, int bank,
|
||||
int def_preset, int def_bank,
|
||||
struct snd_sf_zone **table, int max_layers);
|
||||
|
||||
/* Parameter conversions */
|
||||
int snd_sf_calc_parm_hold(int msec);
|
||||
int snd_sf_calc_parm_attack(int msec);
|
||||
int snd_sf_calc_parm_decay(int msec);
|
||||
#define snd_sf_calc_parm_delay(msec) (0x8000 - (msec) * 1000 / 725);
|
||||
extern int snd_sf_vol_table[128];
|
||||
int snd_sf_linear_to_log(unsigned int amount, int offset, int ratio);
|
||||
|
||||
|
||||
#endif /* __SOUND_SOUNDFONT_H */
|
||||
21
include/sound/sscape_ioctl.h
Normal file
21
include/sound/sscape_ioctl.h
Normal file
@@ -0,0 +1,21 @@
|
||||
#ifndef SSCAPE_IOCTL_H
|
||||
#define SSCAPE_IOCTL_H
|
||||
|
||||
|
||||
struct sscape_bootblock
|
||||
{
|
||||
unsigned char code[256];
|
||||
unsigned version;
|
||||
};
|
||||
|
||||
#define SSCAPE_MICROCODE_SIZE 65536
|
||||
|
||||
struct sscape_microcode
|
||||
{
|
||||
unsigned char __user *code;
|
||||
};
|
||||
|
||||
#define SND_SSCAPE_LOAD_BOOTB _IOWR('P', 100, struct sscape_bootblock)
|
||||
#define SND_SSCAPE_LOAD_MCODE _IOW ('P', 101, struct sscape_microcode)
|
||||
|
||||
#endif
|
||||
52
include/sound/tea575x-tuner.h
Normal file
52
include/sound/tea575x-tuner.h
Normal file
@@ -0,0 +1,52 @@
|
||||
#ifndef __SOUND_TEA575X_TUNER_H
|
||||
#define __SOUND_TEA575X_TUNER_H
|
||||
|
||||
/*
|
||||
* ALSA driver for TEA5757/5759 Philips AM/FM tuner chips
|
||||
*
|
||||
* Copyright (c) 2004 Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/videodev.h>
|
||||
#include <media/v4l2-dev.h>
|
||||
|
||||
struct snd_tea575x;
|
||||
|
||||
struct snd_tea575x_ops {
|
||||
void (*write)(struct snd_tea575x *tea, unsigned int val);
|
||||
unsigned int (*read)(struct snd_tea575x *tea);
|
||||
};
|
||||
|
||||
struct snd_tea575x {
|
||||
struct snd_card *card;
|
||||
struct video_device vd; /* video device */
|
||||
struct file_operations fops;
|
||||
int dev_nr; /* requested device number + 1 */
|
||||
int vd_registered; /* video device is registered */
|
||||
int tea5759; /* 5759 chip is present */
|
||||
unsigned int freq_fixup; /* crystal onboard */
|
||||
unsigned int val; /* hw value */
|
||||
unsigned long freq; /* frequency */
|
||||
struct snd_tea575x_ops *ops;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
void snd_tea575x_init(struct snd_tea575x *tea);
|
||||
void snd_tea575x_exit(struct snd_tea575x *tea);
|
||||
|
||||
#endif /* __SOUND_TEA575X_TUNER_H */
|
||||
31
include/sound/tea6330t.h
Normal file
31
include/sound/tea6330t.h
Normal file
@@ -0,0 +1,31 @@
|
||||
#ifndef __SOUND_TEA6330T_H
|
||||
#define __SOUND_TEA6330T_H
|
||||
|
||||
/*
|
||||
* Routines for control of TEA6330T circuit.
|
||||
* Sound fader control circuit for car radios.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "i2c.h" /* generic i2c support */
|
||||
|
||||
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 */
|
||||
143
include/sound/timer.h
Normal file
143
include/sound/timer.h
Normal file
@@ -0,0 +1,143 @@
|
||||
#ifndef __SOUND_TIMER_H
|
||||
#define __SOUND_TIMER_H
|
||||
|
||||
/*
|
||||
* Timer abstract layer
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
|
||||
* Abramo Bagnara <abramo@alsa-project.org>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sound/asound.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#define snd_timer_chip(timer) ((timer)->private_data)
|
||||
|
||||
#define SNDRV_TIMER_DEVICES 16
|
||||
|
||||
#define SNDRV_TIMER_DEV_FLG_PCM 0x10000000
|
||||
|
||||
#define SNDRV_TIMER_HW_AUTO 0x00000001 /* auto trigger is supported */
|
||||
#define SNDRV_TIMER_HW_STOP 0x00000002 /* call stop before start */
|
||||
#define SNDRV_TIMER_HW_SLAVE 0x00000004 /* only slave timer (variable resolution) */
|
||||
#define SNDRV_TIMER_HW_FIRST 0x00000008 /* first tick can be incomplete */
|
||||
#define SNDRV_TIMER_HW_TASKLET 0x00000010 /* timer is called from tasklet */
|
||||
|
||||
#define SNDRV_TIMER_IFLG_SLAVE 0x00000001
|
||||
#define SNDRV_TIMER_IFLG_RUNNING 0x00000002
|
||||
#define SNDRV_TIMER_IFLG_START 0x00000004
|
||||
#define SNDRV_TIMER_IFLG_AUTO 0x00000008 /* auto restart */
|
||||
#define SNDRV_TIMER_IFLG_FAST 0x00000010 /* fast callback (do not use tasklet) */
|
||||
#define SNDRV_TIMER_IFLG_CALLBACK 0x00000020 /* timer callback is active */
|
||||
#define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040 /* exclusive owner - no more instances */
|
||||
#define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080 /* write early event to the poll queue */
|
||||
|
||||
#define SNDRV_TIMER_FLG_CHANGE 0x00000001
|
||||
#define SNDRV_TIMER_FLG_RESCHED 0x00000002 /* need reschedule */
|
||||
|
||||
struct snd_timer;
|
||||
|
||||
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 */
|
||||
unsigned long resolution_min; /* minimal resolution */
|
||||
unsigned long resolution_max; /* maximal resolution */
|
||||
unsigned long ticks; /* max timer ticks per interrupt */
|
||||
/* -- low-level functions -- */
|
||||
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 {
|
||||
int tmr_class;
|
||||
struct snd_card *card;
|
||||
struct module *module;
|
||||
int tmr_device;
|
||||
int tmr_subdevice;
|
||||
char id[64];
|
||||
char name[80];
|
||||
unsigned int flags;
|
||||
int running; /* running instances */
|
||||
unsigned long sticks; /* schedule ticks */
|
||||
void *private_data;
|
||||
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;
|
||||
struct list_head active_list_head;
|
||||
struct list_head ack_list_head;
|
||||
struct list_head sack_list_head; /* slow ack list head */
|
||||
struct tasklet_struct task_queue;
|
||||
};
|
||||
|
||||
struct snd_timer_instance {
|
||||
struct snd_timer *timer;
|
||||
char *owner;
|
||||
unsigned int flags;
|
||||
void *private_data;
|
||||
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 */
|
||||
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;
|
||||
struct snd_timer_instance *master;
|
||||
};
|
||||
|
||||
/*
|
||||
* Registering
|
||||
*/
|
||||
|
||||
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_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);
|
||||
|
||||
void snd_timer_interrupt(struct snd_timer *timer, unsigned long ticks_left);
|
||||
|
||||
#endif /* __SOUND_TIMER_H */
|
||||
60
include/sound/tlv.h
Normal file
60
include/sound/tlv.h
Normal file
@@ -0,0 +1,60 @@
|
||||
#ifndef __SOUND_TLV_H
|
||||
#define __SOUND_TLV_H
|
||||
|
||||
/*
|
||||
* Advanced Linux Sound Architecture - ALSA - Driver
|
||||
* Copyright (c) 2006 by Jaroslav Kysela <perex@suse.cz>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* TLV structure is right behind the struct snd_ctl_tlv:
|
||||
* unsigned int type - see SNDRV_CTL_TLVT_*
|
||||
* unsigned int length
|
||||
* .... data aligned to sizeof(unsigned int), use
|
||||
* block_length = (length + (sizeof(unsigned int) - 1)) &
|
||||
* ~(sizeof(unsigned int) - 1)) ....
|
||||
*/
|
||||
|
||||
#define SNDRV_CTL_TLVT_CONTAINER 0 /* one level down - group of TLVs */
|
||||
#define SNDRV_CTL_TLVT_DB_SCALE 1 /* dB scale */
|
||||
#define SNDRV_CTL_TLVT_DB_LINEAR 2 /* linear volume */
|
||||
#define SNDRV_CTL_TLVT_DB_RANGE 3 /* dB range container */
|
||||
|
||||
#define TLV_DB_SCALE_ITEM(min, step, mute) \
|
||||
SNDRV_CTL_TLVT_DB_SCALE, 2 * sizeof(unsigned int), \
|
||||
(min), ((step) & 0xffff) | ((mute) ? 0x10000 : 0)
|
||||
#define DECLARE_TLV_DB_SCALE(name, min, step, mute) \
|
||||
unsigned int name[] = { TLV_DB_SCALE_ITEM(min, step, mute) }
|
||||
|
||||
/* linear volume between min_dB and max_dB (.01dB unit) */
|
||||
#define TLV_DB_LINEAR_ITEM(min_dB, max_dB) \
|
||||
SNDRV_CTL_TLVT_DB_LINEAR, 2 * sizeof(unsigned int), \
|
||||
(min_dB), (max_dB)
|
||||
#define DECLARE_TLV_DB_LINEAR(name, min_dB, max_dB) \
|
||||
unsigned int name[] = { TLV_DB_LINEAR_ITEM(min_dB, max_dB) }
|
||||
|
||||
/* dB range container */
|
||||
/* Each item is: <min> <max> <TLV> */
|
||||
/* The below assumes that each item TLV is 4 words like DB_SCALE or LINEAR */
|
||||
#define TLV_DB_RANGE_HEAD(num) \
|
||||
SNDRV_CTL_TLVT_DB_RANGE, 6 * (num) * sizeof(unsigned int)
|
||||
|
||||
#define TLV_DB_GAIN_MUTE -9999999
|
||||
|
||||
#endif /* __SOUND_TLV_H */
|
||||
467
include/sound/trident.h
Normal file
467
include/sound/trident.h
Normal file
@@ -0,0 +1,467 @@
|
||||
#ifndef __SOUND_TRIDENT_H
|
||||
#define __SOUND_TRIDENT_H
|
||||
|
||||
/*
|
||||
* audio@tridentmicro.com
|
||||
* Fri Feb 19 15:55:28 MST 1999
|
||||
* Definitions for Trident 4DWave DX/NX chips
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "pcm.h"
|
||||
#include "mpu401.h"
|
||||
#include "ac97_codec.h"
|
||||
#include "seq_midi_emul.h"
|
||||
#include "seq_device.h"
|
||||
#include "util_mem.h"
|
||||
//#include "ainstr_iw.h"
|
||||
//#include "ainstr_gf1.h"
|
||||
#include "ainstr_simple.h"
|
||||
|
||||
#define TRIDENT_DEVICE_ID_DX ((PCI_VENDOR_ID_TRIDENT<<16)|PCI_DEVICE_ID_TRIDENT_4DWAVE_DX)
|
||||
#define TRIDENT_DEVICE_ID_NX ((PCI_VENDOR_ID_TRIDENT<<16)|PCI_DEVICE_ID_TRIDENT_4DWAVE_NX)
|
||||
#define TRIDENT_DEVICE_ID_SI7018 ((PCI_VENDOR_ID_SI<<16)|PCI_DEVICE_ID_SI_7018)
|
||||
|
||||
#define SNDRV_SEQ_DEV_ID_TRIDENT "trident-synth"
|
||||
|
||||
#define SNDRV_TRIDENT_VOICE_TYPE_PCM 0
|
||||
#define SNDRV_TRIDENT_VOICE_TYPE_SYNTH 1
|
||||
#define SNDRV_TRIDENT_VOICE_TYPE_MIDI 2
|
||||
|
||||
#define SNDRV_TRIDENT_VFLG_RUNNING (1<<0)
|
||||
|
||||
/* TLB code constants */
|
||||
#define SNDRV_TRIDENT_PAGE_SIZE 4096
|
||||
#define SNDRV_TRIDENT_PAGE_SHIFT 12
|
||||
#define SNDRV_TRIDENT_PAGE_MASK ((1<<SNDRV_TRIDENT_PAGE_SHIFT)-1)
|
||||
#define SNDRV_TRIDENT_MAX_PAGES 4096
|
||||
|
||||
/*
|
||||
* Direct registers
|
||||
*/
|
||||
|
||||
#define TRID_REG(trident, x) ((trident)->port + (x))
|
||||
|
||||
#define ID_4DWAVE_DX 0x2000
|
||||
#define ID_4DWAVE_NX 0x2001
|
||||
|
||||
/* Bank definitions */
|
||||
|
||||
#define T4D_BANK_A 0
|
||||
#define T4D_BANK_B 1
|
||||
#define T4D_NUM_BANKS 2
|
||||
|
||||
/* Register definitions */
|
||||
|
||||
/* Global registers */
|
||||
|
||||
enum global_control_bits {
|
||||
CHANNEL_IDX = 0x0000003f,
|
||||
OVERRUN_IE = 0x00000400, /* interrupt enable: capture overrun */
|
||||
UNDERRUN_IE = 0x00000800, /* interrupt enable: playback underrun */
|
||||
ENDLP_IE = 0x00001000, /* interrupt enable: end of buffer */
|
||||
MIDLP_IE = 0x00002000, /* interrupt enable: middle buffer */
|
||||
ETOG_IE = 0x00004000, /* interrupt enable: envelope toggling */
|
||||
EDROP_IE = 0x00008000, /* interrupt enable: envelope drop */
|
||||
BANK_B_EN = 0x00010000, /* SiS: enable bank B (64 channels) */
|
||||
PCMIN_B_MIX = 0x00020000, /* SiS: PCM IN B mixing enable */
|
||||
I2S_OUT_ASSIGN = 0x00040000, /* SiS: I2S Out contains surround PCM */
|
||||
SPDIF_OUT_ASSIGN= 0x00080000, /* SiS: 0=S/PDIF L/R | 1=PCM Out FIFO */
|
||||
MAIN_OUT_ASSIGN = 0x00100000, /* SiS: 0=PCM Out FIFO | 1=MMC Out buffer */
|
||||
};
|
||||
|
||||
enum miscint_bits {
|
||||
PB_UNDERRUN_IRQ = 0x00000001, REC_OVERRUN_IRQ = 0x00000002,
|
||||
SB_IRQ = 0x00000004, MPU401_IRQ = 0x00000008,
|
||||
OPL3_IRQ = 0x00000010, ADDRESS_IRQ = 0x00000020,
|
||||
ENVELOPE_IRQ = 0x00000040, PB_UNDERRUN = 0x00000100,
|
||||
REC_OVERRUN = 0x00000200, MIXER_UNDERFLOW = 0x00000400,
|
||||
MIXER_OVERFLOW = 0x00000800, NX_SB_IRQ_DISABLE = 0x00001000,
|
||||
ST_TARGET_REACHED = 0x00008000,
|
||||
PB_24K_MODE = 0x00010000, ST_IRQ_EN = 0x00800000,
|
||||
ACGPIO_IRQ = 0x01000000
|
||||
};
|
||||
|
||||
/* T2 legacy dma control registers. */
|
||||
#define LEGACY_DMAR0 0x00 // ADR0
|
||||
#define LEGACY_DMAR4 0x04 // CNT0
|
||||
#define LEGACY_DMAR6 0x06 // CNT0 - High bits
|
||||
#define LEGACY_DMAR11 0x0b // MOD
|
||||
#define LEGACY_DMAR15 0x0f // MMR
|
||||
|
||||
#define T4D_START_A 0x80
|
||||
#define T4D_STOP_A 0x84
|
||||
#define T4D_DLY_A 0x88
|
||||
#define T4D_SIGN_CSO_A 0x8c
|
||||
#define T4D_CSPF_A 0x90
|
||||
#define T4D_CSPF_B 0xbc
|
||||
#define T4D_CEBC_A 0x94
|
||||
#define T4D_AINT_A 0x98
|
||||
#define T4D_AINTEN_A 0x9c
|
||||
#define T4D_LFO_GC_CIR 0xa0
|
||||
#define T4D_MUSICVOL_WAVEVOL 0xa8
|
||||
#define T4D_SBDELTA_DELTA_R 0xac
|
||||
#define T4D_MISCINT 0xb0
|
||||
#define T4D_START_B 0xb4
|
||||
#define T4D_STOP_B 0xb8
|
||||
#define T4D_SBBL_SBCL 0xc0
|
||||
#define T4D_SBCTRL_SBE2R_SBDD 0xc4
|
||||
#define T4D_STIMER 0xc8
|
||||
#define T4D_AINT_B 0xd8
|
||||
#define T4D_AINTEN_B 0xdc
|
||||
#define T4D_RCI 0x70
|
||||
|
||||
/* MPU-401 UART */
|
||||
#define T4D_MPU401_BASE 0x20
|
||||
#define T4D_MPUR0 0x20
|
||||
#define T4D_MPUR1 0x21
|
||||
#define T4D_MPUR2 0x22
|
||||
#define T4D_MPUR3 0x23
|
||||
|
||||
/* S/PDIF Registers */
|
||||
#define NX_SPCTRL_SPCSO 0x24
|
||||
#define NX_SPLBA 0x28
|
||||
#define NX_SPESO 0x2c
|
||||
#define NX_SPCSTATUS 0x64
|
||||
|
||||
/* Joystick */
|
||||
#define GAMEPORT_GCR 0x30
|
||||
#define GAMEPORT_MODE_ADC 0x80
|
||||
#define GAMEPORT_LEGACY 0x31
|
||||
#define GAMEPORT_AXES 0x34
|
||||
|
||||
/* NX Specific Registers */
|
||||
#define NX_TLBC 0x6c
|
||||
|
||||
/* Channel Registers */
|
||||
|
||||
#define CH_START 0xe0
|
||||
|
||||
#define CH_DX_CSO_ALPHA_FMS 0xe0
|
||||
#define CH_DX_ESO_DELTA 0xe8
|
||||
#define CH_DX_FMC_RVOL_CVOL 0xec
|
||||
|
||||
#define CH_NX_DELTA_CSO 0xe0
|
||||
#define CH_NX_DELTA_ESO 0xe8
|
||||
#define CH_NX_ALPHA_FMS_FMC_RVOL_CVOL 0xec
|
||||
|
||||
#define CH_LBA 0xe4
|
||||
#define CH_GVSEL_PAN_VOL_CTRL_EC 0xf0
|
||||
#define CH_EBUF1 0xf4
|
||||
#define CH_EBUF2 0xf8
|
||||
|
||||
/* AC-97 Registers */
|
||||
|
||||
#define DX_ACR0_AC97_W 0x40
|
||||
#define DX_ACR1_AC97_R 0x44
|
||||
#define DX_ACR2_AC97_COM_STAT 0x48
|
||||
|
||||
#define NX_ACR0_AC97_COM_STAT 0x40
|
||||
#define NX_ACR1_AC97_W 0x44
|
||||
#define NX_ACR2_AC97_R_PRIMARY 0x48
|
||||
#define NX_ACR3_AC97_R_SECONDARY 0x4c
|
||||
|
||||
#define SI_AC97_WRITE 0x40
|
||||
#define SI_AC97_READ 0x44
|
||||
#define SI_SERIAL_INTF_CTRL 0x48
|
||||
#define SI_AC97_GPIO 0x4c
|
||||
#define SI_ASR0 0x50
|
||||
#define SI_SPDIF_CS 0x70
|
||||
#define SI_GPIO 0x7c
|
||||
|
||||
enum trident_nx_ac97_bits {
|
||||
/* ACR1-3 */
|
||||
NX_AC97_BUSY_WRITE = 0x0800,
|
||||
NX_AC97_BUSY_READ = 0x0800,
|
||||
NX_AC97_BUSY_DATA = 0x0400,
|
||||
NX_AC97_WRITE_SECONDARY = 0x0100,
|
||||
/* ACR0 */
|
||||
NX_AC97_SECONDARY_READY = 0x0040,
|
||||
NX_AC97_SECONDARY_RECORD = 0x0020,
|
||||
NX_AC97_SURROUND_OUTPUT = 0x0010,
|
||||
NX_AC97_PRIMARY_READY = 0x0008,
|
||||
NX_AC97_PRIMARY_RECORD = 0x0004,
|
||||
NX_AC97_PCM_OUTPUT = 0x0002,
|
||||
NX_AC97_WARM_RESET = 0x0001
|
||||
};
|
||||
|
||||
enum trident_dx_ac97_bits {
|
||||
DX_AC97_BUSY_WRITE = 0x8000,
|
||||
DX_AC97_BUSY_READ = 0x8000,
|
||||
DX_AC97_READY = 0x0010,
|
||||
DX_AC97_RECORD = 0x0008,
|
||||
DX_AC97_PLAYBACK = 0x0002
|
||||
};
|
||||
|
||||
enum sis7018_ac97_bits {
|
||||
SI_AC97_BUSY_WRITE = 0x00008000,
|
||||
SI_AC97_AUDIO_BUSY = 0x00004000,
|
||||
SI_AC97_MODEM_BUSY = 0x00002000,
|
||||
SI_AC97_BUSY_READ = 0x00008000,
|
||||
SI_AC97_SECONDARY = 0x00000080,
|
||||
};
|
||||
|
||||
enum serial_intf_ctrl_bits {
|
||||
WARM_RESET = 0x00000001,
|
||||
COLD_RESET = 0x00000002,
|
||||
I2S_CLOCK = 0x00000004,
|
||||
PCM_SEC_AC97 = 0x00000008,
|
||||
AC97_DBL_RATE = 0x00000010,
|
||||
SPDIF_EN = 0x00000020,
|
||||
I2S_OUTPUT_EN = 0x00000040,
|
||||
I2S_INPUT_EN = 0x00000080,
|
||||
PCMIN = 0x00000100,
|
||||
LINE1IN = 0x00000200,
|
||||
MICIN = 0x00000400,
|
||||
LINE2IN = 0x00000800,
|
||||
HEAD_SET_IN = 0x00001000,
|
||||
GPIOIN = 0x00002000,
|
||||
/* 7018 spec says id = 01 but the demo board routed to 10
|
||||
SECONDARY_ID= 0x00004000, */
|
||||
SECONDARY_ID = 0x00004000,
|
||||
PCMOUT = 0x00010000,
|
||||
SURROUT = 0x00020000,
|
||||
CENTEROUT = 0x00040000,
|
||||
LFEOUT = 0x00080000,
|
||||
LINE1OUT = 0x00100000,
|
||||
LINE2OUT = 0x00200000,
|
||||
GPIOOUT = 0x00400000,
|
||||
SI_AC97_PRIMARY_READY = 0x01000000,
|
||||
SI_AC97_SECONDARY_READY = 0x02000000,
|
||||
SI_AC97_POWERDOWN = 0x04000000,
|
||||
};
|
||||
|
||||
/* PCM defaults */
|
||||
|
||||
#define T4D_DEFAULT_PCM_VOL 10 /* 0 - 255 */
|
||||
#define T4D_DEFAULT_PCM_PAN 0 /* 0 - 127 */
|
||||
#define T4D_DEFAULT_PCM_RVOL 127 /* 0 - 127 */
|
||||
#define T4D_DEFAULT_PCM_CVOL 127 /* 0 - 127 */
|
||||
|
||||
struct snd_trident;
|
||||
struct snd_trident_voice;
|
||||
struct snd_trident_pcm_mixer;
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
struct snd_trident_memblk_arg {
|
||||
short first_page, last_page;
|
||||
};
|
||||
|
||||
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;
|
||||
struct snd_util_memhdr * memhdr; /* page allocation list */
|
||||
struct snd_dma_buffer silent_page;
|
||||
};
|
||||
|
||||
struct snd_trident_voice {
|
||||
unsigned int number;
|
||||
unsigned int use: 1,
|
||||
pcm: 1,
|
||||
synth:1,
|
||||
midi: 1;
|
||||
unsigned int flags;
|
||||
unsigned char client;
|
||||
unsigned char port;
|
||||
unsigned char index;
|
||||
|
||||
struct snd_seq_instr instr;
|
||||
struct snd_trident_sample_ops *sample_ops;
|
||||
|
||||
/* channel parameters */
|
||||
unsigned int CSO; /* 24 bits (16 on DX) */
|
||||
unsigned int ESO; /* 24 bits (16 on DX) */
|
||||
unsigned int LBA; /* 30 bits */
|
||||
unsigned short EC; /* 12 bits */
|
||||
unsigned short Alpha; /* 12 bits */
|
||||
unsigned short Delta; /* 16 bits */
|
||||
unsigned short Attribute; /* 16 bits - SiS 7018 */
|
||||
unsigned short Vol; /* 12 bits (6.6) */
|
||||
unsigned char Pan; /* 7 bits (1.4.2) */
|
||||
unsigned char GVSel; /* 1 bit */
|
||||
unsigned char RVol; /* 7 bits (5.2) */
|
||||
unsigned char CVol; /* 7 bits (5.2) */
|
||||
unsigned char FMC; /* 2 bits */
|
||||
unsigned char CTRL; /* 4 bits */
|
||||
unsigned char FMS; /* 4 bits */
|
||||
unsigned char LFO; /* 8 bits */
|
||||
|
||||
unsigned int negCSO; /* nonzero - use negative CSO */
|
||||
|
||||
struct snd_util_memblk *memblk; /* memory block if TLB enabled */
|
||||
|
||||
/* PCM data */
|
||||
|
||||
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,
|
||||
foldback: 1,
|
||||
isync: 1,
|
||||
isync2: 1,
|
||||
isync3: 1;
|
||||
int foldback_chan; /* foldback subdevice number */
|
||||
unsigned int stimer; /* global sample timer (to detect spurious interrupts) */
|
||||
unsigned int spurious_threshold; /* spurious threshold */
|
||||
unsigned int isync_mark;
|
||||
unsigned int isync_max;
|
||||
unsigned int isync_ESO;
|
||||
|
||||
/* --- */
|
||||
|
||||
void *private_data;
|
||||
void (*private_free)(struct snd_trident_voice *voice);
|
||||
};
|
||||
|
||||
struct snd_4dwave {
|
||||
int seq_client;
|
||||
|
||||
struct snd_trident_port seq_ports[4];
|
||||
struct snd_simple_ops simple_ops;
|
||||
struct snd_seq_kinstr_list *ilist;
|
||||
|
||||
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 {
|
||||
struct snd_trident_voice *voice; /* active voice */
|
||||
unsigned short vol; /* front volume */
|
||||
unsigned char pan; /* pan control */
|
||||
unsigned char rvol; /* rear volume */
|
||||
unsigned char cvol; /* center volume */
|
||||
unsigned char pad;
|
||||
};
|
||||
|
||||
struct snd_trident {
|
||||
int irq;
|
||||
|
||||
unsigned int device; /* device ID */
|
||||
|
||||
unsigned char bDMAStart;
|
||||
|
||||
unsigned long port;
|
||||
unsigned long midi_port;
|
||||
|
||||
unsigned int spurious_irq_count;
|
||||
unsigned int spurious_irq_max_delta;
|
||||
|
||||
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;
|
||||
struct snd_kcontrol *spdif_pcm_ctl; /* S/PDIF settings */
|
||||
unsigned int ac97_ctrl;
|
||||
|
||||
unsigned int ChanMap[2]; /* allocation map for hardware channels */
|
||||
|
||||
int ChanPCM; /* max number of PCM channels */
|
||||
int ChanPCMcnt; /* actual number of PCM channels */
|
||||
|
||||
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 */
|
||||
|
||||
spinlock_t event_lock;
|
||||
spinlock_t voice_alloc;
|
||||
|
||||
struct snd_dma_device dma_dev;
|
||||
|
||||
struct pci_dev *pci;
|
||||
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;
|
||||
|
||||
struct snd_ac97_bus *ac97_bus;
|
||||
struct snd_ac97 *ac97;
|
||||
struct snd_ac97 *ac97_sec;
|
||||
|
||||
unsigned int musicvol_wavevol;
|
||||
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(struct snd_card *card,
|
||||
struct pci_dev *pci,
|
||||
int pcm_streams,
|
||||
int pcm_spdif_device,
|
||||
int max_wavetable_size,
|
||||
struct snd_trident ** rtrident);
|
||||
int snd_trident_create_gameport(struct snd_trident *trident);
|
||||
|
||||
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 */
|
||||
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 */
|
||||
128
include/sound/uda1341.h
Normal file
128
include/sound/uda1341.h
Normal file
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* linux/include/linux/l3/uda1341.h
|
||||
*
|
||||
* Philips UDA1341 mixer device driver for ALSA
|
||||
*
|
||||
* Copyright (c) 2002 Tomas Kasparek <tomas.kasparek@seznam.cz>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License.
|
||||
*
|
||||
* History:
|
||||
*
|
||||
* 2002-03-13 Tomas Kasparek Initial release - based on uda1341.h from OSS
|
||||
* 2002-03-30 Tomas Kasparek Proc filesystem support, complete mixer and DSP
|
||||
* features support
|
||||
*/
|
||||
|
||||
/* $Id: uda1341.h,v 1.2 2007/06/29 06:47:59 eyryu Exp $ */
|
||||
|
||||
#define UDA1341_ALSA_NAME "snd-uda1341"
|
||||
|
||||
/*
|
||||
* Default rate set after inicialization
|
||||
*/
|
||||
#define AUDIO_RATE_DEFAULT 44100
|
||||
|
||||
/*
|
||||
* UDA1341 L3 address and command types
|
||||
*/
|
||||
#define UDA1341_L3ADDR 5
|
||||
#define UDA1341_DATA0 (UDA1341_L3ADDR << 2 | 0)
|
||||
#define UDA1341_DATA1 (UDA1341_L3ADDR << 2 | 1)
|
||||
#define UDA1341_STATUS (UDA1341_L3ADDR << 2 | 2)
|
||||
|
||||
enum uda1341_onoff {
|
||||
OFF=0,
|
||||
ON,
|
||||
};
|
||||
|
||||
enum uda1341_format {
|
||||
I2S=0,
|
||||
LSB16,
|
||||
LSB18,
|
||||
LSB20,
|
||||
MSB,
|
||||
LSB16MSB,
|
||||
LSB18MSB,
|
||||
LSB20MSB,
|
||||
};
|
||||
|
||||
enum uda1341_fs {
|
||||
F512=0,
|
||||
F384,
|
||||
F256,
|
||||
Funused,
|
||||
};
|
||||
|
||||
enum uda1341_peak {
|
||||
BEFORE=0,
|
||||
AFTER,
|
||||
};
|
||||
|
||||
enum uda1341_filter {
|
||||
FLAT=0,
|
||||
MIN,
|
||||
MIN2,
|
||||
MAX,
|
||||
};
|
||||
|
||||
enum uda1341_mixer {
|
||||
DOUBLE,
|
||||
LINE,
|
||||
MIC,
|
||||
MIXER,
|
||||
};
|
||||
|
||||
enum uda1341_deemp {
|
||||
NONE,
|
||||
D32,
|
||||
D44,
|
||||
D48,
|
||||
};
|
||||
|
||||
enum uda1341_config {
|
||||
CMD_READ_REG = 0,
|
||||
CMD_RESET,
|
||||
CMD_FS,
|
||||
CMD_FORMAT,
|
||||
CMD_OGAIN,
|
||||
CMD_IGAIN,
|
||||
CMD_DAC,
|
||||
CMD_ADC,
|
||||
CMD_VOLUME,
|
||||
CMD_BASS,
|
||||
CMD_TREBBLE,
|
||||
CMD_PEAK,
|
||||
CMD_DEEMP,
|
||||
CMD_MUTE,
|
||||
CMD_FILTER,
|
||||
CMD_CH1,
|
||||
CMD_CH2,
|
||||
CMD_MIC,
|
||||
CMD_MIXER,
|
||||
CMD_AGC,
|
||||
CMD_IG,
|
||||
CMD_AGC_TIME,
|
||||
CMD_AGC_LEVEL,
|
||||
#ifdef CONFIG_PM
|
||||
CMD_SUSPEND,
|
||||
CMD_RESUME,
|
||||
#endif
|
||||
CMD_LAST,
|
||||
};
|
||||
|
||||
enum write_through {
|
||||
//used in update_bits (write_cfg) to avoid l3_write - just update local copy of regs.
|
||||
REGS_ONLY=0,
|
||||
//update local regs and write value to uda1341 - do l3_write
|
||||
FLUSH,
|
||||
};
|
||||
|
||||
int __init snd_chip_uda1341_mixer_new(struct snd_card *card, struct l3_client **clnt);
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* indent-tabs-mode: t
|
||||
* End:
|
||||
*/
|
||||
64
include/sound/util_mem.h
Normal file
64
include/sound/util_mem.h
Normal file
@@ -0,0 +1,64 @@
|
||||
#ifndef __SOUND_UTIL_MEM_H
|
||||
#define __SOUND_UTIL_MEM_H
|
||||
|
||||
#include <linux/mutex.h>
|
||||
/*
|
||||
* Copyright (C) 2000 Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* Generic memory management routines for soundcard memory allocation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* memory block
|
||||
*/
|
||||
struct snd_util_memblk {
|
||||
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(struct snd_util_memblk))
|
||||
|
||||
/*
|
||||
* memory management information
|
||||
*/
|
||||
struct snd_util_memhdr {
|
||||
unsigned int size; /* size of whole data */
|
||||
struct list_head block; /* block linked-list header */
|
||||
int nblocks; /* # of allocated blocks */
|
||||
unsigned int used; /* used memory size */
|
||||
int block_extra_size; /* extra data size of chunk */
|
||||
struct mutex block_mutex; /* lock */
|
||||
};
|
||||
|
||||
/*
|
||||
* prototypes
|
||||
*/
|
||||
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 */
|
||||
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 */
|
||||
3
include/sound/version.h
Normal file
3
include/sound/version.h
Normal file
@@ -0,0 +1,3 @@
|
||||
/* include/version.h. Generated by alsa/ksync script. */
|
||||
#define CONFIG_SND_VERSION "1.0.14rc3"
|
||||
#define CONFIG_SND_DATE " (Wed Mar 14 07:25:50 2007 UTC)"
|
||||
566
include/sound/vx_core.h
Normal file
566
include/sound/vx_core.h
Normal file
@@ -0,0 +1,566 @@
|
||||
/*
|
||||
* Driver for Digigram VX soundcards
|
||||
*
|
||||
* Hardware core part
|
||||
*
|
||||
* Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_VX_COMMON_H
|
||||
#define __SOUND_VX_COMMON_H
|
||||
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/hwdep.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
|
||||
#if !defined(CONFIG_USE_VXLOADER) && !defined(CONFIG_SND_VX_LIB) /* built-in kernel */
|
||||
#define SND_VX_FW_LOADER /* use the standard firmware loader */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct firmware;
|
||||
struct device;
|
||||
|
||||
#define VX_DRIVER_VERSION 0x010000 /* 1.0.0 */
|
||||
|
||||
/*
|
||||
*/
|
||||
#define SIZE_MAX_CMD 0x10
|
||||
#define SIZE_MAX_STATUS 0x10
|
||||
|
||||
struct vx_rmh {
|
||||
u16 LgCmd; /* length of the command to send (WORDs) */
|
||||
u16 LgStat; /* length of the status received (WORDs) */
|
||||
u32 Cmd[SIZE_MAX_CMD];
|
||||
u32 Stat[SIZE_MAX_STATUS];
|
||||
u16 DspStat; /* status type, RMP_SSIZE_XXX */
|
||||
};
|
||||
|
||||
typedef u64 pcx_time_t;
|
||||
|
||||
#define VX_MAX_PIPES 16
|
||||
#define VX_MAX_PERIODS 32
|
||||
#define VX_MAX_CODECS 2
|
||||
|
||||
struct vx_ibl_info {
|
||||
int size; /* the current IBL size (0 = query) in bytes */
|
||||
int max_size; /* max. IBL size in bytes */
|
||||
int min_size; /* min. IBL size in bytes */
|
||||
int granularity; /* granularity */
|
||||
};
|
||||
|
||||
struct vx_pipe {
|
||||
int number;
|
||||
unsigned int is_capture: 1;
|
||||
unsigned int data_mode: 1;
|
||||
unsigned int running: 1;
|
||||
unsigned int prepared: 1;
|
||||
int channels;
|
||||
unsigned int differed_type;
|
||||
pcx_time_t pcx_time;
|
||||
struct snd_pcm_substream *substream;
|
||||
|
||||
int hbuf_size; /* H-buffer size in bytes */
|
||||
int buffer_bytes; /* the ALSA pcm buffer size in bytes */
|
||||
int period_bytes; /* the ALSA pcm period size in bytes */
|
||||
int hw_ptr; /* the current hardware pointer in bytes */
|
||||
int position; /* the current position in frames (playback only) */
|
||||
int transferred; /* the transferred size (per period) in frames */
|
||||
int align; /* size of alignment */
|
||||
u64 cur_count; /* current sample position (for playback) */
|
||||
|
||||
unsigned int references; /* an output pipe may be used for monitoring and/or playback */
|
||||
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)(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)(struct vx_core *chip);
|
||||
void (*validate_irq)(struct vx_core *chip, int enable);
|
||||
/* codec */
|
||||
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)(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)(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 {
|
||||
const char *name;
|
||||
int type; /* VX_TYPE_XXX */
|
||||
|
||||
/* hardware specs */
|
||||
unsigned int num_codecs;
|
||||
unsigned int num_ins;
|
||||
unsigned int num_outs;
|
||||
unsigned int output_level_max;
|
||||
const unsigned int *output_level_db_scale;
|
||||
};
|
||||
|
||||
/* hwdep id string */
|
||||
#define SND_VX_HWDEP_ID "VX Loader"
|
||||
|
||||
/* hardware type */
|
||||
enum {
|
||||
/* VX222 PCI */
|
||||
VX_TYPE_BOARD, /* old VX222 PCI */
|
||||
VX_TYPE_V2, /* VX222 V2 PCI */
|
||||
VX_TYPE_MIC, /* VX222 Mic PCI */
|
||||
/* VX-pocket */
|
||||
VX_TYPE_VXPOCKET, /* VXpocket V2 */
|
||||
VX_TYPE_VXP440, /* VXpocket 440 */
|
||||
VX_TYPE_NUMS
|
||||
};
|
||||
|
||||
/* chip status */
|
||||
enum {
|
||||
VX_STAT_XILINX_LOADED = (1 << 0), /* devices are registered */
|
||||
VX_STAT_DEVICE_INIT = (1 << 1), /* devices are registered */
|
||||
VX_STAT_CHIP_INIT = (1 << 2), /* all operational */
|
||||
VX_STAT_IN_SUSPEND = (1 << 10), /* in suspend phase */
|
||||
VX_STAT_IS_STALE = (1 << 15) /* device is stale */
|
||||
};
|
||||
|
||||
/* min/max values for analog output for old codecs */
|
||||
#define VX_ANALOG_OUT_LEVEL_MAX 0xe3
|
||||
|
||||
struct vx_core {
|
||||
/* ALSA stuff */
|
||||
struct snd_card *card;
|
||||
struct snd_pcm *pcm[VX_MAX_CODECS];
|
||||
int type; /* VX_TYPE_XXX */
|
||||
|
||||
int irq;
|
||||
/* ports are defined externally */
|
||||
|
||||
/* low-level functions */
|
||||
struct snd_vx_hardware *hw;
|
||||
struct snd_vx_ops *ops;
|
||||
|
||||
spinlock_t lock;
|
||||
spinlock_t irq_lock;
|
||||
struct tasklet_struct tq;
|
||||
|
||||
unsigned int chip_status;
|
||||
unsigned int pcm_running;
|
||||
|
||||
struct device *dev;
|
||||
struct snd_hwdep *hwdep;
|
||||
|
||||
struct vx_rmh irq_rmh; /* RMH used in interrupts */
|
||||
|
||||
unsigned int audio_info; /* see VX_AUDIO_INFO */
|
||||
unsigned int audio_ins;
|
||||
unsigned int audio_outs;
|
||||
struct vx_pipe **playback_pipes;
|
||||
struct vx_pipe **capture_pipes;
|
||||
|
||||
/* clock and audio sources */
|
||||
unsigned int audio_source; /* current audio input source */
|
||||
unsigned int audio_source_target;
|
||||
unsigned int clock_mode; /* clock mode (VX_CLOCK_MODE_XXX) */
|
||||
unsigned int clock_source; /* current clock source (INTERNAL_QUARTZ or UER_SYNC) */
|
||||
unsigned int freq; /* current frequency */
|
||||
unsigned int freq_detected; /* detected frequency from digital in */
|
||||
unsigned int uer_detected; /* VX_UER_MODE_XXX */
|
||||
unsigned int uer_bits; /* IEC958 status bits */
|
||||
struct vx_ibl_info ibl; /* IBL information */
|
||||
|
||||
/* mixer setting */
|
||||
int output_level[VX_MAX_CODECS][2]; /* analog output level */
|
||||
int audio_gain[2][4]; /* digital audio level (playback/capture) */
|
||||
unsigned char audio_active[4]; /* mute/unmute on digital playback */
|
||||
int audio_monitor[4]; /* playback hw-monitor level */
|
||||
unsigned char audio_monitor_active[4]; /* playback hw-monitor mute/unmute */
|
||||
|
||||
struct mutex mixer_mutex;
|
||||
|
||||
const struct firmware *firmware[4]; /* loaded firmware data */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* constructor
|
||||
*/
|
||||
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(struct vx_core *chip);
|
||||
|
||||
/*
|
||||
* interrupt handler; exported for pcmcia
|
||||
*/
|
||||
irqreturn_t snd_vx_irq_handler(int irq, void *dev);
|
||||
|
||||
/*
|
||||
* lowlevel functions
|
||||
*/
|
||||
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(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(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(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(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(struct vx_core *chip, int reg, unsigned int val)
|
||||
{
|
||||
snd_assert(chip->ops->out32, return);
|
||||
chip->ops->out32(chip, reg, val);
|
||||
}
|
||||
|
||||
#define vx_inb(chip,reg) snd_vx_inb(chip, VX_##reg)
|
||||
#define vx_outb(chip,reg,val) snd_vx_outb(chip, VX_##reg,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)
|
||||
|
||||
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(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(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(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)
|
||||
|
||||
|
||||
/*
|
||||
* pseudo-DMA transfer
|
||||
*/
|
||||
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(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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* error with hardware code,
|
||||
* the return value is -(VX_ERR_MASK | actual-hw-error-code)
|
||||
*/
|
||||
#define VX_ERR_MASK 0x1000000
|
||||
#define vx_get_error(err) (-(err) & ~VX_ERR_MASK)
|
||||
|
||||
|
||||
/*
|
||||
* pcm stuff
|
||||
*/
|
||||
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(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(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
|
||||
*/
|
||||
|
||||
#define vx_has_new_dsp(chip) ((chip)->type != VX_TYPE_BOARD)
|
||||
#define vx_is_pcmcia(chip) ((chip)->type >= VX_TYPE_VXPOCKET)
|
||||
|
||||
/* audio input source */
|
||||
enum {
|
||||
VX_AUDIO_SRC_DIGITAL,
|
||||
VX_AUDIO_SRC_LINE,
|
||||
VX_AUDIO_SRC_MIC
|
||||
};
|
||||
|
||||
/* clock source */
|
||||
enum {
|
||||
INTERNAL_QUARTZ,
|
||||
UER_SYNC
|
||||
};
|
||||
|
||||
/* clock mode */
|
||||
enum {
|
||||
VX_CLOCK_MODE_AUTO, /* depending on the current audio source */
|
||||
VX_CLOCK_MODE_INTERNAL, /* fixed to internal quartz */
|
||||
VX_CLOCK_MODE_EXTERNAL /* fixed to UER sync */
|
||||
};
|
||||
|
||||
/* SPDIF/UER type */
|
||||
enum {
|
||||
VX_UER_MODE_CONSUMER,
|
||||
VX_UER_MODE_PROFESSIONAL,
|
||||
VX_UER_MODE_NOT_PRESENT,
|
||||
};
|
||||
|
||||
/* register indices */
|
||||
enum {
|
||||
VX_ICR,
|
||||
VX_CVR,
|
||||
VX_ISR,
|
||||
VX_IVR,
|
||||
VX_RXH,
|
||||
VX_TXH = VX_RXH,
|
||||
VX_RXM,
|
||||
VX_TXM = VX_RXM,
|
||||
VX_RXL,
|
||||
VX_TXL = VX_RXL,
|
||||
VX_DMA,
|
||||
VX_CDSP,
|
||||
VX_RFREQ,
|
||||
VX_RUER_V2,
|
||||
VX_GAIN,
|
||||
VX_DATA = VX_GAIN,
|
||||
VX_MEMIRQ,
|
||||
VX_ACQ,
|
||||
VX_BIT0,
|
||||
VX_BIT1,
|
||||
VX_MIC0,
|
||||
VX_MIC1,
|
||||
VX_MIC2,
|
||||
VX_MIC3,
|
||||
VX_PLX0,
|
||||
VX_PLX1,
|
||||
VX_PLX2,
|
||||
|
||||
VX_LOFREQ, // V2: ACQ, VP: RFREQ
|
||||
VX_HIFREQ, // V2: BIT0, VP: RUER_V2
|
||||
VX_CSUER, // V2: BIT1, VP: BIT0
|
||||
VX_RUER, // V2: RUER_V2, VP: BIT1
|
||||
|
||||
VX_REG_MAX,
|
||||
|
||||
/* aliases for VX board */
|
||||
VX_RESET_DMA = VX_ISR,
|
||||
VX_CFG = VX_RFREQ,
|
||||
VX_STATUS = VX_MEMIRQ,
|
||||
VX_SELMIC = VX_MIC0,
|
||||
VX_COMPOT = VX_MIC1,
|
||||
VX_SCOMPR = VX_MIC2,
|
||||
VX_GLIMIT = VX_MIC3,
|
||||
VX_INTCSR = VX_PLX0,
|
||||
VX_CNTRL = VX_PLX1,
|
||||
VX_GPIOC = VX_PLX2,
|
||||
|
||||
/* aliases for VXPOCKET board */
|
||||
VX_MICRO = VX_MEMIRQ,
|
||||
VX_CODEC2 = VX_MEMIRQ,
|
||||
VX_DIALOG = VX_ACQ,
|
||||
|
||||
};
|
||||
|
||||
/* RMH status type */
|
||||
enum {
|
||||
RMH_SSIZE_FIXED = 0, /* status size given by the driver (in LgStat) */
|
||||
RMH_SSIZE_ARG = 1, /* status size given in the LSB byte */
|
||||
RMH_SSIZE_MASK = 2, /* status size given in bitmask */
|
||||
};
|
||||
|
||||
|
||||
/* bits for ICR register */
|
||||
#define ICR_HF1 0x10
|
||||
#define ICR_HF0 0x08
|
||||
#define ICR_TREQ 0x02 /* Interrupt mode + HREQ set on for transfer (->DSP) request */
|
||||
#define ICR_RREQ 0x01 /* Interrupt mode + RREQ set on for transfer (->PC) request */
|
||||
|
||||
/* bits for CVR register */
|
||||
#define CVR_HC 0x80
|
||||
|
||||
/* bits for ISR register */
|
||||
#define ISR_HF3 0x10
|
||||
#define ISR_HF2 0x08
|
||||
#define ISR_CHK 0x10
|
||||
#define ISR_ERR 0x08
|
||||
#define ISR_TX_READY 0x04
|
||||
#define ISR_TX_EMPTY 0x02
|
||||
#define ISR_RX_FULL 0x01
|
||||
|
||||
/* Constants used to access the DATA register */
|
||||
#define VX_DATA_CODEC_MASK 0x80
|
||||
#define VX_DATA_XICOR_MASK 0x80
|
||||
|
||||
/* Constants used to access the CSUER register (both for VX2 and VXP) */
|
||||
#define VX_SUER_FREQ_MASK 0x0c
|
||||
#define VX_SUER_FREQ_32KHz_MASK 0x0c
|
||||
#define VX_SUER_FREQ_44KHz_MASK 0x00
|
||||
#define VX_SUER_FREQ_48KHz_MASK 0x04
|
||||
#define VX_SUER_DATA_PRESENT_MASK 0x02
|
||||
#define VX_SUER_CLOCK_PRESENT_MASK 0x01
|
||||
|
||||
#define VX_CUER_HH_BITC_SEL_MASK 0x08
|
||||
#define VX_CUER_MH_BITC_SEL_MASK 0x04
|
||||
#define VX_CUER_ML_BITC_SEL_MASK 0x02
|
||||
#define VX_CUER_LL_BITC_SEL_MASK 0x01
|
||||
|
||||
#define XX_UER_CBITS_OFFSET_MASK 0x1f
|
||||
|
||||
|
||||
/* bits for audio_info */
|
||||
#define VX_AUDIO_INFO_REAL_TIME (1<<0) /* real-time processing available */
|
||||
#define VX_AUDIO_INFO_OFFLINE (1<<1) /* offline processing available */
|
||||
#define VX_AUDIO_INFO_MPEG1 (1<<5)
|
||||
#define VX_AUDIO_INFO_MPEG2 (1<<6)
|
||||
#define VX_AUDIO_INFO_LINEAR_8 (1<<7)
|
||||
#define VX_AUDIO_INFO_LINEAR_16 (1<<8)
|
||||
#define VX_AUDIO_INFO_LINEAR_24 (1<<9)
|
||||
|
||||
/* DSP Interrupt Request values */
|
||||
#define VXP_IRQ_OFFSET 0x40 /* add 0x40 offset for vxpocket and vx222/v2 */
|
||||
/* call with vx_send_irq_dsp() */
|
||||
#define IRQ_MESS_WRITE_END 0x30
|
||||
#define IRQ_MESS_WRITE_NEXT 0x32
|
||||
#define IRQ_MESS_READ_NEXT 0x34
|
||||
#define IRQ_MESS_READ_END 0x36
|
||||
#define IRQ_MESSAGE 0x38
|
||||
#define IRQ_RESET_CHK 0x3A
|
||||
#define IRQ_CONNECT_STREAM_NEXT 0x26
|
||||
#define IRQ_CONNECT_STREAM_END 0x28
|
||||
#define IRQ_PAUSE_START_CONNECT 0x2A
|
||||
#define IRQ_END_CONNECTION 0x2C
|
||||
|
||||
/* Is there async. events pending ( IT Source Test ) */
|
||||
#define ASYNC_EVENTS_PENDING 0x008000
|
||||
#define HBUFFER_EVENTS_PENDING 0x004000 // Not always accurate
|
||||
#define NOTIF_EVENTS_PENDING 0x002000
|
||||
#define TIME_CODE_EVENT_PENDING 0x001000
|
||||
#define FREQUENCY_CHANGE_EVENT_PENDING 0x000800
|
||||
#define END_OF_BUFFER_EVENTS_PENDING 0x000400
|
||||
#define FATAL_DSP_ERROR 0xff0000
|
||||
|
||||
/* Stream Format Header Defines */
|
||||
#define HEADER_FMT_BASE 0xFED00000
|
||||
#define HEADER_FMT_MONO 0x000000C0
|
||||
#define HEADER_FMT_INTEL 0x00008000
|
||||
#define HEADER_FMT_16BITS 0x00002000
|
||||
#define HEADER_FMT_24BITS 0x00004000
|
||||
#define HEADER_FMT_UPTO11 0x00000200 /* frequency is less or equ. to 11k.*/
|
||||
#define HEADER_FMT_UPTO32 0x00000100 /* frequency is over 11k and less then 32k.*/
|
||||
|
||||
/* Constants used to access the Codec */
|
||||
#define XX_CODEC_SELECTOR 0x20
|
||||
/* codec commands */
|
||||
#define XX_CODEC_ADC_CONTROL_REGISTER 0x01
|
||||
#define XX_CODEC_DAC_CONTROL_REGISTER 0x02
|
||||
#define XX_CODEC_LEVEL_LEFT_REGISTER 0x03
|
||||
#define XX_CODEC_LEVEL_RIGHT_REGISTER 0x04
|
||||
#define XX_CODEC_PORT_MODE_REGISTER 0x05
|
||||
#define XX_CODEC_STATUS_REPORT_REGISTER 0x06
|
||||
#define XX_CODEC_CLOCK_CONTROL_REGISTER 0x07
|
||||
|
||||
/*
|
||||
* Audio-level control values
|
||||
*/
|
||||
#define CVAL_M110DB 0x000 /* -110dB */
|
||||
#define CVAL_M99DB 0x02C
|
||||
#define CVAL_M21DB 0x163
|
||||
#define CVAL_M18DB 0x16F
|
||||
#define CVAL_M10DB 0x18F
|
||||
#define CVAL_0DB 0x1B7
|
||||
#define CVAL_18DB 0x1FF /* +18dB */
|
||||
#define CVAL_MAX 0x1FF
|
||||
|
||||
#define AUDIO_IO_HAS_MUTE_LEVEL 0x400000
|
||||
#define AUDIO_IO_HAS_MUTE_MONITORING_1 0x200000
|
||||
#define AUDIO_IO_HAS_MUTE_MONITORING_2 0x100000
|
||||
#define VALID_AUDIO_IO_DIGITAL_LEVEL 0x01
|
||||
#define VALID_AUDIO_IO_MONITORING_LEVEL 0x02
|
||||
#define VALID_AUDIO_IO_MUTE_LEVEL 0x04
|
||||
#define VALID_AUDIO_IO_MUTE_MONITORING_1 0x08
|
||||
#define VALID_AUDIO_IO_MUTE_MONITORING_2 0x10
|
||||
|
||||
|
||||
#endif /* __SOUND_VX_COMMON_H */
|
||||
695
include/sound/wavefront.h
Normal file
695
include/sound/wavefront.h
Normal file
@@ -0,0 +1,695 @@
|
||||
#ifndef __SOUND_WAVEFRONT_H__
|
||||
#define __SOUND_WAVEFRONT_H__
|
||||
|
||||
/*
|
||||
* Driver for Turtle Beach Wavefront cards (Maui,Tropez,Tropez+)
|
||||
*
|
||||
* Copyright (c) by Paul Barton-Davis <pbd@op.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#if (!defined(__GNUC__) && !defined(__GNUG__))
|
||||
|
||||
You will not be able to compile this file correctly without gcc, because
|
||||
it is necessary to pack the "wavefront_alias" structure to a size
|
||||
of 22 bytes, corresponding to 16-bit alignment (as would have been
|
||||
the case on the original platform, MS-DOS). If this is not done,
|
||||
then WavePatch-format files cannot be read/written correctly.
|
||||
The method used to do this here ("__attribute__((packed)") is
|
||||
completely compiler dependent.
|
||||
|
||||
All other wavefront_* types end up aligned to 32 bit values and
|
||||
still have the same (correct) size.
|
||||
|
||||
#else
|
||||
|
||||
/* However, note that as of G++ 2.7.3.2, g++ was unable to
|
||||
correctly parse *type* __attribute__ tags. It will do the
|
||||
right thing if we use the "packed" attribute on each struct
|
||||
member, which has the same semantics anyway.
|
||||
*/
|
||||
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
/***************************** WARNING ********************************
|
||||
PLEASE DO NOT MODIFY THIS FILE IN ANY WAY THAT AFFECTS ITS ABILITY TO
|
||||
BE USED WITH EITHER C *OR* C++.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef NUM_MIDIKEYS
|
||||
#define NUM_MIDIKEYS 128
|
||||
#endif /* NUM_MIDIKEYS */
|
||||
|
||||
#ifndef NUM_MIDICHANNELS
|
||||
#define NUM_MIDICHANNELS 16
|
||||
#endif /* NUM_MIDICHANNELS */
|
||||
|
||||
/* These are very useful/important. the original wavefront interface
|
||||
was developed on a 16 bit system, where sizeof(int) = 2
|
||||
bytes. Defining things like this makes the code much more portable, and
|
||||
easier to understand without having to toggle back and forth
|
||||
between a 16-bit view of the world and a 32-bit one.
|
||||
*/
|
||||
|
||||
#ifndef __KERNEL__
|
||||
/* keep them for compatibility */
|
||||
typedef short s16;
|
||||
typedef unsigned short u16;
|
||||
typedef int s32;
|
||||
typedef unsigned int u32;
|
||||
typedef char s8;
|
||||
typedef unsigned char u8;
|
||||
typedef s16 INT16;
|
||||
typedef u16 UINT16;
|
||||
typedef s32 INT32;
|
||||
typedef u32 UINT32;
|
||||
typedef s8 CHAR8;
|
||||
typedef u8 UCHAR8;
|
||||
#endif
|
||||
|
||||
/* Pseudo-commands not part of the WaveFront command set.
|
||||
These are used for various driver controls and direct
|
||||
hardware control.
|
||||
*/
|
||||
|
||||
#define WFC_DEBUG_DRIVER 0
|
||||
#define WFC_FX_IOCTL 1
|
||||
#define WFC_PATCH_STATUS 2
|
||||
#define WFC_PROGRAM_STATUS 3
|
||||
#define WFC_SAMPLE_STATUS 4
|
||||
#define WFC_DISABLE_INTERRUPTS 5
|
||||
#define WFC_ENABLE_INTERRUPTS 6
|
||||
#define WFC_INTERRUPT_STATUS 7
|
||||
#define WFC_ROMSAMPLES_RDONLY 8
|
||||
#define WFC_IDENTIFY_SLOT_TYPE 9
|
||||
|
||||
/* Wavefront synth commands
|
||||
*/
|
||||
|
||||
#define WFC_DOWNLOAD_SAMPLE 0x80
|
||||
#define WFC_DOWNLOAD_BLOCK 0x81
|
||||
#define WFC_DOWNLOAD_MULTISAMPLE 0x82
|
||||
#define WFC_DOWNLOAD_SAMPLE_ALIAS 0x83
|
||||
#define WFC_DELETE_SAMPLE 0x84
|
||||
#define WFC_REPORT_FREE_MEMORY 0x85
|
||||
#define WFC_DOWNLOAD_PATCH 0x86
|
||||
#define WFC_DOWNLOAD_PROGRAM 0x87
|
||||
#define WFC_SET_SYNTHVOL 0x89
|
||||
#define WFC_SET_NVOICES 0x8B
|
||||
#define WFC_DOWNLOAD_DRUM 0x90
|
||||
#define WFC_GET_SYNTHVOL 0x92
|
||||
#define WFC_GET_NVOICES 0x94
|
||||
#define WFC_DISABLE_CHANNEL 0x9A
|
||||
#define WFC_ENABLE_CHANNEL 0x9B
|
||||
#define WFC_MISYNTH_OFF 0x9D
|
||||
#define WFC_MISYNTH_ON 0x9E
|
||||
#define WFC_FIRMWARE_VERSION 0x9F
|
||||
#define WFC_GET_NSAMPLES 0xA0
|
||||
#define WFC_DISABLE_DRUM_PROGRAM 0xA2
|
||||
#define WFC_UPLOAD_PATCH 0xA3
|
||||
#define WFC_UPLOAD_PROGRAM 0xA4
|
||||
#define WFC_SET_TUNING 0xA6
|
||||
#define WFC_GET_TUNING 0xA7
|
||||
#define WFC_VMIDI_ON 0xA8
|
||||
#define WFC_VMIDI_OFF 0xA9
|
||||
#define WFC_MIDI_STATUS 0xAA
|
||||
#define WFC_GET_CHANNEL_STATUS 0xAB
|
||||
#define WFC_DOWNLOAD_SAMPLE_HEADER 0xAC
|
||||
#define WFC_UPLOAD_SAMPLE_HEADER 0xAD
|
||||
#define WFC_UPLOAD_MULTISAMPLE 0xAE
|
||||
#define WFC_UPLOAD_SAMPLE_ALIAS 0xAF
|
||||
#define WFC_IDENTIFY_SAMPLE_TYPE 0xB0
|
||||
#define WFC_DOWNLOAD_EDRUM_PROGRAM 0xB1
|
||||
#define WFC_UPLOAD_EDRUM_PROGRAM 0xB2
|
||||
#define WFC_SET_EDRUM_CHANNEL 0xB3
|
||||
#define WFC_INSTOUT_LEVELS 0xB4
|
||||
#define WFC_PEAKOUT_LEVELS 0xB5
|
||||
#define WFC_REPORT_CHANNEL_PROGRAMS 0xB6
|
||||
#define WFC_HARDWARE_VERSION 0xCF
|
||||
#define WFC_UPLOAD_SAMPLE_PARAMS 0xD7
|
||||
#define WFC_DOWNLOAD_OS 0xF1
|
||||
#define WFC_NOOP 0xFF
|
||||
|
||||
#define WF_MAX_SAMPLE 512
|
||||
#define WF_MAX_PATCH 256
|
||||
#define WF_MAX_PROGRAM 128
|
||||
|
||||
#define WF_SECTION_MAX 44 /* longest OS section length */
|
||||
|
||||
/* # of bytes we send to the board when sending it various kinds of
|
||||
substantive data, such as samples, patches and programs.
|
||||
*/
|
||||
|
||||
#define WF_PROGRAM_BYTES 32
|
||||
#define WF_PATCH_BYTES 132
|
||||
#define WF_SAMPLE_BYTES 27
|
||||
#define WF_SAMPLE_HDR_BYTES 25
|
||||
#define WF_ALIAS_BYTES 25
|
||||
#define WF_DRUM_BYTES 9
|
||||
#define WF_MSAMPLE_BYTES 259 /* (MIDI_KEYS * 2) + 3 */
|
||||
|
||||
#define WF_ACK 0x80
|
||||
#define WF_DMA_ACK 0x81
|
||||
|
||||
/* OR-values for MIDI status bits */
|
||||
|
||||
#define WF_MIDI_VIRTUAL_ENABLED 0x1
|
||||
#define WF_MIDI_VIRTUAL_IS_EXTERNAL 0x2
|
||||
#define WF_MIDI_IN_TO_SYNTH_DISABLED 0x4
|
||||
|
||||
/* slot indexes for struct address_info: makes code a little more mnemonic */
|
||||
|
||||
#define WF_SYNTH_SLOT 0
|
||||
#define WF_INTERNAL_MIDI_SLOT 1
|
||||
#define WF_EXTERNAL_MIDI_SLOT 2
|
||||
|
||||
/* Magic MIDI bytes used to switch I/O streams on the ICS2115 MPU401
|
||||
emulation. Note these NEVER show up in output from the device and
|
||||
should NEVER be used in input unless Virtual MIDI mode has been
|
||||
disabled. If they do show up as input, the results are unpredictable.
|
||||
*/
|
||||
|
||||
#define WF_EXTERNAL_SWITCH 0xFD
|
||||
#define WF_INTERNAL_SWITCH 0xF9
|
||||
|
||||
/* Debugging flags */
|
||||
|
||||
#define WF_DEBUG_CMD 0x1
|
||||
#define WF_DEBUG_DATA 0x2
|
||||
#define WF_DEBUG_LOAD_PATCH 0x4
|
||||
#define WF_DEBUG_IO 0x8
|
||||
|
||||
/* WavePatch file format stuff */
|
||||
|
||||
#define WF_WAVEPATCH_VERSION 120; /* Current version number (1.2) */
|
||||
#define WF_MAX_COMMENT 64 /* Comment length */
|
||||
#define WF_NUM_LAYERS 4
|
||||
#define WF_NAME_LENGTH 32
|
||||
#define WF_SOURCE_LENGTH 260
|
||||
|
||||
#define BankFileID "Bank"
|
||||
#define DrumkitFileID "DrumKit"
|
||||
#define ProgramFileID "Program"
|
||||
|
||||
struct wf_envelope
|
||||
{
|
||||
u8 attack_time:7;
|
||||
u8 Unused1:1;
|
||||
|
||||
u8 decay1_time:7;
|
||||
u8 Unused2:1;
|
||||
|
||||
u8 decay2_time:7;
|
||||
u8 Unused3:1;
|
||||
|
||||
u8 sustain_time:7;
|
||||
u8 Unused4:1;
|
||||
|
||||
u8 release_time:7;
|
||||
u8 Unused5:1;
|
||||
|
||||
u8 release2_time:7;
|
||||
u8 Unused6:1;
|
||||
|
||||
s8 attack_level;
|
||||
s8 decay1_level;
|
||||
s8 decay2_level;
|
||||
s8 sustain_level;
|
||||
s8 release_level;
|
||||
|
||||
u8 attack_velocity:7;
|
||||
u8 Unused7:1;
|
||||
|
||||
u8 volume_velocity:7;
|
||||
u8 Unused8:1;
|
||||
|
||||
u8 keyboard_scaling:7;
|
||||
u8 Unused9:1;
|
||||
};
|
||||
typedef struct wf_envelope wavefront_envelope;
|
||||
|
||||
struct wf_lfo
|
||||
{
|
||||
u8 sample_number;
|
||||
|
||||
u8 frequency:7;
|
||||
u8 Unused1:1;
|
||||
|
||||
u8 am_src:4;
|
||||
u8 fm_src:4;
|
||||
|
||||
s8 fm_amount;
|
||||
s8 am_amount;
|
||||
s8 start_level;
|
||||
s8 end_level;
|
||||
|
||||
u8 ramp_delay:7;
|
||||
u8 wave_restart:1; /* for LFO2 only */
|
||||
|
||||
u8 ramp_time:7;
|
||||
u8 Unused2:1;
|
||||
};
|
||||
typedef struct wf_lfo wavefront_lfo;
|
||||
|
||||
struct wf_patch
|
||||
{
|
||||
s16 frequency_bias; /* ** THIS IS IN MOTOROLA FORMAT!! ** */
|
||||
|
||||
u8 amplitude_bias:7;
|
||||
u8 Unused1:1;
|
||||
|
||||
u8 portamento:7;
|
||||
u8 Unused2:1;
|
||||
|
||||
u8 sample_number;
|
||||
|
||||
u8 pitch_bend:4;
|
||||
u8 sample_msb:1;
|
||||
u8 Unused3:3;
|
||||
|
||||
u8 mono:1;
|
||||
u8 retrigger:1;
|
||||
u8 nohold:1;
|
||||
u8 restart:1;
|
||||
u8 filterconfig:2; /* SDK says "not used" */
|
||||
u8 reuse:1;
|
||||
u8 reset_lfo:1;
|
||||
|
||||
u8 fm_src2:4;
|
||||
u8 fm_src1:4;
|
||||
|
||||
s8 fm_amount1;
|
||||
s8 fm_amount2;
|
||||
|
||||
u8 am_src:4;
|
||||
u8 Unused4:4;
|
||||
|
||||
s8 am_amount;
|
||||
|
||||
u8 fc1_mode:4;
|
||||
u8 fc2_mode:4;
|
||||
|
||||
s8 fc1_mod_amount;
|
||||
s8 fc1_keyboard_scaling;
|
||||
s8 fc1_bias;
|
||||
s8 fc2_mod_amount;
|
||||
s8 fc2_keyboard_scaling;
|
||||
s8 fc2_bias;
|
||||
|
||||
u8 randomizer:7;
|
||||
u8 Unused5:1;
|
||||
|
||||
struct wf_envelope envelope1;
|
||||
struct wf_envelope envelope2;
|
||||
struct wf_lfo lfo1;
|
||||
struct wf_lfo lfo2;
|
||||
};
|
||||
typedef struct wf_patch wavefront_patch;
|
||||
|
||||
struct wf_layer
|
||||
{
|
||||
u8 patch_number;
|
||||
|
||||
u8 mix_level:7;
|
||||
u8 mute:1;
|
||||
|
||||
u8 split_point:7;
|
||||
u8 play_below:1;
|
||||
|
||||
u8 pan_mod_src:2;
|
||||
u8 pan_or_mod:1;
|
||||
u8 pan:4;
|
||||
u8 split_type:1;
|
||||
};
|
||||
typedef struct wf_layer wavefront_layer;
|
||||
|
||||
struct wf_program
|
||||
{
|
||||
struct wf_layer layer[WF_NUM_LAYERS];
|
||||
};
|
||||
typedef struct wf_program wavefront_program;
|
||||
|
||||
struct wf_sample_offset
|
||||
{
|
||||
s32 Fraction:4;
|
||||
s32 Integer:20;
|
||||
s32 Unused:8;
|
||||
};
|
||||
typedef struct wf_sample_offset wavefront_sample_offset;
|
||||
|
||||
/* Sample slot types */
|
||||
|
||||
#define WF_ST_SAMPLE 0
|
||||
#define WF_ST_MULTISAMPLE 1
|
||||
#define WF_ST_ALIAS 2
|
||||
#define WF_ST_EMPTY 3
|
||||
|
||||
/* pseudo's */
|
||||
|
||||
#define WF_ST_DRUM 4
|
||||
#define WF_ST_PROGRAM 5
|
||||
#define WF_ST_PATCH 6
|
||||
#define WF_ST_SAMPLEHDR 7
|
||||
|
||||
#define WF_ST_MASK 0xf
|
||||
|
||||
/* Flags for slot status. These occupy the upper bits of the same byte
|
||||
as a sample type.
|
||||
*/
|
||||
|
||||
#define WF_SLOT_USED 0x80 /* XXX don't rely on this being accurate */
|
||||
#define WF_SLOT_FILLED 0x40
|
||||
#define WF_SLOT_ROM 0x20
|
||||
|
||||
#define WF_SLOT_MASK 0xf0
|
||||
|
||||
/* channel constants */
|
||||
|
||||
#define WF_CH_MONO 0
|
||||
#define WF_CH_LEFT 1
|
||||
#define WF_CH_RIGHT 2
|
||||
|
||||
/* Sample formats */
|
||||
|
||||
#define LINEAR_16BIT 0
|
||||
#define WHITE_NOISE 1
|
||||
#define LINEAR_8BIT 2
|
||||
#define MULAW_8BIT 3
|
||||
|
||||
#define WF_SAMPLE_IS_8BIT(smpl) ((smpl)->SampleResolution&2)
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Because most/all of the sample data we pass in via pointers has
|
||||
never been copied (just mmap-ed into user space straight from the
|
||||
disk), it would be nice to allow handling of multi-channel sample
|
||||
data without forcing user-level extraction of the relevant bytes.
|
||||
|
||||
So, we need a way of specifying which channel to use (the WaveFront
|
||||
only handles mono samples in a given slot), and the only way to do
|
||||
this without using some struct other than wavefront_sample as the
|
||||
interface is the awful hack of using the unused bits in a
|
||||
wavefront_sample:
|
||||
|
||||
Val Meaning
|
||||
--- -------
|
||||
0 no channel selection (use channel 1, sample is MONO)
|
||||
1 use first channel, and skip one
|
||||
2 use second channel, and skip one
|
||||
3 use third channel, and skip two
|
||||
4 use fourth channel, skip three
|
||||
5 use fifth channel, skip four
|
||||
6 use six channel, skip five
|
||||
|
||||
|
||||
This can handle up to 4 channels, and anyone downloading >4 channels
|
||||
of sample data just to select one of them needs to find some tools
|
||||
like sox ...
|
||||
|
||||
NOTE: values 0, 1 and 2 correspond to WF_CH_* above. This is
|
||||
important.
|
||||
|
||||
*/
|
||||
|
||||
#define WF_SET_CHANNEL(samp,chn) \
|
||||
(samp)->Unused1 = chn & 0x1; \
|
||||
(samp)->Unused2 = chn & 0x2; \
|
||||
(samp)->Unused3 = chn & 0x4
|
||||
|
||||
#define WF_GET_CHANNEL(samp) \
|
||||
(((samp)->Unused3 << 2)|((samp)->Unused2<<1)|(samp)->Unused1)
|
||||
|
||||
typedef struct wf_sample {
|
||||
struct wf_sample_offset sampleStartOffset;
|
||||
struct wf_sample_offset loopStartOffset;
|
||||
struct wf_sample_offset loopEndOffset;
|
||||
struct wf_sample_offset sampleEndOffset;
|
||||
s16 FrequencyBias;
|
||||
u8 SampleResolution:2; /* sample_format */
|
||||
u8 Unused1:1;
|
||||
u8 Loop:1;
|
||||
u8 Bidirectional:1;
|
||||
u8 Unused2:1;
|
||||
u8 Reverse:1;
|
||||
u8 Unused3:1;
|
||||
} wavefront_sample;
|
||||
|
||||
typedef struct wf_multisample {
|
||||
s16 NumberOfSamples; /* log2 of the number of samples */
|
||||
s16 SampleNumber[NUM_MIDIKEYS];
|
||||
} wavefront_multisample;
|
||||
|
||||
typedef struct wf_alias {
|
||||
s16 OriginalSample;
|
||||
|
||||
struct wf_sample_offset sampleStartOffset;
|
||||
struct wf_sample_offset loopStartOffset;
|
||||
struct wf_sample_offset sampleEndOffset;
|
||||
struct wf_sample_offset loopEndOffset;
|
||||
|
||||
s16 FrequencyBias;
|
||||
|
||||
u8 SampleResolution:2;
|
||||
u8 Unused1:1;
|
||||
u8 Loop:1;
|
||||
u8 Bidirectional:1;
|
||||
u8 Unused2:1;
|
||||
u8 Reverse:1;
|
||||
u8 Unused3:1;
|
||||
|
||||
/* This structure is meant to be padded only to 16 bits on their
|
||||
original. Of course, whoever wrote their documentation didn't
|
||||
realize that sizeof(struct) can be >=
|
||||
sum(sizeof(struct-fields)) and so thought that giving a C level
|
||||
description of the structs used in WavePatch files was
|
||||
sufficient. I suppose it was, as long as you remember the
|
||||
standard 16->32 bit issues.
|
||||
*/
|
||||
|
||||
u8 sixteen_bit_padding;
|
||||
} __attribute__((packed)) wavefront_alias;
|
||||
|
||||
typedef struct wf_drum {
|
||||
u8 PatchNumber;
|
||||
u8 MixLevel:7;
|
||||
u8 Unmute:1;
|
||||
u8 Group:4;
|
||||
u8 Unused1:4;
|
||||
u8 PanModSource:2;
|
||||
u8 PanModulated:1;
|
||||
u8 PanAmount:4;
|
||||
u8 Unused2:1;
|
||||
} wavefront_drum;
|
||||
|
||||
typedef struct wf_drumkit {
|
||||
struct wf_drum drum[NUM_MIDIKEYS];
|
||||
} wavefront_drumkit;
|
||||
|
||||
typedef struct wf_channel_programs {
|
||||
u8 Program[NUM_MIDICHANNELS];
|
||||
} wavefront_channel_programs;
|
||||
|
||||
/* How to get MIDI channel status from the data returned by
|
||||
a WFC_GET_CHANNEL_STATUS command (a struct wf_channel_programs)
|
||||
*/
|
||||
|
||||
#define WF_CHANNEL_STATUS(ch,wcp) (wcp)[(ch/7)] & (1<<((ch)%7))
|
||||
|
||||
typedef union wf_any {
|
||||
wavefront_sample s;
|
||||
wavefront_multisample ms;
|
||||
wavefront_alias a;
|
||||
wavefront_program pr;
|
||||
wavefront_patch p;
|
||||
wavefront_drum d;
|
||||
} wavefront_any;
|
||||
|
||||
/* Hannu Solvainen hoped that his "patch_info" struct in soundcard.h
|
||||
might work for other wave-table based patch loading situations.
|
||||
Alas, his fears were correct. The WaveFront doesn't even come with
|
||||
just "patches", but several different kind of structures that
|
||||
control the sound generation process.
|
||||
*/
|
||||
|
||||
typedef struct wf_patch_info {
|
||||
|
||||
/* the first two fields are used by the OSS "patch loading" interface
|
||||
only, and are unused by the current user-level library.
|
||||
*/
|
||||
|
||||
s16 key; /* Use WAVEFRONT_PATCH here */
|
||||
u16 devno; /* fill in when sending */
|
||||
u8 subkey; /* WF_ST_{SAMPLE,ALIAS,etc.} */
|
||||
|
||||
#define WAVEFRONT_FIND_FREE_SAMPLE_SLOT 999
|
||||
|
||||
u16 number; /* patch/sample/prog number */
|
||||
|
||||
u32 size; /* size of any data included in
|
||||
one of the fields in `hdrptr', or
|
||||
as `dataptr'.
|
||||
|
||||
NOTE: for actual samples, this is
|
||||
the size of the *SELECTED CHANNEL*
|
||||
even if more data is actually available.
|
||||
|
||||
So, a stereo sample (2 channels) of
|
||||
6000 bytes total has `size' = 3000.
|
||||
|
||||
See the macros and comments for
|
||||
WF_{GET,SET}_CHANNEL above.
|
||||
|
||||
*/
|
||||
wavefront_any __user *hdrptr; /* user-space ptr to hdr bytes */
|
||||
u16 __user *dataptr; /* actual sample data */
|
||||
|
||||
wavefront_any hdr; /* kernel-space copy of hdr bytes */
|
||||
} wavefront_patch_info;
|
||||
|
||||
/* The maximum number of bytes we will ever move to or from user space
|
||||
in response to a WFC_* command. This obviously doesn't cover
|
||||
actual sample data.
|
||||
*/
|
||||
|
||||
#define WF_MAX_READ sizeof(wavefront_multisample)
|
||||
#define WF_MAX_WRITE sizeof(wavefront_multisample)
|
||||
|
||||
/*
|
||||
This allows us to execute any WF command except the download/upload
|
||||
ones, which are handled differently due to copyin/copyout issues as
|
||||
well as data-nybbling to/from the card.
|
||||
*/
|
||||
|
||||
typedef struct wavefront_control {
|
||||
int cmd; /* WFC_* */
|
||||
char status; /* return status to user-space */
|
||||
unsigned char rbuf[WF_MAX_READ]; /* bytes read from card */
|
||||
unsigned char wbuf[WF_MAX_WRITE]; /* bytes written to card */
|
||||
} wavefront_control;
|
||||
|
||||
#define WFCTL_WFCMD 0x1
|
||||
#define WFCTL_LOAD_SPP 0x2
|
||||
|
||||
/* Modulator table */
|
||||
|
||||
#define WF_MOD_LFO1 0
|
||||
#define WF_MOD_LFO2 1
|
||||
#define WF_MOD_ENV1 2
|
||||
#define WF_MOD_ENV2 3
|
||||
#define WF_MOD_KEYBOARD 4
|
||||
#define WF_MOD_LOGKEY 5
|
||||
#define WF_MOD_VELOCITY 6
|
||||
#define WF_MOD_LOGVEL 7
|
||||
#define WF_MOD_RANDOM 8
|
||||
#define WF_MOD_PRESSURE 9
|
||||
#define WF_MOD_MOD_WHEEL 10
|
||||
#define WF_MOD_1 WF_MOD_MOD_WHEEL
|
||||
#define WF_MOD_BREATH 11
|
||||
#define WF_MOD_2 WF_MOD_BREATH
|
||||
#define WF_MOD_FOOT 12
|
||||
#define WF_MOD_4 WF_MOD_FOOT
|
||||
#define WF_MOD_VOLUME 13
|
||||
#define WF_MOD_7 WF_MOD_VOLUME
|
||||
#define WF_MOD_PAN 14
|
||||
#define WF_MOD_10 WF_MOD_PAN
|
||||
#define WF_MOD_EXPR 15
|
||||
#define WF_MOD_11 WF_MOD_EXPR
|
||||
|
||||
/* FX-related material */
|
||||
|
||||
typedef struct wf_fx_info {
|
||||
int request; /* see list below */
|
||||
long data[4]; /* we don't need much */
|
||||
} wavefront_fx_info;
|
||||
|
||||
/* support for each of these will be forthcoming once I or someone
|
||||
else has figured out which of the addresses on page 6 and page 7 of
|
||||
the YSS225 control each parameter. Incidentally, these come from
|
||||
the Windows driver interface, but again, Turtle Beach didn't
|
||||
document the API to use them.
|
||||
*/
|
||||
|
||||
#define WFFX_SETOUTGAIN 0
|
||||
#define WFFX_SETSTEREOOUTGAIN 1
|
||||
#define WFFX_SETREVERBIN1GAIN 2
|
||||
#define WFFX_SETREVERBIN2GAIN 3
|
||||
#define WFFX_SETREVERBIN3GAIN 4
|
||||
#define WFFX_SETCHORUSINPORT 5
|
||||
#define WFFX_SETREVERBIN1PORT 6
|
||||
#define WFFX_SETREVERBIN2PORT 7
|
||||
#define WFFX_SETREVERBIN3PORT 8
|
||||
#define WFFX_SETEFFECTPORT 9
|
||||
#define WFFX_SETAUXPORT 10
|
||||
#define WFFX_SETREVERBTYPE 11
|
||||
#define WFFX_SETREVERBDELAY 12
|
||||
#define WFFX_SETCHORUSLFO 13
|
||||
#define WFFX_SETCHORUSPMD 14
|
||||
#define WFFX_SETCHORUSAMD 15
|
||||
#define WFFX_SETEFFECT 16
|
||||
#define WFFX_SETBASEALL 17
|
||||
#define WFFX_SETREVERBALL 18
|
||||
#define WFFX_SETCHORUSALL 20
|
||||
#define WFFX_SETREVERBDEF 22
|
||||
#define WFFX_SETCHORUSDEF 23
|
||||
#define WFFX_DELAYSETINGAIN 24
|
||||
#define WFFX_DELAYSETFBGAIN 25
|
||||
#define WFFX_DELAYSETFBLPF 26
|
||||
#define WFFX_DELAYSETGAIN 27
|
||||
#define WFFX_DELAYSETTIME 28
|
||||
#define WFFX_DELAYSETFBTIME 29
|
||||
#define WFFX_DELAYSETALL 30
|
||||
#define WFFX_DELAYSETDEF 32
|
||||
#define WFFX_SDELAYSETINGAIN 33
|
||||
#define WFFX_SDELAYSETFBGAIN 34
|
||||
#define WFFX_SDELAYSETFBLPF 35
|
||||
#define WFFX_SDELAYSETGAIN 36
|
||||
#define WFFX_SDELAYSETTIME 37
|
||||
#define WFFX_SDELAYSETFBTIME 38
|
||||
#define WFFX_SDELAYSETALL 39
|
||||
#define WFFX_SDELAYSETDEF 41
|
||||
#define WFFX_DEQSETINGAIN 42
|
||||
#define WFFX_DEQSETFILTER 43
|
||||
#define WFFX_DEQSETALL 44
|
||||
#define WFFX_DEQSETDEF 46
|
||||
#define WFFX_MUTE 47
|
||||
#define WFFX_FLANGESETBALANCE 48
|
||||
#define WFFX_FLANGESETDELAY 49
|
||||
#define WFFX_FLANGESETDWFFX_TH 50
|
||||
#define WFFX_FLANGESETFBGAIN 51
|
||||
#define WFFX_FLANGESETINGAIN 52
|
||||
#define WFFX_FLANGESETLFO 53
|
||||
#define WFFX_FLANGESETALL 54
|
||||
#define WFFX_FLANGESETDEF 56
|
||||
#define WFFX_PITCHSETSHIFT 57
|
||||
#define WFFX_PITCHSETBALANCE 58
|
||||
#define WFFX_PITCHSETALL 59
|
||||
#define WFFX_PITCHSETDEF 61
|
||||
#define WFFX_SRSSETINGAIN 62
|
||||
#define WFFX_SRSSETSPACE 63
|
||||
#define WFFX_SRSSETCENTER 64
|
||||
#define WFFX_SRSSETGAIN 65
|
||||
#define WFFX_SRSSETMODE 66
|
||||
#define WFFX_SRSSETDEF 68
|
||||
|
||||
/* Allow direct user-space control over FX memory/coefficient data.
|
||||
In theory this could be used to download the FX microprogram,
|
||||
but it would be a little slower, and involve some weird code.
|
||||
*/
|
||||
|
||||
#define WFFX_MEMSET 69
|
||||
|
||||
#endif /* __SOUND_WAVEFRONT_H__ */
|
||||
9
include/sound/wavefront_fx.h
Normal file
9
include/sound/wavefront_fx.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef __SOUND_WAVEFRONT_FX_H
|
||||
#define __SOUND_WAVEFRONT_FX_H
|
||||
|
||||
extern int snd_wavefront_fx_detect (snd_wavefront_t *);
|
||||
extern void snd_wavefront_fx_ioctl (snd_synth_t *sdev,
|
||||
unsigned int cmd,
|
||||
unsigned long arg);
|
||||
|
||||
#endif __SOUND_WAVEFRONT_FX_H
|
||||
387
include/sound/ymfpci.h
Normal file
387
include/sound/ymfpci.h
Normal file
@@ -0,0 +1,387 @@
|
||||
#ifndef __SOUND_YMFPCI_H
|
||||
#define __SOUND_YMFPCI_H
|
||||
|
||||
/*
|
||||
* Copyright (c) by Jaroslav Kysela <perex@suse.cz>
|
||||
* Definitions for Yahama YMF724/740/744/754 chips
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "pcm.h"
|
||||
#include "rawmidi.h"
|
||||
#include "ac97_codec.h"
|
||||
#include "timer.h"
|
||||
#include <linux/gameport.h>
|
||||
|
||||
/*
|
||||
* Direct registers
|
||||
*/
|
||||
|
||||
#define YMFREG(chip, reg) (chip->port + YDSXGR_##reg)
|
||||
|
||||
#define YDSXGR_INTFLAG 0x0004
|
||||
#define YDSXGR_ACTIVITY 0x0006
|
||||
#define YDSXGR_GLOBALCTRL 0x0008
|
||||
#define YDSXGR_ZVCTRL 0x000A
|
||||
#define YDSXGR_TIMERCTRL 0x0010
|
||||
#define YDSXGR_TIMERCOUNT 0x0012
|
||||
#define YDSXGR_SPDIFOUTCTRL 0x0018
|
||||
#define YDSXGR_SPDIFOUTSTATUS 0x001C
|
||||
#define YDSXGR_EEPROMCTRL 0x0020
|
||||
#define YDSXGR_SPDIFINCTRL 0x0034
|
||||
#define YDSXGR_SPDIFINSTATUS 0x0038
|
||||
#define YDSXGR_DSPPROGRAMDL 0x0048
|
||||
#define YDSXGR_DLCNTRL 0x004C
|
||||
#define YDSXGR_GPIOININTFLAG 0x0050
|
||||
#define YDSXGR_GPIOININTENABLE 0x0052
|
||||
#define YDSXGR_GPIOINSTATUS 0x0054
|
||||
#define YDSXGR_GPIOOUTCTRL 0x0056
|
||||
#define YDSXGR_GPIOFUNCENABLE 0x0058
|
||||
#define YDSXGR_GPIOTYPECONFIG 0x005A
|
||||
#define YDSXGR_AC97CMDDATA 0x0060
|
||||
#define YDSXGR_AC97CMDADR 0x0062
|
||||
#define YDSXGR_PRISTATUSDATA 0x0064
|
||||
#define YDSXGR_PRISTATUSADR 0x0066
|
||||
#define YDSXGR_SECSTATUSDATA 0x0068
|
||||
#define YDSXGR_SECSTATUSADR 0x006A
|
||||
#define YDSXGR_SECCONFIG 0x0070
|
||||
#define YDSXGR_LEGACYOUTVOL 0x0080
|
||||
#define YDSXGR_LEGACYOUTVOLL 0x0080
|
||||
#define YDSXGR_LEGACYOUTVOLR 0x0082
|
||||
#define YDSXGR_NATIVEDACOUTVOL 0x0084
|
||||
#define YDSXGR_NATIVEDACOUTVOLL 0x0084
|
||||
#define YDSXGR_NATIVEDACOUTVOLR 0x0086
|
||||
#define YDSXGR_ZVOUTVOL 0x0088
|
||||
#define YDSXGR_ZVOUTVOLL 0x0088
|
||||
#define YDSXGR_ZVOUTVOLR 0x008A
|
||||
#define YDSXGR_SECADCOUTVOL 0x008C
|
||||
#define YDSXGR_SECADCOUTVOLL 0x008C
|
||||
#define YDSXGR_SECADCOUTVOLR 0x008E
|
||||
#define YDSXGR_PRIADCOUTVOL 0x0090
|
||||
#define YDSXGR_PRIADCOUTVOLL 0x0090
|
||||
#define YDSXGR_PRIADCOUTVOLR 0x0092
|
||||
#define YDSXGR_LEGACYLOOPVOL 0x0094
|
||||
#define YDSXGR_LEGACYLOOPVOLL 0x0094
|
||||
#define YDSXGR_LEGACYLOOPVOLR 0x0096
|
||||
#define YDSXGR_NATIVEDACLOOPVOL 0x0098
|
||||
#define YDSXGR_NATIVEDACLOOPVOLL 0x0098
|
||||
#define YDSXGR_NATIVEDACLOOPVOLR 0x009A
|
||||
#define YDSXGR_ZVLOOPVOL 0x009C
|
||||
#define YDSXGR_ZVLOOPVOLL 0x009E
|
||||
#define YDSXGR_ZVLOOPVOLR 0x009E
|
||||
#define YDSXGR_SECADCLOOPVOL 0x00A0
|
||||
#define YDSXGR_SECADCLOOPVOLL 0x00A0
|
||||
#define YDSXGR_SECADCLOOPVOLR 0x00A2
|
||||
#define YDSXGR_PRIADCLOOPVOL 0x00A4
|
||||
#define YDSXGR_PRIADCLOOPVOLL 0x00A4
|
||||
#define YDSXGR_PRIADCLOOPVOLR 0x00A6
|
||||
#define YDSXGR_NATIVEADCINVOL 0x00A8
|
||||
#define YDSXGR_NATIVEADCINVOLL 0x00A8
|
||||
#define YDSXGR_NATIVEADCINVOLR 0x00AA
|
||||
#define YDSXGR_NATIVEDACINVOL 0x00AC
|
||||
#define YDSXGR_NATIVEDACINVOLL 0x00AC
|
||||
#define YDSXGR_NATIVEDACINVOLR 0x00AE
|
||||
#define YDSXGR_BUF441OUTVOL 0x00B0
|
||||
#define YDSXGR_BUF441OUTVOLL 0x00B0
|
||||
#define YDSXGR_BUF441OUTVOLR 0x00B2
|
||||
#define YDSXGR_BUF441LOOPVOL 0x00B4
|
||||
#define YDSXGR_BUF441LOOPVOLL 0x00B4
|
||||
#define YDSXGR_BUF441LOOPVOLR 0x00B6
|
||||
#define YDSXGR_SPDIFOUTVOL 0x00B8
|
||||
#define YDSXGR_SPDIFOUTVOLL 0x00B8
|
||||
#define YDSXGR_SPDIFOUTVOLR 0x00BA
|
||||
#define YDSXGR_SPDIFLOOPVOL 0x00BC
|
||||
#define YDSXGR_SPDIFLOOPVOLL 0x00BC
|
||||
#define YDSXGR_SPDIFLOOPVOLR 0x00BE
|
||||
#define YDSXGR_ADCSLOTSR 0x00C0
|
||||
#define YDSXGR_RECSLOTSR 0x00C4
|
||||
#define YDSXGR_ADCFORMAT 0x00C8
|
||||
#define YDSXGR_RECFORMAT 0x00CC
|
||||
#define YDSXGR_P44SLOTSR 0x00D0
|
||||
#define YDSXGR_STATUS 0x0100
|
||||
#define YDSXGR_CTRLSELECT 0x0104
|
||||
#define YDSXGR_MODE 0x0108
|
||||
#define YDSXGR_SAMPLECOUNT 0x010C
|
||||
#define YDSXGR_NUMOFSAMPLES 0x0110
|
||||
#define YDSXGR_CONFIG 0x0114
|
||||
#define YDSXGR_PLAYCTRLSIZE 0x0140
|
||||
#define YDSXGR_RECCTRLSIZE 0x0144
|
||||
#define YDSXGR_EFFCTRLSIZE 0x0148
|
||||
#define YDSXGR_WORKSIZE 0x014C
|
||||
#define YDSXGR_MAPOFREC 0x0150
|
||||
#define YDSXGR_MAPOFEFFECT 0x0154
|
||||
#define YDSXGR_PLAYCTRLBASE 0x0158
|
||||
#define YDSXGR_RECCTRLBASE 0x015C
|
||||
#define YDSXGR_EFFCTRLBASE 0x0160
|
||||
#define YDSXGR_WORKBASE 0x0164
|
||||
#define YDSXGR_DSPINSTRAM 0x1000
|
||||
#define YDSXGR_CTRLINSTRAM 0x4000
|
||||
|
||||
#define YDSXG_AC97READCMD 0x8000
|
||||
#define YDSXG_AC97WRITECMD 0x0000
|
||||
|
||||
#define PCIR_DSXG_LEGACY 0x40
|
||||
#define PCIR_DSXG_ELEGACY 0x42
|
||||
#define PCIR_DSXG_CTRL 0x48
|
||||
#define PCIR_DSXG_PWRCTRL1 0x4a
|
||||
#define PCIR_DSXG_PWRCTRL2 0x4e
|
||||
#define PCIR_DSXG_FMBASE 0x60
|
||||
#define PCIR_DSXG_SBBASE 0x62
|
||||
#define PCIR_DSXG_MPU401BASE 0x64
|
||||
#define PCIR_DSXG_JOYBASE 0x66
|
||||
|
||||
#define YDSXG_DSPLENGTH 0x0080
|
||||
#define YDSXG_CTRLLENGTH 0x3000
|
||||
|
||||
#define YDSXG_DEFAULT_WORK_SIZE 0x0400
|
||||
|
||||
#define YDSXG_PLAYBACK_VOICES 64
|
||||
#define YDSXG_CAPTURE_VOICES 2
|
||||
#define YDSXG_EFFECT_VOICES 5
|
||||
|
||||
#define YMFPCI_LEGACY_SBEN (1 << 0) /* soundblaster enable */
|
||||
#define YMFPCI_LEGACY_FMEN (1 << 1) /* OPL3 enable */
|
||||
#define YMFPCI_LEGACY_JPEN (1 << 2) /* joystick enable */
|
||||
#define YMFPCI_LEGACY_MEN (1 << 3) /* MPU401 enable */
|
||||
#define YMFPCI_LEGACY_MIEN (1 << 4) /* MPU RX irq enable */
|
||||
#define YMFPCI_LEGACY_IOBITS (1 << 5) /* i/o bits range, 0 = 16bit, 1 =10bit */
|
||||
#define YMFPCI_LEGACY_SDMA (3 << 6) /* SB DMA select */
|
||||
#define YMFPCI_LEGACY_SBIRQ (7 << 8) /* SB IRQ select */
|
||||
#define YMFPCI_LEGACY_MPUIRQ (7 << 11) /* MPU IRQ select */
|
||||
#define YMFPCI_LEGACY_SIEN (1 << 14) /* serialized IRQ */
|
||||
#define YMFPCI_LEGACY_LAD (1 << 15) /* legacy audio disable */
|
||||
|
||||
#define YMFPCI_LEGACY2_FMIO (3 << 0) /* OPL3 i/o address (724/740) */
|
||||
#define YMFPCI_LEGACY2_SBIO (3 << 2) /* SB i/o address (724/740) */
|
||||
#define YMFPCI_LEGACY2_MPUIO (3 << 4) /* MPU401 i/o address (724/740) */
|
||||
#define YMFPCI_LEGACY2_JSIO (3 << 6) /* joystick i/o address (724/740) */
|
||||
#define YMFPCI_LEGACY2_MAIM (1 << 8) /* MPU401 ack intr mask */
|
||||
#define YMFPCI_LEGACY2_SMOD (3 << 11) /* SB DMA mode */
|
||||
#define YMFPCI_LEGACY2_SBVER (3 << 13) /* SB version select */
|
||||
#define YMFPCI_LEGACY2_IMOD (1 << 15) /* legacy IRQ mode */
|
||||
/* SIEN:IMOD 0:0 = legacy irq, 0:1 = INTA, 1:0 = serialized IRQ */
|
||||
|
||||
#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
|
||||
#define SUPPORT_JOYSTICK
|
||||
#endif
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
struct snd_ymfpci_playback_bank {
|
||||
u32 format;
|
||||
u32 loop_default;
|
||||
u32 base; /* 32-bit address */
|
||||
u32 loop_start; /* 32-bit offset */
|
||||
u32 loop_end; /* 32-bit offset */
|
||||
u32 loop_frac; /* 8-bit fraction - loop_start */
|
||||
u32 delta_end; /* pitch delta end */
|
||||
u32 lpfK_end;
|
||||
u32 eg_gain_end;
|
||||
u32 left_gain_end;
|
||||
u32 right_gain_end;
|
||||
u32 eff1_gain_end;
|
||||
u32 eff2_gain_end;
|
||||
u32 eff3_gain_end;
|
||||
u32 lpfQ;
|
||||
u32 status;
|
||||
u32 num_of_frames;
|
||||
u32 loop_count;
|
||||
u32 start;
|
||||
u32 start_frac;
|
||||
u32 delta;
|
||||
u32 lpfK;
|
||||
u32 eg_gain;
|
||||
u32 left_gain;
|
||||
u32 right_gain;
|
||||
u32 eff1_gain;
|
||||
u32 eff2_gain;
|
||||
u32 eff3_gain;
|
||||
u32 lpfD1;
|
||||
u32 lpfD2;
|
||||
};
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
struct snd_ymfpci_effect_bank {
|
||||
u32 base; /* 32-bit address */
|
||||
u32 loop_end; /* 32-bit offset */
|
||||
u32 start; /* 32-bit offset */
|
||||
u32 temp;
|
||||
};
|
||||
|
||||
struct snd_ymfpci_pcm;
|
||||
struct snd_ymfpci;
|
||||
|
||||
enum snd_ymfpci_voice_type {
|
||||
YMFPCI_PCM,
|
||||
YMFPCI_SYNTH,
|
||||
YMFPCI_MIDI
|
||||
};
|
||||
|
||||
struct snd_ymfpci_voice {
|
||||
struct snd_ymfpci *chip;
|
||||
int number;
|
||||
unsigned int use: 1,
|
||||
pcm: 1,
|
||||
synth: 1,
|
||||
midi: 1;
|
||||
struct snd_ymfpci_playback_bank *bank;
|
||||
dma_addr_t bank_addr;
|
||||
void (*interrupt)(struct snd_ymfpci *chip, struct snd_ymfpci_voice *voice);
|
||||
struct snd_ymfpci_pcm *ypcm;
|
||||
};
|
||||
|
||||
enum snd_ymfpci_pcm_type {
|
||||
PLAYBACK_VOICE,
|
||||
CAPTURE_REC,
|
||||
CAPTURE_AC97,
|
||||
EFFECT_DRY_LEFT,
|
||||
EFFECT_DRY_RIGHT,
|
||||
EFFECT_EFF1,
|
||||
EFFECT_EFF2,
|
||||
EFFECT_EFF3
|
||||
};
|
||||
|
||||
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,
|
||||
use_441_slot: 1,
|
||||
output_front: 1,
|
||||
output_rear: 1,
|
||||
swap_rear: 1;
|
||||
unsigned int update_pcm_vol;
|
||||
u32 period_size; /* cached from runtime->period_size */
|
||||
u32 buffer_size; /* cached from runtime->buffer_size */
|
||||
u32 period_pos;
|
||||
u32 last_pos;
|
||||
u32 capture_bank_number;
|
||||
u32 shift;
|
||||
};
|
||||
|
||||
struct snd_ymfpci {
|
||||
int irq;
|
||||
|
||||
unsigned int device_id; /* PCI device ID */
|
||||
unsigned char rev; /* PCI revision */
|
||||
unsigned long reg_area_phys;
|
||||
void __iomem *reg_area_virt;
|
||||
struct resource *res_reg_area;
|
||||
struct resource *fm_res;
|
||||
struct resource *mpu_res;
|
||||
|
||||
unsigned short old_legacy_ctrl;
|
||||
#ifdef SUPPORT_JOYSTICK
|
||||
struct gameport *gameport;
|
||||
#endif
|
||||
|
||||
struct snd_dma_buffer work_ptr;
|
||||
|
||||
unsigned int bank_size_playback;
|
||||
unsigned int bank_size_capture;
|
||||
unsigned int bank_size_effect;
|
||||
unsigned int work_size;
|
||||
|
||||
void *bank_base_playback;
|
||||
void *bank_base_capture;
|
||||
void *bank_base_effect;
|
||||
void *work_base;
|
||||
dma_addr_t bank_base_playback_addr;
|
||||
dma_addr_t bank_base_capture_addr;
|
||||
dma_addr_t bank_base_effect_addr;
|
||||
dma_addr_t work_base_addr;
|
||||
struct snd_dma_buffer ac3_tmp_base;
|
||||
|
||||
u32 *ctrl_playback;
|
||||
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;
|
||||
struct snd_ymfpci_voice voices[64];
|
||||
int src441_used;
|
||||
|
||||
struct snd_ac97_bus *ac97_bus;
|
||||
struct snd_ac97 *ac97;
|
||||
struct snd_rawmidi *rawmidi;
|
||||
struct snd_timer *timer;
|
||||
|
||||
struct pci_dev *pci;
|
||||
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;
|
||||
struct snd_kcontrol *spdif_pcm_ctl;
|
||||
int mode_dup4ch;
|
||||
int rear_opened;
|
||||
int spdif_opened;
|
||||
struct snd_ymfpci_pcm_mixer {
|
||||
u16 left;
|
||||
u16 right;
|
||||
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;
|
||||
struct snd_info_entry *proc_entry;
|
||||
const struct firmware *dsp_microcode;
|
||||
const struct firmware *controller_microcode;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
u32 *saved_regs;
|
||||
u32 saved_ydsxgr_mode;
|
||||
#endif
|
||||
};
|
||||
|
||||
int snd_ymfpci_create(struct snd_card *card,
|
||||
struct pci_dev *pci,
|
||||
unsigned short old_legacy_ctrl,
|
||||
struct snd_ymfpci ** rcodec);
|
||||
void snd_ymfpci_free_gameport(struct snd_ymfpci *chip);
|
||||
|
||||
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 */
|
||||
Reference in New Issue
Block a user