1#!/bin/sh
2# the next line restarts using wish \
3exec wish8.4 "$0" "$@"
4
5package require -exact snack 2.2
6# Try to load optional file format handler
7catch { package require snackogg }
8
9snack::debug 0
10
11set port 23654
12
13proc Cmd { sock addr port } {
14    global servsock msg
15
16    set cmd [read $sock 4]
17    switch $cmd {
18	play {
19	    set s [snack::sound -debug 0]
20	    puts $sock $s ;# return token for this job
21	    flush $sock
22	    $s configure -channel $sock -guessproperties yes
23	    $s play -command "close $sock; set msg idle;$s destroy"
24	    set msg playing
25	}
26	stop {
27	    set handle [gets $sock] ;# get token (sound name) and stop playback
28	    catch { $handle stop }
29	    catch { $handle destroy }
30	    close $sock
31	    set msg idle
32	}
33	exit {
34	    close $sock
35	    close $servsock
36	    exit
37	}
38	default {
39	    puts "Unknown command"
40	}
41    }
42}
43
44set servsock [socket -server Cmd $port]
45
46# Make sure the server socket always is closed properly on exit
47
48wm protocol . WM_DELETE_WINDOW {close $servsock; exit}
49
50proc NewPort {} {
51    global servsock port
52    close $servsock
53    set servsock [socket -server Cmd $port]
54}
55
56proc Pause {} {
57  if {[snack::audio active] == 0} return
58  snack::audio pause
59  if {[.b.bp cget -relief] == "raised"} {
60    .b.bp configure -relief sunken
61    set ::msg paused
62  } else {
63    .b.bp configure -relief raised
64    set ::msg playing
65  }
66}
67
68proc Stop {} {
69  snack::audio stop
70  .b.bp configure -relief raised
71  set ::msg idle
72}
73
74set msg idle
75pack [frame .t]
76pack [label .t.l1 -text Status:] -side left
77pack [label .t.l2 -textvar msg -width 7] -side left
78
79pack [frame .m]
80pack [label .m.l -text Port] -side left
81pack [entry .m.e -textvar port -width 6] -side left
82pack [button .m.b -text Set -command NewPort] -side left
83
84set gain [snack::audio play_gain]
85pack [frame .b]
86pack [button .b.bs -bitmap snackStop -command Stop] \
87	-side left
88pack [button .b.bp -bitmap snackPause -command Pause] -side left
89pack [scale .b.s -show no -orient horiz -command {snack::audio play_gain} \
90	-var gain] -side left
91
92vwait forever
93