2005-04-16 15:20:36 -07:00
/*
* Local definitions for the OPL4 driver
*
* Copyright ( c ) 2003 by Clemens Ladisch < clemens @ ladisch . de >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions , and the following disclaimer ,
* without modification .
* 2. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* Alternatively , this software may be distributed and / or modified 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 SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ` ` AS IS ' ' AND
* ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
* LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE .
*/
# ifndef __OPL4_LOCAL_H
# define __OPL4_LOCAL_H
# include <sound/opl4.h>
/*
* Register numbers
*/
# define OPL4_REG_TEST0 0x00
# define OPL4_REG_TEST1 0x01
# define OPL4_REG_MEMORY_CONFIGURATION 0x02
# define OPL4_MODE_BIT 0x01
# define OPL4_MTYPE_BIT 0x02
# define OPL4_TONE_HEADER_MASK 0x1c
# define OPL4_DEVICE_ID_MASK 0xe0
# define OPL4_REG_MEMORY_ADDRESS_HIGH 0x03
# define OPL4_REG_MEMORY_ADDRESS_MID 0x04
# define OPL4_REG_MEMORY_ADDRESS_LOW 0x05
# define OPL4_REG_MEMORY_DATA 0x06
/*
* Offsets to the register banks for voices . To get the
* register number just add the voice number to the bank offset .
*
* Wave Table Number low bits ( 0x08 to 0x1F )
*/
# define OPL4_REG_TONE_NUMBER 0x08
/* Wave Table Number high bit, F-Number low bits (0x20 to 0x37) */
# define OPL4_REG_F_NUMBER 0x20
# define OPL4_TONE_NUMBER_BIT8 0x01
# define OPL4_F_NUMBER_LOW_MASK 0xfe
/* F-Number high bits, Octave, Pseudo-Reverb (0x38 to 0x4F) */
# define OPL4_REG_OCTAVE 0x38
# define OPL4_F_NUMBER_HIGH_MASK 0x07
# define OPL4_BLOCK_MASK 0xf0
# define OPL4_PSEUDO_REVERB_BIT 0x08
/* Total Level, Level Direct (0x50 to 0x67) */
# define OPL4_REG_LEVEL 0x50
# define OPL4_TOTAL_LEVEL_MASK 0xfe
# define OPL4_LEVEL_DIRECT_BIT 0x01
/* Key On, Damp, LFO RST, CH, Panpot (0x68 to 0x7F) */
# define OPL4_REG_MISC 0x68
# define OPL4_KEY_ON_BIT 0x80
# define OPL4_DAMP_BIT 0x40
# define OPL4_LFO_RESET_BIT 0x20
# define OPL4_OUTPUT_CHANNEL_BIT 0x10
# define OPL4_PAN_POT_MASK 0x0f
/* LFO, VIB (0x80 to 0x97) */
# define OPL4_REG_LFO_VIBRATO 0x80
# define OPL4_LFO_FREQUENCY_MASK 0x38
# define OPL4_VIBRATO_DEPTH_MASK 0x07
# define OPL4_CHORUS_SEND_MASK 0xc0 /* ML only */
/* Attack / Decay 1 rate (0x98 to 0xAF) */
# define OPL4_REG_ATTACK_DECAY1 0x98
# define OPL4_ATTACK_RATE_MASK 0xf0
# define OPL4_DECAY1_RATE_MASK 0x0f
/* Decay level / 2 rate (0xB0 to 0xC7) */
# define OPL4_REG_LEVEL_DECAY2 0xb0
# define OPL4_DECAY_LEVEL_MASK 0xf0
# define OPL4_DECAY2_RATE_MASK 0x0f
/* Release rate / Rate correction (0xC8 to 0xDF) */
# define OPL4_REG_RELEASE_CORRECTION 0xc8
# define OPL4_RELEASE_RATE_MASK 0x0f
# define OPL4_RATE_INTERPOLATION_MASK 0xf0
/* AM (0xE0 to 0xF7) */
# define OPL4_REG_TREMOLO 0xe0
# define OPL4_TREMOLO_DEPTH_MASK 0x07
# define OPL4_REVERB_SEND_MASK 0xe0 /* ML only */
/* Mixer */
# define OPL4_REG_MIX_CONTROL_FM 0xf8
# define OPL4_REG_MIX_CONTROL_PCM 0xf9
# define OPL4_MIX_LEFT_MASK 0x07
# define OPL4_MIX_RIGHT_MASK 0x38
# define OPL4_REG_ATC 0xfa
# define OPL4_ATC_BIT 0x01 /* ???, ML only */
/* bits in the OPL3 Status register */
# define OPL4_STATUS_BUSY 0x01
# define OPL4_STATUS_LOAD 0x02
# define OPL4_MAX_VOICES 24
# define SNDRV_SEQ_DEV_ID_OPL4 "opl4-synth"
2005-11-17 14:13:47 +01:00
struct opl4_sound {
2005-04-16 15:20:36 -07:00
u16 tone ;
s16 pitch_offset ;
u8 key_scaling ;
s8 panpot ;
u8 vibrato ;
u8 tone_attenuate ;
u8 volume_factor ;
u8 reg_lfo_vibrato ;
u8 reg_attack_decay1 ;
u8 reg_level_decay2 ;
u8 reg_release_correction ;
u8 reg_tremolo ;
2005-11-17 14:13:47 +01:00
} ;
2005-04-16 15:20:36 -07:00
2005-11-17 14:13:47 +01:00
struct opl4_region {
2005-04-16 15:20:36 -07:00
u8 key_min , key_max ;
2005-11-17 14:13:47 +01:00
struct opl4_sound sound ;
} ;
2005-04-16 15:20:36 -07:00
2005-11-17 14:13:47 +01:00
struct opl4_region_ptr {
2005-04-16 15:20:36 -07:00
int count ;
2005-11-17 14:13:47 +01:00
const struct opl4_region * regions ;
} ;
2005-04-16 15:20:36 -07:00
2005-11-17 14:13:47 +01:00
struct opl4_voice {
2005-04-16 15:20:36 -07:00
struct list_head list ;
int number ;
2005-11-17 14:13:47 +01:00
struct snd_midi_channel * chan ;
2005-04-16 15:20:36 -07:00
int note ;
int velocity ;
2005-11-17 14:13:47 +01:00
const struct opl4_sound * sound ;
2005-04-16 15:20:36 -07:00
u8 level_direct ;
u8 reg_f_number ;
u8 reg_misc ;
u8 reg_lfo_vibrato ;
2005-11-17 14:13:47 +01:00
} ;
2005-04-16 15:20:36 -07:00
2005-11-17 14:13:47 +01:00
struct snd_opl4 {
2005-04-16 15:20:36 -07:00
unsigned long fm_port ;
unsigned long pcm_port ;
struct resource * res_fm_port ;
struct resource * res_pcm_port ;
unsigned short hardware ;
spinlock_t reg_lock ;
2005-11-17 14:13:47 +01:00
struct snd_card * card ;
2005-04-16 15:20:36 -07:00
2015-05-29 07:49:55 +02:00
# ifdef CONFIG_SND_PROC_FS
2005-11-17 14:13:47 +01:00
struct snd_info_entry * proc_entry ;
2005-04-16 15:20:36 -07:00
int memory_access ;
# endif
2006-01-16 16:31:42 +01:00
struct mutex access_mutex ;
2005-04-16 15:20:36 -07:00
ALSA: seq: Allow the modular sequencer registration
Many drivers bind the sequencer stuff in off-load by another driver
module, so that it's loaded only on demand. In the current code, this
mechanism doesn't work when the driver is built-in while the sequencer
is module. We check with IS_REACHABLE() and enable only when the
sequencer is in the same level of build.
However, this is basically a overshoot. The binder code
(snd-seq-device) is an individual module from the sequencer core
(snd-seq), and we just have to make the former a built-in while
keeping the latter a module for allowing the scenario like the above.
This patch achieves that by rewriting Kconfig slightly. Now, a driver
that provides the manual sequencer device binding should select
CONFIG_SND_SEQ_DEVICE in a way as
select SND_SEQ_DEVICE if SND_SEQUENCER != n
Note that the "!=n" is needed here to avoid the influence of the
sequencer core is module while the driver is built-in.
Also, since rawmidi.o may be linked with snd_seq_device.o when
built-in, we have to shuffle the code to make the linker happy.
(the kernel linker isn't smart enough yet to handle such a case.)
That is, snd_seq_device.c is moved to sound/core from sound/core/seq,
as well as Makefile.
Last but not least, the patch replaces the code using IS_REACHABLE()
with IS_ENABLED(), since now the condition meets always when enabled.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2017-06-09 15:11:58 +02:00
# if IS_ENABLED(CONFIG_SND_SEQUENCER)
2005-04-16 15:20:36 -07:00
int used ;
int seq_dev_num ;
int seq_client ;
2005-11-17 14:13:47 +01:00
struct snd_seq_device * seq_dev ;
2005-04-16 15:20:36 -07:00
2005-11-17 14:13:47 +01:00
struct snd_midi_channel_set * chset ;
struct opl4_voice voices [ OPL4_MAX_VOICES ] ;
2005-04-16 15:20:36 -07:00
struct list_head off_voices ;
struct list_head on_voices ;
# endif
} ;
/* opl4_lib.c */
2005-11-17 14:13:47 +01:00
void snd_opl4_write ( struct snd_opl4 * opl4 , u8 reg , u8 value ) ;
u8 snd_opl4_read ( struct snd_opl4 * opl4 , u8 reg ) ;
void snd_opl4_read_memory ( struct snd_opl4 * opl4 , char * buf , int offset , int size ) ;
void snd_opl4_write_memory ( struct snd_opl4 * opl4 , const char * buf , int offset , int size ) ;
2005-04-16 15:20:36 -07:00
/* opl4_mixer.c */
2005-11-17 14:13:47 +01:00
int snd_opl4_create_mixer ( struct snd_opl4 * opl4 ) ;
2005-04-16 15:20:36 -07:00
2015-05-29 07:49:55 +02:00
# ifdef CONFIG_SND_PROC_FS
2005-04-16 15:20:36 -07:00
/* opl4_proc.c */
2005-11-17 14:13:47 +01:00
int snd_opl4_create_proc ( struct snd_opl4 * opl4 ) ;
void snd_opl4_free_proc ( struct snd_opl4 * opl4 ) ;
2015-05-29 07:49:55 +02:00
# else
static inline int snd_opl4_create_proc ( struct snd_opl4 * opl4 ) { return 0 ; }
static inline void snd_opl4_free_proc ( struct snd_opl4 * opl4 ) { }
2005-04-16 15:20:36 -07:00
# endif
/* opl4_seq.c */
extern int volume_boost ;
/* opl4_synth.c */
2005-11-17 14:13:47 +01:00
void snd_opl4_synth_reset ( struct snd_opl4 * opl4 ) ;
void snd_opl4_synth_shutdown ( struct snd_opl4 * opl4 ) ;
void snd_opl4_note_on ( void * p , int note , int vel , struct snd_midi_channel * chan ) ;
void snd_opl4_note_off ( void * p , int note , int vel , struct snd_midi_channel * chan ) ;
void snd_opl4_terminate_note ( void * p , int note , struct snd_midi_channel * chan ) ;
void snd_opl4_control ( void * p , int type , struct snd_midi_channel * chan ) ;
void snd_opl4_sysex ( void * p , unsigned char * buf , int len , int parsed , struct snd_midi_channel_set * chset ) ;
2005-04-16 15:20:36 -07:00
/* yrw801.c */
2005-11-17 14:13:47 +01:00
int snd_yrw801_detect ( struct snd_opl4 * opl4 ) ;
extern const struct opl4_region_ptr snd_yrw801_regions [ ] ;
2005-04-16 15:20:36 -07:00
# endif /* __OPL4_LOCAL_H */