File: snddevices

package info (click to toggle)
alsa-driver 1.0.13-5etch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 20,108 kB
  • ctags: 50,477
  • sloc: ansic: 319,881; sh: 32,930; makefile: 2,015; python: 1,527; perl: 1,316; xml: 896; awk: 66
file content (275 lines) | stat: -rwxr-xr-x 6,729 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#!/bin/sh

# 20050524 Thomas Hood: Cleaned up; added --dev-dir option

DEV_DIR="/dev"
MAJOR=116
OSSMAJOR=14
DSP_MINOR=""
MAX_CARDS=4
OWNER=root.root
PERM=666
DIR_PERM=755
WIPE_OLD=yes

if [ "`grep "^audio:" /etc/group`x" != x ]; then
  OWNER=root.audio
fi

echo_usage () {
  echo "Usage: snddevices [-h|--help] [max] [--no-wipe] [--dev-dir=PATHNAME] [--owner=USER:GROUP]"
}

report_error () {
  echo "${0}: Error: $*" >&2
}

while [ "$1" ] ; do
  case "$1" in 
    "-?"|-h|--help) echo_usage ; exit 0 ;;
    max) DSP_MINOR=19 ;;
    --no-wipe) WIPE_OLD="" ;;
    --dev-dir) DEV_DIR="$2" ; shift ;;
    --dev-dir=*) DEV_DIR="${1#--dev-dir=}" ;;
    --owner) OWNER="$2" ; shift ;;
    --owner=*) OWNER="${1#--owner=}" ;;
    *) echo_usage >&2 ; exit 1 ;;
  esac
  shift
done

if [ "$OWNER" = "root.audio" ] ; then
  PERM=660
  DIR_PERM=750
fi

# Meant to be called from assert_*_args only
report_args_error () {
  # report_error "Incorrect call: ${FUNCNAME[2]}() takes $* arguments"
  report_error "Incorrect call: needs $* arguments"
}

assert_one_arg () {
  { [ "$1" ] && [ -z "$2" ] ; } || { report_args_error "one" ; exit 99 ; }
}

assert_two_args () {
  { [ "$2" ] && [ -z "$3" ] ; } || { report_args_error "two" ; exit 99 ; }
}

assert_three_args () {
  { [ "$3" ] && [ -z "$4" ] ; } || { report_args_error "three" ; exit 99 ; }
}

assert_three_or_four_args () {
  { [ "$3" ] && [ -z "$5" ] ; } || { report_args_error "three or four" ; exit 99 ; }
}

# $1 destination-relative pathname of source
# $2 DEV_DIR-relative pathname of destination
link_file () {
  assert_two_args "$@"
  ln -sf "$1" "$DEV_DIR/$2"
}

# $1 DEV_DIR-relative pathname of source
# $2 DEV_DIR-relative pathname of destination
move_file () {
  assert_two_args "$@"
  mv -f "$DEV_DIR/$1" "$DEV_DIR/$2"
}

# $1 DEV_DIR-relative shell glob pattern of files to delete
del_file_pattern () {
  assert_one_arg "$@"
  eval rm -f "$DEV_DIR/$1"
}

# $1 DEV_DIR-relative pathname to make
make_dir () {
  assert_one_arg "$@"
  mkdir -p "$DEV_DIR/$1"
}

# $1 DEV_DIR-relative pathname to delete
del_dir () {
  assert_one_arg "$@"
  rmdir "$DEV_DIR/$1"
}

# $1 DEV_DIR-relative pathname to test
is_dir () {
  assert_one_arg "$@"
  [ -d "$DEV_DIR/$1" ]
}

# $1 owner:group
# $2 DEV_DIR-relative pathname whose owner will be changed
change_owner () {
  assert_two_args "$@"
  chown "$1" "$DEV_DIR/$2"
}

# $1 perms
# $2 DEV_DIR-relative pathname whose perms will be changed
change_perms () {
  assert_two_args "$@"
  chmod "$1" "$DEV_DIR/$2"
}

# $1 DEV_DIR-relative pathname of node to make
# $2 major
# $3 minor
make_char_node () {
  assert_three_args "$@"
  rm -f "$DEV_DIR/$1"
  mknod "$DEV_DIR/$1" c "$2" "$3"
}


# $1 DEV_DIR-relative pathname of device to create
# $2 minor number of device to create
create_oss_dev () {
  assert_two_args "$@"
  del_file_pattern "$1"
  echo -n "Creating $1..."
  make_char_node "$1" "$OSSMAJOR" "$2"
  change_owner "$OWNER" "$1"
  change_perms "$PERM"  "$1"
  echo "done."
}

