1# Commands covered: sound play
2#
3
4package require -exact snack 2.2
5
6if {[lsearch [namespace children] ::tcltest] == -1} {
7    package require tcltest
8    namespace import ::tcltest::*
9}
10
11test play-1.1.1 {play command, non-blocking, -load} {
12  set s [snack::sound snd -load ex1.wav]
13  $s play -command {set flag 1}
14  vwait flag
15  $s destroy
16  set flag
17} 1
18
19test play-1.1.2 {play command, non-blocking, -file} {
20  set s [snack::sound snd -file ex1.wav]
21  $s play -command {set flag 1}
22  vwait flag
23  $s destroy
24  set flag
25} 1
26after 1000 {set flag 1} ; vwait flag
27
28test play-1.1.3 {play command, non-blocking, -channel} {
29  set fd [open ex1.wav]
30  set s [snack::sound snd -channel $fd]
31  $s play -command {set flag 1}
32  vwait flag
33  $s destroy
34  close $fd
35  set flag
36} 1
37
38test play-1.1.4 {play command, -channel, data in WAV format} {
39  proc endproc {snd sock} {
40    set info [$snd info]
41    close $sock
42    $snd destroy
43    set ::flag [lindex $info 6]
44  }
45  proc servproc { sock addr port } {
46    set s [snack::sound snd -channel $sock]
47    $s play -command [list endproc $s $sock]
48  }
49
50  set fd [open ex1.wav]
51  fconfigure $fd -translation binary
52  if {$::tcl_version > 8.0} {
53    fconfigure $fd -encoding binary
54  }
55  set data [read $fd]
56  close $fd
57
58  set servsock [socket -server servproc 24680]
59
60  set sock [socket localhost 24680]
61  fconfigure $sock -translation binary -blocking 1
62  if {$::tcl_version > 8.0} {
63    fconfigure $sock -encoding binary
64  }
65  puts -nonewline $sock $data
66  close $sock
67
68  vwait flag
69  set flag
70} WAV
71
72test play-1.1.5 {play command, -channel, data in AU format} {
73  proc endproc {snd sock} {
74    set info [$snd info]
75    close $sock
76    $snd destroy
77    set ::flag [lindex $info 6]
78  }
79  proc servproc { sock addr port } {
80    set s [snack::sound snd -channel $sock]
81    $s play -command [list endproc $s $sock]
82  }
83
84  set s [snack::sound snd -load ex1.wav]
85  set data [$s data -fileformat au]
86  $s destroy
87
88  set servsock [socket -server servproc 24681]
89
90  set sock [socket localhost 24681]
91  fconfigure $sock -translation binary -blocking 1
92  if {$::tcl_version > 8.0} {
93    fconfigure $sock -encoding binary
94  }
95  puts -nonewline $sock $data
96  close $sock
97
98  vwait flag
99  set flag
100} AU
101
102test play-1.1.6 {play command, -channel, data as littleEndian shorts} {
103  proc endproc {snd sock} {
104    set info [$snd info]
105    close $sock
106    $snd destroy
107    set ::flag [lindex $info 6]
108  }
109  proc servproc { sock addr port } {
110    set s [snack::sound snd -channel $sock -byteorder littleEndian]
111    $s play -command [list endproc $s $sock]
112  }
113
114  set s [snack::sound snd -load ex1.wav]
115  set data [$s data -fileformat raw -byteorder littleEndian]
116  $s destroy
117
118  set servsock [socket -server servproc 24682]
119
120  set sock [socket localhost 24682]
121  fconfigure $sock -translation binary -blocking 1
122  if {$::tcl_version > 8.0} {
123    fconfigure $sock -encoding binary
124  }
125  puts -nonewline $sock $data
126  close $sock
127
128  vwait flag
129  set flag
130} RAW
131
132test play-1.1.7 {play command, -channel, data as bigEndian shorts} {
133  proc endproc {snd sock} {
134    set info [$snd info]
135    close $sock
136    $snd destroy
137    set ::flag [lindex $info 6]
138  }
139  proc servproc { sock addr port } {
140    set s [snack::sound snd -channel $sock -byteorder bigEndian]
141    $s play -command [list endproc $s $sock]
142  }
143
144  set s [snack::sound snd -load ex1.wav]
145  set data [$s data -fileformat raw -byteorder bigendian]
146  $s destroy
147
148  set servsock [socket -server servproc 24683]
149
150  set sock [socket localhost 24683]
151  fconfigure $sock -translation binary -blocking 1
152  if {$::tcl_version > 8.0} {
153    fconfigure $sock -encoding binary
154  }
155  puts -nonewline $sock $data
156  close $sock
157
158  vwait flag
159  set flag
160} RAW
161
162test play-1.1.8 {play command, -channel, data length 0} {
163  proc endproc {snd sock} {
164    set info [$snd info]
165    close $sock
166    $snd destroy
167    set ::flag [lindex $info 6]
168  }
169  proc servproc { sock addr port } {
170    set s [snack::sound snd -channel $sock -byteorder bigEndian]
171    $s play -command [list endproc $s $sock]
172  }
173
174  set s [snack::sound snd]
175  set data [$s data -fileformat raw -byteorder bigendian]
176  $s destroy
177
178  set servsock [socket -server servproc 24684]
179
180  set sock [socket localhost 24684]
181  fconfigure $sock -translation binary -blocking 1
182  if {$::tcl_version > 8.0} {
183    fconfigure $sock -encoding binary
184  }
185  puts -nonewline $sock $data
186  close $sock
187
188  vwait flag
189  set flag
190} RAW
191
192test play-1.1.9 {play command, -channel, data with 1024 initial zeros} {
193  proc endproc {snd sock} {
194    set info [$snd info]
195    close $sock
196    $snd destroy
197    set ::flag [lindex $info 6]
198  }
199  proc servproc { sock addr port } {
200    set s [snack::sound snd -channel $sock -byteorder bigEndian]
201    $s play -command [list endproc $s $sock]
202  }
203
204  set s [snack::sound snd -load ex1.wav]
205  set s2 [snack::sound snd2]
206  $s2 length 512
207  set data [$s2 data -fileformat raw -byteorder bigendian]
208  append data [$s data -fileformat raw -byteorder bigendian]
209  $s destroy
210  $s2 destroy
211
212  set servsock [socket -server servproc 24685]
213
214  set sock [socket localhost 24685]
215  fconfigure $sock -translation binary -blocking 1
216  if {$::tcl_version > 8.0} {
217    fconfigure $sock -encoding binary
218  }
219  puts -nonewline $sock $data
220  close $sock
221
222  vwait flag
223  set flag
224} RAW
225
226test play-1.2.1 {play command, blocking} {
227  set s [snack::sound snd -load ex1.wav]
228  $s play -blocking 1 -command {set flag 1}
229  $s destroy
230  set flag
231} 1
232
233test play-1.3.1 {play command, auto-destruct} {
234  set s [snack::sound snd -load ex1.wav]
235  $s play -command "set flag 1; $s destroy" -start 0 -end -1
236  vwait flag
237  catch "$s info" msg
238  set msg
239} {invalid command name "snd"}
240
241test play-1.4.1 {play command, non-existing linked file} {
242  set s [snack::sound snd -file nosuch.wav]
243  catch {$s play} msg
244  $s destroy
245  set msg
246} {couldn't open "nosuch.wav": no such file or directory}
247
248test play-2.1 {play command, using default sound device} {
249  set s [snack::sound snd -load ex1.wav]
250  $s play -device "" -command {set flag 1}
251  vwait flag
252  $s destroy
253  set flag
254} 1
255
256test play-2.2 {play command, using first sound device} {
257  set s [snack::sound snd -load ex1.wav]
258  set dev [lindex [snack::audio outputDevices] 0]
259  $s play -device $dev -command {set flag 1}
260  vwait flag
261  $s destroy
262  set flag
263} 1
264
265test play-2.3 {play command, using unknown sound device} {
266  set s [snack::sound snd -load ex1.wav]
267  catch {$s play -device junk} msg
268  $s destroy
269  set msg
270} {No such device: junk}
271
272test play-2.4 {play command, missing argument to -device option} {
273  set s [snack::sound snd -load ex1.wav]
274  catch {$s play -device} msg
275  $s destroy
276  set msg
277} {No argument given for -device option}
278
279test play-3.1 {play command, with filter option specifying invalid filter} {
280  set s [snack::sound snd -load ex1.wav]
281  catch {$s play -filter junk} msg
282  $s destroy
283  set msg
284} {No such filter: junk}
285
286test play-3.2 {play command, with missing argument for -filter option} {
287  set s [snack::sound snd -load ex1.wav]
288  catch {$s play -filter} msg
289  $s destroy
290  set msg
291} {No argument given for -filter option}
292
293# cleanup
294::tcltest::cleanupTests
295return
296