Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
sound
synth
emux
emux.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2000 Takashi Iwai <
[email protected]
>
3
*
4
* Routines for control of EMU WaveTable chip
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
*/
20
21
#include <linux/wait.h>
22
#include <linux/slab.h>
23
#include <linux/string.h>
24
#include <
sound/core.h
>
25
#include <
sound/emux_synth.h
>
26
#include <
linux/init.h
>
27
#include <linux/module.h>
28
#include "
emux_voice.h
"
29
30
MODULE_AUTHOR
(
"Takashi Iwai"
);
31
MODULE_DESCRIPTION
(
"Routines for control of EMU WaveTable chip"
);
32
MODULE_LICENSE
(
"GPL"
);
33
34
/*
35
* create a new hardware dependent device for Emu8000/Emu10k1
36
*/
37
int
snd_emux_new
(
struct
snd_emux
**remu)
38
{
39
struct
snd_emux
*
emu
;
40
41
*remu =
NULL
;
42
emu = kzalloc(
sizeof
(*emu),
GFP_KERNEL
);
43
if
(emu ==
NULL
)
44
return
-
ENOMEM
;
45
46
spin_lock_init
(&emu->
voice_lock
);
47
mutex_init
(&emu->
register_mutex
);
48
49
emu->
client
= -1;
50
#ifdef CONFIG_SND_SEQUENCER_OSS
51
emu->oss_synth =
NULL
;
52
#endif
53
emu->
max_voices
= 0;
54
emu->
use_time
= 0;
55
56
init_timer
(&emu->
tlist
);
57
emu->
tlist
.function =
snd_emux_timer_callback
;
58
emu->
tlist
.data = (
unsigned
long
)emu;
59
emu->
timer_active
= 0;
60
61
*remu = emu;
62
return
0;
63
}
64
65
EXPORT_SYMBOL
(
snd_emux_new
);
66
67
/*
68
*/
69
static
int
sf_sample_new(
void
*
private_data
,
struct
snd_sf_sample
*
sp
,
70
struct
snd_util_memhdr
*
hdr
,
71
const
void
__user *
buf
,
long
count
)
72
{
73
struct
snd_emux
*
emu
=
private_data
;
74
return
emu->
ops
.sample_new(emu, sp, hdr, buf, count);
75
76
}
77
78
static
int
sf_sample_free(
void
*private_data,
struct
snd_sf_sample
*sp,
79
struct
snd_util_memhdr
*hdr)
80
{
81
struct
snd_emux
*emu =
private_data
;
82
return
emu->
ops
.sample_free(emu, sp, hdr);
83
84
}
85
86
static
void
sf_sample_reset(
void
*private_data)
87
{
88
struct
snd_emux
*emu =
private_data
;
89
emu->
ops
.sample_reset(emu);
90
}
91
92
int
snd_emux_register
(
struct
snd_emux
*emu,
struct
snd_card
*
card
,
int
index
,
char
*
name
)
93
{
94
int
err
;
95
struct
snd_sf_callback
sf_cb;
96
97
if
(
snd_BUG_ON
(!emu->
hw
|| emu->
max_voices
<= 0))
98
return
-
EINVAL
;
99
if
(
snd_BUG_ON
(!card || !name))
100
return
-
EINVAL
;
101
102
emu->
card
=
card
;
103
emu->
name
=
kstrdup
(name,
GFP_KERNEL
);
104
emu->
voices
= kcalloc(emu->
max_voices
,
sizeof
(
struct
snd_emux_voice
),
105
GFP_KERNEL
);
106
if
(emu->
voices
==
NULL
)
107
return
-
ENOMEM
;
108
109
/* create soundfont list */
110
memset
(&sf_cb, 0,
sizeof
(sf_cb));
111
sf_cb.
private_data
= emu;
112
if
(emu->
ops
.sample_new)
113
sf_cb.
sample_new
= sf_sample_new;
114
if
(emu->
ops
.sample_free)
115
sf_cb.
sample_free
= sf_sample_free;
116
if
(emu->
ops
.sample_reset)
117
sf_cb.
sample_reset
= sf_sample_reset;
118
emu->
sflist
=
snd_sf_new
(&sf_cb, emu->
memhdr
);
119
if
(emu->
sflist
==
NULL
)
120
return
-
ENOMEM
;
121
122
if
((err =
snd_emux_init_hwdep
(emu)) < 0)
123
return
err
;
124
125
snd_emux_init_voices
(emu);
126
127
snd_emux_init_seq
(emu, card, index);
128
#ifdef CONFIG_SND_SEQUENCER_OSS
129
snd_emux_init_seq_oss
(emu);
130
#endif
131
snd_emux_init_virmidi
(emu, card);
132
133
#ifdef CONFIG_PROC_FS
134
snd_emux_proc_init(emu, card, index);
135
#endif
136
return
0;
137
}
138
139
EXPORT_SYMBOL
(
snd_emux_register
);
140
141
/*
142
*/
143
int
snd_emux_free
(
struct
snd_emux
*emu)
144
{
145
unsigned
long
flags
;
146
147
if
(! emu)
148
return
-
EINVAL
;
149
150
spin_lock_irqsave
(&emu->
voice_lock
, flags);
151
if
(emu->
timer_active
)
152
del_timer
(&emu->
tlist
);
153
spin_unlock_irqrestore(&emu->
voice_lock
, flags);
154
155
#ifdef CONFIG_PROC_FS
156
snd_emux_proc_free(emu);
157
#endif
158
snd_emux_delete_virmidi
(emu);
159
#ifdef CONFIG_SND_SEQUENCER_OSS
160
snd_emux_detach_seq_oss
(emu);
161
#endif
162
snd_emux_detach_seq
(emu);
163
164
snd_emux_delete_hwdep
(emu);
165
166
if
(emu->
sflist
)
167
snd_sf_free
(emu->
sflist
);
168
169
kfree
(emu->
voices
);
170
kfree
(emu->
name
);
171
kfree
(emu);
172
return
0;
173
}
174
175
EXPORT_SYMBOL
(
snd_emux_free
);
176
177
178
/*
179
* INIT part
180
*/
181
182
static
int
__init
alsa_emux_init(
void
)
183
{
184
return
0;
185
}
186
187
static
void
__exit
alsa_emux_exit(
void
)
188
{
189
}
190
191
module_init
(alsa_emux_init)
192
module_exit
(alsa_emux_exit)
Generated on Thu Jan 10 2013 15:08:49 for Linux Kernel by
1.8.2