# $1 DEV_DIR-relative base pathname of devices to create
# $2 minor number offset of devices to create
create_oss_dev_range () {
  assert_two_args "$@"
  tmp=0
  tmp1=0
  del_file_pattern "$1"
  del_file_pattern "${1}?"
  echo -n "Creating $1?..."
  while [ "$tmp1" -lt "$MAX_CARDS" ]; do
    minor=`expr $2 + $tmp`
    make_char_node "$1$tmp1" "$OSSMAJOR" "$minor"
    change_owner "$OWNER" "$1$tmp1"
    change_perms "$PERM"  "$1$tmp1"
    tmp=`expr $tmp + 16`
    tmp1=`expr $tmp1 + 1`
  done
  echo "done."
}

# $1 DEV_DIR-relative pathname of device to create
# $2 minor number of device to create
create_single_dev () {
  assert_two_args "$@"
  del_file_pattern "$1"
  echo -n "Creating $1..."
  make_char_node "$1" "$MAJOR" "$2"
  change_owner "$OWNER" "$1"
  change_perms "$PERM"  "$1"
  echo "done."
}

# $1 DEV_DIR-relative base pathname of devices to create
# $2 minor number offset of devices to create
create_card_dev_range () {
  assert_two_args "$@"
  tmp=0
  del_file_pattern "$1"
  del_file_pattern "${1}?"
  echo -n "Creating $1?..."
  while [ "$tmp" -lt "$MAX_CARDS" ]; do
    minor=`expr $tmp \* 32`
    minor=`expr $2 + $minor`
    make_char_node "${1}C${tmp}" "$MAJOR" "$minor"
    change_owner "$OWNER" "${1}C${tmp}"
    change_perms "$PERM"  "${1}C${tmp}"
    tmp=`expr $tmp + 1`
  done
  echo "done."
}

# $1 DEV_DIR-relative base pathname of devices to create
# $2 minor number offset of devices to create
# $3 number of devices to create
# [$4 device name suffix]
create_device_dev_range () {
  assert_three_or_four_args "$@"
  tmp=0
  del_file_pattern "$1"
  del_file_pattern "${1}?"
  echo -n "Creating $1??$4..."
  while [ "$tmp" -lt "$MAX_CARDS" ]; do
    tmp1=0
    while [ "$tmp1" -lt "$3" ]; do
      minor=`expr $tmp \* 32`
      minor=`expr $2 + $minor + $tmp1`
      make_char_node "${1}C${tmp}D${tmp1}${4}" "$MAJOR" "$minor"
      change_owner "$OWNER" "${1}C${tmp}D${tmp1}${4}"
      change_perms "$PERM"  "${1}C${tmp}D${tmp1}${4}"
      tmp1=`expr $tmp1 + 1`
    done
    tmp=`expr $tmp + 1`
  done
  echo "done."
}

# OSS (Lite) compatible devices...

if test "$OSSMAJOR" -eq 14; then
  create_oss_dev_range mixer            0
  create_oss_dev       sequencer        1
  create_oss_dev_range midi0            2	# /dev/midi is for tclmidi
  create_oss_dev_range dsp              3
  create_oss_dev_range audio            4
  create_oss_dev       sndstat          6
  create_oss_dev       music            8
  create_oss_dev_range dmmidi           9
  create_oss_dev_range dmfm             10
  create_oss_dev_range amixer           11	# alternate mixer
  create_oss_dev_range adsp             12	# alternate dsp
  create_oss_dev_range amidi            13	# alternate midi
  create_oss_dev_range admmidi          14	# alternate direct midi
  # create symlinks
  link_file mixer0 mixer
  link_file midi00 midi		# /dev/midi0 is for tclmidi
  link_file dsp0   dsp
  link_file audio0 audio
  link_file music  sequencer2
  link_file adsp0  adsp
  link_file amidi0 amidi
fi

# Remove old devices

if [ "$WIPE_OLD" = yes ] ; then
  move_file sndstat 1sndstat 
  del_file_pattern 'snd*'
  move_file 1sndstat sndstat

  if is_dir snd ; then
    del_file_pattern 'snd/*'
    del_dir snd
  fi
fi

# Create new ones

make_dir snd
change_owner "$OWNER"    snd
change_perms "$DIR_PERM" snd
create_card_dev_range   snd/control     0
create_single_dev       snd/seq         1
create_single_dev       snd/timer       33
create_device_dev_range snd/hw          4	4
create_device_dev_range snd/midi        8	8
create_device_dev_range snd/pcm         16	8	p
create_device_dev_range snd/pcm         24	8	c

# Create loader devices

del_file_pattern 'aload*'
create_card_dev_range   aload       0
create_single_dev       aloadSEQ    1