Code Monkey home page Code Monkey logo

moggio's Issues

queue doesn't update

heya matt!
trying out mog today. looks pretty neat.
one thing i noticed, i added a bunch of files and queued them up. it successfully jumps to the next song when playing, but when i go to http://localhost:6601/queue the list is empty?

Dependency broken in go1.6: github.com/gordonklaus/portaudio

Go 1.6 added restrictions for safer C pointer handling so it looks like the port audio dependency fails in 1.6:

panic: runtime error: cgo argument has Go pointer to Go pointer

goroutine 1 [running]:
panic(0x4292700, 0xc82012c0a0)
    /usr/local/Cellar/go/1.6/libexec/src/runtime/panic.go:464 +0x3e6
github.com/mjibson/mog/vendor/github.com/gordonklaus/portaudio._cgoCheckPointer1(0x4236b20, 0xc820138080, 0x0, 0x0, 0x0, 0x421b880)
    ??:0 +0x4d
github.com/mjibson/mog/vendor/github.com/gordonklaus/portaudio.OpenStream(0x0, 0x0, 0x0, 0xc820132120, 0x2, 0x120e9e0, 0x40e5888000000000, 0x400, 0x0, 0xc820185bd0, ...)
    /Users/shazow/local/go/src/github.com/mjibson/mog/vendor/github.com/gordonklaus/portaudio/portaudio.go:504 +0x3d1
github.com/mjibson/mog/vendor/github.com/gordonklaus/portaudio.OpenDefaultStream(0x0, 0x2, 0x40e5888000000000, 0x400, 0xc820185bd0, 0x1, 0x1, 0xc820140298, 0x0, 0x0)
    /Users/shazow/local/go/src/github.com/mjibson/mog/vendor/github.com/gordonklaus/portaudio/portaudio.go:538 +0x24a
github.com/mjibson/mog/output.get(0xac44, 0x2, 0x0, 0x0, 0x0, 0x0)
    /Users/shazow/local/go/src/github.com/mjibson/mog/output/port.go:22 +0x1ba
github.com/mjibson/mog/output.Get(0xac44, 0x2, 0x0, 0x0, 0x0, 0x0)
    /Users/shazow/local/go/src/github.com/mjibson/mog/output/output.go:22 +0x115
main.PlayPath(0x7fff5fbff9ee, 0x73, 0x4980000, 0xc82012c010, 0x0, 0x0)

dropbox v2 api

Support it. Maybe it'll support better search instead of the current crawl everything solution.

Reduce memory footprint

Loading 2900 songs from local disk (not a lot), and running ~10 minutes, memory usage was 425MB resident and 1.5GB virtual. Realistically, this should be able to run in <100MB resident, <200MB virtual.

Linux, downloaded 64bit version.

HTTP protocol

Merge in with bandcamp protocol. In general it can look for .mp3, .wav, and .nsf[e] links (so, all file extensions supported by the codecs) and add those as songs. It should first, though, try to smart detect if it's a bandcamp or other special page.

iTunes library as a source

Nice work @mjibson. Moggio is very cool. I love the way multiple sources are brought together.

Thought I would open this up to see if anyone would be interested in an iTunes backend? If the server is running on the same machine as my iTunes library it should be possible to play the audio, maybe with afplay (not sure, I haven't got my iTunes library on this machine).

Not sure how this fits in though. I haven't looked into how the sources/backends are built yet.

panic

Happened at start of song.

2015/06/10 20:09:09 play
2015/06/10 20:09:09 GMUSIC f5ca2839-473e-3f31-9856-41d95b607caa
2015/06/10 20:09:09 playing {3m30s Queen '39 A Night At The Opera 5 http://lh5.ggpht.com/cBzAj2Q0WTVhaKL3TDlbguwupPbDFp5HwwQCyD_1go0NWTeMFg93MxM-NP9tIcBzr_JIEACP2Q} 44100 2 11.337µs 46.436352ms
2015/06/10 20:09:10 server.cmdDoSave
2015/06/10 20:09:11 save to db complete
2015/06/10 20:09:11 server.controlCmd
net.(*netFD).Read(0xc2089dd810, 0xc20820d000, 0x1000, 0x1000, 0x0, 0x7f91e9c52cf0, 0xc214bbc558)
        /usr/local/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc208b9e0b8, 0xc20820d000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/net.go:121 +0xdc
crypto/tls.(*block).readFromUntil(0xc208209da0, 0x7f91e9c79e40, 0xc208b9e0b8, 0x5, 0x0, 0x0)
        /usr/local/go/src/crypto/tls/conn.go:454 +0xe6
crypto/tls.(*Conn).readRecord(0xc2080a02c0, 0x17, 0x0, 0x0)
        /usr/local/go/src/crypto/tls/conn.go:539 +0x2da
crypto/tls.(*Conn).Read(0xc2080a02c0, 0xc208226000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/local/go/src/crypto/tls/conn.go:904 +0x166
net/http.noteEOFReader.Read(0x7f91e418b978, 0xc2080a02c0, 0xc2099883c8, 0xc208226000, 0x1000, 0x1000, 0x7fea80, 0x0, 0x0)
        /usr/local/go/src/net/http/transport.go:1270 +0x6e
net/http.(*noteEOFReader).Read(0xc208cfce60, 0xc208226000, 0x1000, 0x1000, 0xc208014d00, 0x0, 0x0)
        <autogenerated>:125 +0xd4
bufio.(*Reader).fill(0xc208d37080)
        /usr/local/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).Peek(0xc208d37080, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/bufio/bufio.go:132 +0xf0
net/http.(*persistConn).readLoop(0xc209988370)
        /usr/local/go/src/net/http/transport.go:842 +0xa4
created by net/http.(*Transport).dialConn
        /usr/local/go/src/net/http/transport.go:660 +0xc9f

goroutine 410 [select]:
net/http.(*persistConn).writeLoop(0xc209988370)
        /usr/local/go/src/net/http/transport.go:945 +0x41d
created by net/http.(*Transport).dialConn
        /usr/local/go/src/net/http/transport.go:661 +0xcbc

delay panic

Was trying to play a NSF song. No sound came out, then this.

2015/07/01 14:54:30 open file /home/mjibson/music/nsfe/Ninja Gaiden 1.nsfe
panic: delay timer expired

goroutine 306 [running]:
github.com/mjibson/mog/server.func·027()
        /go/src/github.com/mjibson/mog/server/audio.go:366 +0x64
created by time.goFunc
        /usr/local/go/src/time/sleep.go:129 +0x4b

goroutine 1 [IO wait]:
net.(*pollDesc).Wait(0xc2080116b0, 0x72, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc2080116b0, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).accept(0xc208011650, 0x0, 0x7f9aacb86cf0, 0xc20a0e01a8)
        /usr/local/go/src/net/fd_unix.go:419 +0x40b
net.(*TCPListener).AcceptTCP(0xc2080343f0, 0x47a44e, 0x0, 0x0)
        /usr/local/go/src/net/tcpsock_posix.go:234 +0x4e
net/http.tcpKeepAliveListener.Accept(0xc2080343f0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:1976 +0x4c
net/http.(*Server).Serve(0xc20803c780, 0x7f9aacb8b938, 0xc2080343f0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:1728 +0x92
net/http.(*Server).ListenAndServe(0xc20803c780, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:1718 +0x154
net/http.ListenAndServe(0x904ab0, 0x5, 0x7f9aacb8a870, 0xc2080b0c30, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:1808 +0xba
github.com/mjibson/mog/server.(*Server).ListenAndServe(0xc208064500, 0x904ab0, 0x5, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/web.go:58 +0x1ea
github.com/mjibson/mog/server.ListenAndServe(0xc2080849e0, 0x18, 0x904ab0, 0x5, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/server.go:58 +0x2e6
main.main()
        /go/src/github.com/mjibson/mog/main.go:100 +0x97f

goroutine 8 [runnable]:
github.com/mjibson/mog/_third_party/github.com/mjibson/nsf/cpu6502.(*Cpu).Step(0xc2088287e0)
        /go/src/github.com/mjibson/mog/_third_party/github.com/mjibson/nsf/cpu6502/6502.go:194
github.com/mjibson/mog/_third_party/github.com/mjibson/nsf/cpu6502.(*Cpu).Run(0xc2088287e0)
        /go/src/github.com/mjibson/mog/_third_party/github.com/mjibson/nsf/cpu6502/6502.go:174 +0x33
github.com/mjibson/mog/_third_party/github.com/mjibson/nsf.(*NSF).Init(0xc20d261440, 0x5)
        /go/src/github.com/mjibson/mog/_third_party/github.com/mjibson/nsf/emu.go:126 +0x33b
github.com/mjibson/mog/codec/nsf.(*NSFSong).Init(0xc20987a720, 0x0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/codec/nsf/nsf.go:55 +0x1bb
github.com/mjibson/mog/server.func·014()
        /go/src/github.com/mjibson/mog/server/audio.go:185 +0x5e1
github.com/mjibson/mog/server.func·015()
        /go/src/github.com/mjibson/mog/server/audio.go:247 +0x11c
github.com/mjibson/mog/server.func·014()
        /go/src/github.com/mjibson/mog/server/audio.go:238 +0x13d5
github.com/mjibson/mog/server.(*Server).audio(0xc208064500)
        /go/src/github.com/mjibson/mog/server/audio.go:375 +0xdca
created by github.com/mjibson/mog/server.New
        /go/src/github.com/mjibson/mog/server/server.go:173 +0x536

goroutine 18 [chan send]:
github.com/mjibson/mog/server.func·028()
        /go/src/github.com/mjibson/mog/server/audio.go:368 +0xf4
created by github.com/mjibson/mog/server.(*Server).audio
        /go/src/github.com/mjibson/mog/server/audio.go:371 +0xd41

goroutine 81 [chan receive, 301 minutes]:
github.com/mjibson/mog/server.(*Server).WebSocket(0xc208064500, 0xc20880c000)
        /go/src/github.com/mjibson/mog/server/websocket.go:102 +0xe5
github.com/mjibson/mog/server.*Server.WebSocket·fm(0xc20880c000)
        /go/src/github.com/mjibson/mog/server/web.go:49 +0x31
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Server.serveWebSocket(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa025b8, ...)
        /go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:90 +0x292
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Handler.ServeHTTP(0xc2080e7c90, 0x7f9aacb8baf0, 0xc20803eaa0, 0xc2082405b0)
        /go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:113 +0x8a
net/http.(*ServeMux).ServeHTTP(0xc2080b0c30, 0x7f9aacb8baf0, 0xc20803eaa0, 0xc2082405b0)
        /usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc20803c780, 0x7f9aacb8baf0, 0xc20803eaa0, 0xc2082405b0)
        /usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc2080803c0)
        /usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
        /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 113 [syscall, 301 minutes, locked to thread]:
runtime.goexit()
        /usr/local/go/src/runtime/asm_amd64.s:2232 +0x1

goroutine 218 [select, 20 minutes]:
net/http.(*persistConn).writeLoop(0xc208162000)
        /usr/local/go/src/net/http/transport.go:945 +0x41d
created by net/http.(*Transport).dialConn
        /usr/local/go/src/net/http/transport.go:661 +0xcbc

goroutine 217 [select, 20 minutes]:
net/http.(*persistConn).readLoop(0xc208162000)
        /usr/local/go/src/net/http/transport.go:928 +0x9ce
created by net/http.(*Transport).dialConn
        /usr/local/go/src/net/http/transport.go:660 +0xc9f

goroutine 208 [chan send]:
github.com/mjibson/mog/server.(*Server).Cmd(0xc208064500, 0xc209c78e10, 0xc2094a4020, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/web.go:127 +0x44d
github.com/mjibson/mog/server.*Server.Cmd·fm(0xc209c78e10, 0xc2094a4020, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/web.go:36 +0x79
github.com/mjibson/mog/server.func·035(0x7f9aacb8baf0, 0xc208080000, 0xc208240000, 0xc2094a4020, 0x1, 0x1)
        /go/src/github.com/mjibson/mog/server/web.go:83 +0x197
github.com/mjibson/mog/_third_party/github.com/julienschmidt/httprouter.(*Router).ServeHTTP(0xc2080b6580, 0x7f9aacb8baf0, 0xc208080000, 0xc208240000)
        /go/src/github.com/mjibson/mog/_third_party/github.com/julienschmidt/httprouter/router.go:299 +0x18e
net/http.(*ServeMux).ServeHTTP(0xc2080b0c30, 0x7f9aacb8baf0, 0xc208080000, 0xc208240000)
        /usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc20803c780, 0x7f9aacb8baf0, 0xc208080000, 0xc208240000)
        /usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc20803ebe0)
        /usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
        /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 209 [chan send]:
github.com/mjibson/mog/server.(*Server).ProtocolRemove(0xc208064500, 0xc20f3ab380, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/web.go:207 +0x34f
github.com/mjibson/mog/server.*Server.ProtocolRemove·fm(0xc20f3ab380, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/web.go:43 +0x79
github.com/mjibson/mog/server.func·035(0x7f9aacb8baf0, 0xc208100140, 0xc2080329c0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/web.go:83 +0x197
github.com/mjibson/mog/_third_party/github.com/julienschmidt/httprouter.(*Router).ServeHTTP(0xc2080b6580, 0x7f9aacb8baf0, 0xc208100140, 0xc2080329c0)
        /go/src/github.com/mjibson/mog/_third_party/github.com/julienschmidt/httprouter/router.go:299 +0x18e
net/http.(*ServeMux).ServeHTTP(0xc2080b0c30, 0x7f9aacb8baf0, 0xc208100140, 0xc2080329c0)
        /usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc20803c780, 0x7f9aacb8baf0, 0xc208100140, 0xc2080329c0)
        /usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc20803edc0)
        /usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
        /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 290 [IO wait]:
net.(*pollDesc).Wait(0xc208e6a140, 0x72, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc208e6a140, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).Read(0xc208e6a0e0, 0xc208780000, 0x1000, 0x1000, 0x0, 0x7f9aacb86cf0, 0xc20a0e0170)
        /usr/local/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc20813e000, 0xc208780000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/net.go:121 +0xdc
net/http.(*liveSwitchReader).Read(0xc2080800e8, 0xc208780000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:214 +0xab
io.(*LimitedReader).Read(0xc2094a4040, 0xc208780000, 0x1000, 0x1000, 0x1, 0x0, 0x0)
        /usr/local/go/src/io/io.go:408 +0xce
bufio.(*Reader).fill(0xc20811e000)
        /usr/local/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).ReadSlice(0xc20811e000, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/bufio/bufio.go:295 +0x257
bufio.(*Reader).ReadLine(0xc20811e000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/bufio/bufio.go:324 +0x62
net/textproto.(*Reader).readLineSlice(0xc20f3ab1d0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/textproto/reader.go:55 +0x9e
net/textproto.(*Reader).ReadLine(0xc20f3ab1d0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/textproto/reader.go:36 +0x4f
net/http.ReadRequest(0xc20811e000, 0xc2081a7ba0, 0x0, 0x0)
        /usr/local/go/src/net/http/request.go:598 +0xcb
net/http.(*conn).readRequest(0xc2080800a0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:586 +0x26f
net/http.(*conn).serve(0xc2080800a0)
        /usr/local/go/src/net/http/server.go:1162 +0x69e
created by net/http.(*Server).Serve
        /usr/local/go/src/net/http/server.go:1751 +0x35e

Error while building mog

I'm getting the following error while building mog:

I executed go build

# github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol
_third_party/github.com/facebookgo/httpcontrol/httpcontrol.go:215:4: error: unknown field ‘KeepAlive’ in ‘net.Dialer’
    KeepAlive: t.DialKeepAlive,
    ^
# github.com/mjibson/mog/_third_party/google.golang.org/cloud/compute/metadata
_third_party/google.golang.org/cloud/compute/metadata/metadata.go:54:5: error: unknown field ‘KeepAlive’ in ‘net.Dialer’
     KeepAlive: 30 * time.Second,
     ^
# github.com/mjibson/mog/protocol/stream
protocol/stream/stream.go:137:5: error: unknown field ‘KeepAlive’ in ‘net.Dialer’
     KeepAlive: 30 * time.Second,
     ^
protocol/stream/stream.go:140:3: error: unknown field ‘TLSHandshakeTimeout’ in ‘http.Transport’
   TLSHandshakeTimeout: 10 * time.Second,
   ^
protocol/stream/stream.go:132:13: error: incompatible type for field 1 in struct construction (type has no methods)
  Transport: &http.Transport{
             ^
# github.com/mjibson/mog/server
server/websocket.go:102:6: error: expected operand
  for range c {
      ^
server/websocket.go:102:6: error: expected ‘{’
server/websocket.go:102:6: error: expected ‘;’ or ‘}’ or newline
server/websocket.go:104:1: error: expected declaration
 }
 ^

Sorry, but I couldn't get my hands on install documentation so I logged an issue here.
Annanay

stream titles change

In the queue, streaming titles change the queue's title, should only be current song's title.

TODO

I think this would be useful for people who would like to contribute:

Future implementations:

  • Spotify
  • AAC (iTunes, Apple music format)

YouTube

Moggio appears to be similar to Raddit:

http://reddit.com/r/radd_it

In that it can play from multiple streaming sources. However Moggio has the glaring omission of YouTube support. I see YouTube mentioned in #16, but you closed without comment?

Scrobbling?

Is scrobbling support planned? (e.g. last.fm or libre.fm)

id3 related crash

here's a stacktrace.

2015/02/20 12:45:16 http: panic serving [::1]:5182: EOF
goroutine 16 [running]:
net/http.func·011()
/usr/src/go/src/net/http/server.go:1130 +0xc2
github.com/mjibson/mog/_third_party/github.com/ascherkus/go-id3/src/id3.skipBytes(0xc0834e3800, 0x37573)
/go/src/github.com/mjibson/mog/_third_party/github.com/ascherkus/go-id3/src/id3/util.go:156 +0xf2
github.com/mjibson/mog/_third_party/github.com/ascherkus/go-id3/src/id3.parseID3v24File(0xc0834e3800, 0xc082067540)
/go/src/github.com/mjibson/mog/_third_party/github.com/ascherkus/go-id3/src/id3/id3v24.go:53 +0x2ad
github.com/mjibson/mog/_third_party/github.com/ascherkus/go-id3/src/id3.Read(0xef0a50, 0xc0820ea1a0, 0xc0820ea1a0)
/go/src/github.com/mjibson/mog/_third_party/github.com/ascherkus/go-id3/src/id3/id3.go:70 +0x1ff
github.com/mjibson/mog/codec/mpa.(_Song).Info(0xc0820d2a80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/go/src/github.com/mjibson/mog/codec/mpa/mpa.go:86 +0x26d
github.com/mjibson/mog/protocol/file.func·001(0xc0820cec30, 0x41, 0xee24c8, 0xc0834e2c60, 0x0, 0x0, 0x0, 0x0)
/go/src/github.com/mjibson/mog/protocol/file/file.go:101 +0x415
path/filepath.walk(0xc0820cec30, 0x41, 0xee24c8, 0xc0834e2c60, 0xc082173858, 0x0, 0x0)
/usr/src/go/src/path/filepath/path.go:347 +0x98
path/filepath.walk(0xc082096a80, 0x25, 0xee24c8, 0xc082381aa0, 0xc082173858, 0x0, 0x0)
/usr/src/go/src/path/filepath/path.go:372 +0x524
path/filepath.walk(0xc0820c0fa0, 0x11, 0xee24c8, 0xc0833f1860, 0xc082173858, 0x0, 0x0)
/usr/src/go/src/path/filepath/path.go:372 +0x524
path/filepath.walk(0xc08335de70, 0x8, 0xee24c8, 0xc0833f0840, 0xc082173858, 0x0, 0x0)
/usr/src/go/src/path/filepath/path.go:372 +0x524
path/filepath.Walk(0xc08335de70, 0x8, 0xc082173858, 0x0, 0x0)
/usr/src/go/src/path/filepath/path.go:394 +0xf9
github.com/mjibson/mog/protocol/file.(_File).Refresh(0xc082092460, 0xc082131858, 0x0, 0x0)
/go/src/github.com/mjibson/mog/protocol/file/file.go:115 +0x8e
github.com/mjibson/mog/protocol.Instance.Refresh·fm(0xc082045948, 0x0, 0x0)
/go/src/github.com/mjibson/mog/server/server.go:275 +0x52
github.com/mjibson/mog/server.(_Server).protocolRefresh(0xc0820801e0, 0xc08205f589, 0x4, 0xc082131858, 0x8, 0xc0820a3c00, 0x0, 0x0)
/go/src/github.com/mjibson/mog/server/server.go:279 +0x1d2
github.com/mjibson/mog/server.(_Server).ProtocolRefresh(0xc0820801e0, 0xc0820a3c80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/go/src/github.com/mjibson/mog/server/web.go:159 +0x123
github.com/mjibson/mog/server._Server.ProtocolRefresh·fm(0xc0820a3c80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/go/src/github.com/mjibson/mog/server/web.go:43 +0x80
github.com/mjibson/mog/server.func·030(0xee8ac0, 0xc082211040, 0xc0820c61a0, 0x0, 0x0, 0x0)
/go/src/github.com/mjibson/mog/server/web.go:74 +0xd4
github.com/mjibson/mog/_third_party/github.com/julienschmidt/httprouter.(_Router).ServeHTTP(0xc082092000, 0xee8ac0, 0xc082211040, 0xc0820c61a0)
/go/src/github.com/mjibson/mog/_third_party/github.com/julienschmidt/httprouter/router.go:293 +0x195
net/http.(_ServeMux).ServeHTTP(0xc08209a120, 0xee8ac0, 0xc082211040, 0xc0820c61a0)
/usr/src/go/src/net/http/server.go:1541 +0x184
net/http.serverHandler.ServeHTTP(0xc08209e780, 0xee8ac0, 0xc082211040, 0xc0820c61a0)
/usr/src/go/src/net/http/server.go:1703 +0x1a1
net/http.(_conn).serve(0xc082210fa0)
/usr/src/go/src/net/http/server.go:1204 +0xb5e
created by net/http.(*Server).Serve
/usr/src/go/src/net/http/server.go:1751 +0x365

mog crashes when not connected to internet

I tried to play a bandcamp when my internet disconnected and as a result mog crashed after consuming significant CPU.

I am pasting the panic log here. This panic is thrown as the delay time of 10 seconds expires.

But before that there were > 5500 (5698) tries to play the song, which made my cpu usage to jump to 70%.

I think mog should gracefully handle no internet connection and throw some error in the front-end

panic: delay timer expired

goroutine 22780 [running]:
github.com/mjibson/mog/server.func·025()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:358 +0x64
created by time.goFunc
    /usr/local/go/src/time/sleep.go:129 +0x4b

goroutine 1 [IO wait]:
net.(*pollDesc).Wait(0xc208010ca0, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc208010ca0, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).accept(0xc208010c40, 0x0, 0x4a28c88, 0xc20810d028)
    /usr/local/go/src/net/fd_unix.go:419 +0x40b
net.(*TCPListener).AcceptTCP(0xc208034828, 0x406725e, 0x0, 0x0)
    /usr/local/go/src/net/tcpsock_posix.go:234 +0x4e
net/http.tcpKeepAliveListener.Accept(0xc208034828, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:1976 +0x4c
net/http.(*Server).Serve(0xc208064540, 0x4a2b898, 0xc208034828, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:1728 +0x92
net/http.(*Server).ListenAndServe(0xc208064540, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:1718 +0x154
net/http.ListenAndServe(0x44e7110, 0x5, 0x4a2a7d0, 0xc2080f22d0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:1808 +0xba
github.com/mjibson/mog/server.(*Server).ListenAndServe(0xc208048700, 0x44e7110, 0x5, 0x0, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/server/web.go:58 +0x1ea
github.com/mjibson/mog/server.ListenAndServe(0xc20808ce40, 0x19, 0x44e7110, 0x5, 0x0, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/server/server.go:58 +0x2e6
main.main()
    /Users/goutham/go/src/github.com/mjibson/mog/main.go:98 +0x97f

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:2232 +0x1

goroutine 37 [IO wait]:
net.(*pollDesc).Wait(0xc20815e0d0, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc20815e0d0, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).Read(0xc20815e070, 0xc2080e4000, 0x1000, 0x1000, 0x0, 0x4a28c88, 0xc2080d8198)
    /usr/local/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc2080e6018, 0xc2080e4000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:121 +0xdc
net/http.(*liveSwitchReader).Read(0xc208066548, 0xc2080e4000, 0x1000, 0x1000, 0x1c0000c20814c460, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:214 +0xab
io.(*LimitedReader).Read(0xc208108020, 0xc2080e4000, 0x1000, 0x1000, 0x4a2a708, 0x0, 0x0)
    /usr/local/go/src/io/io.go:408 +0xce
bufio.(*Reader).fill(0xc2080640c0)
    /usr/local/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).ReadSlice(0xc2080640c0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:295 +0x257
bufio.(*Reader).ReadLine(0xc2080640c0, 0x0, 0x0, 0x0, 0xc207fe9d00, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:324 +0x62
net/textproto.(*Reader).readLineSlice(0xc208162090, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x9e
net/textproto.(*Reader).ReadLine(0xc208162090, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x4f
net/http.ReadRequest(0xc2080640c0, 0xc208032680, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:598 +0xcb
net/http.(*conn).readRequest(0xc208066500, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:586 +0x26f
net/http.(*conn).serve(0xc208066500)
    /usr/local/go/src/net/http/server.go:1162 +0x69e
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 7 [select]:
net/http.(*Transport).getConn(0xc2081362d0, 0xc208616b60, 0x0, 0xc208030870, 0x4, 0xc20833f300, 0x19, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:525 +0x608
net/http.(*Transport).RoundTrip(0xc2081362d0, 0xc208616b60, 0x436dd40, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:228 +0x4d4
github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol.(*Transport).tries(0xc208066a00, 0xc208616b60, 0x2, 0x1, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol/httpcontrol.go:288 +0x256
github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol.(*Transport).tries(0xc208066a00, 0xc208616b60, 0x1, 0x1, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol/httpcontrol.go:313 +0x5c2
github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol.(*Transport).tries(0xc208066a00, 0xc208616b60, 0x0, 0x4a1be58, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol/httpcontrol.go:313 +0x5c2
github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol.(*Transport).RoundTrip(0xc208066a00, 0xc208616b60, 0xc20807bcb0, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol/httpcontrol.go:336 +0xa8
net/http.send(0xc208616b60, 0x4a292e8, 0xc208066a00, 0x85, 0x0, 0x0)
    /usr/local/go/src/net/http/client.go:219 +0x4fc
net/http.(*Client).send(0xc20803bad0, 0xc208616b60, 0x85, 0x0, 0x0)
    /usr/local/go/src/net/http/client.go:142 +0x15b
net/http.(*Client).doFollowingRedirects(0xc20803bad0, 0xc208616b60, 0x45e25a8, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/client.go:367 +0xb25
net/http.(*Client).Get(0xc20803bad0, 0xc208030870, 0x85, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/client.go:299 +0xba
net/http.Get(0xc208030870, 0x85, 0x2, 0x0, 0x0)
    /usr/local/go/src/net/http/client.go:276 +0x50
github.com/mjibson/mog/protocol/bandcamp.func·001(0x0, 0x0, 0x2, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/protocol/bandcamp/bandcamp.go:64 +0x195
github.com/mjibson/mog/codec/mpa.(*Song).Init(0xc2083404d0, 0x0, 0x0, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/codec/mpa/mpa.go:50 +0xc9
github.com/mjibson/mog/codec/mpa.NewSong(0xc20833f0a0, 0xc20876d740, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/codec/mpa/mpa.go:44 +0x83
github.com/mjibson/mog/protocol/bandcamp.(*Bandcamp).GetSong(0xc20808dce0, 0xc20878a85d, 0xa, 0x0, 0x0, 0x0, 0x0)
    /Users/goutham/go/src/github.com/mjibson/mog/protocol/bandcamp/bandcamp.go:69 +0x2ba
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:166 +0x3cf
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
github.com/mjibson/mog/server.func·013()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:239 +0x11c
github.com/mjibson/mog/server.func·010()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:119 +0x106
github.com/mjibson/mog/server.func·012()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:170 +0x4ff
created by github.com/mjibson/mog/server.New
    /Users/goutham/go/src/github.com/mjibson/mog/server/server.go:173 +0x536

goroutine 18 [chan send]:
github.com/mjibson/mog/server.func·026()
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:360 +0xf4
created by github.com/mjibson/mog/server.(*Server).audio
    /Users/goutham/go/src/github.com/mjibson/mog/server/audio.go:363 +0xc72

goroutine 8 [chan receive]:
github.com/mjibson/mog/server.(*Server).WebSocket(0xc208048700, 0xc208136000)
    /Users/goutham/go/src/github.com/mjibson/mog/server/websocket.go:102 +0xe5
github.com/mjibson/mog/server.*Server.WebSocket·fm(0xc208136000)
    /Users/goutham/go/src/github.com/mjibson/mog/server/web.go:49 +0x31
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Server.serveWebSocket(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45e2338, ...)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:90 +0x292
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Handler.ServeHTTP(0xc2080d8c90, 0x4a2ba50, 0xc208066640, 0xc208033860)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:113 +0x8a
net/http.(*ServeMux).ServeHTTP(0xc2080f22d0, 0x4a2ba50, 0xc208066640, 0xc208033860)
    /usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc208064540, 0x4a2ba50, 0xc208066640, 0xc208033860)
    /usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc2081180a0)
    /usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 24 [IO wait]:
net.(*pollDesc).Wait(0xc2080d0060, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc2080d0060, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).Read(0xc2080d0000, 0xc208088000, 0x1000, 0x1000, 0x0, 0x4a28c88, 0xc20810cb00)
    /usr/local/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc208146000, 0xc208088000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:121 +0xdc
net/http.(*liveSwitchReader).Read(0xc2081580e8, 0xc208088000, 0x1000, 0x1000, 0xc20816c020, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:214 +0xab
io.(*LimitedReader).Read(0xc20801e000, 0xc208088000, 0x1000, 0x1000, 0x4a2a708, 0x0, 0x0)
    /usr/local/go/src/io/io.go:408 +0xce
bufio.(*Reader).fill(0xc2080e8120)
    /usr/local/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).ReadSlice(0xc2080e8120, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:295 +0x257
bufio.(*Reader).ReadLine(0xc2080e8120, 0x0, 0x0, 0x0, 0xc207ff5f00, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:324 +0x62
net/textproto.(*Reader).readLineSlice(0xc2080a0060, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x9e
net/textproto.(*Reader).ReadLine(0xc2080a0060, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x4f
net/http.ReadRequest(0xc2080e8120, 0xc20810a8f0, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:598 +0xcb
net/http.(*conn).readRequest(0xc2081580a0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:586 +0x26f
net/http.(*conn).serve(0xc2081580a0)
    /usr/local/go/src/net/http/server.go:1162 +0x69e
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 36 [IO wait]:
net.(*pollDesc).Wait(0xc20815e060, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc20815e060, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).Read(0xc20815e000, 0xc2080ea000, 0x1000, 0x1000, 0x0, 0x4a28c88, 0xc2080d80e0)
    /usr/local/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc2080e6010, 0xc2080ea000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:121 +0xdc
net/http.(*liveSwitchReader).Read(0xc208066b88, 0xc2080ea000, 0x1000, 0x1000, 0xc2081fe020, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:214 +0xab
io.(*LimitedReader).Read(0xc208108000, 0xc2080ea000, 0x1000, 0x1000, 0x4a2a708, 0x0, 0x0)
    /usr/local/go/src/io/io.go:408 +0xce
bufio.(*Reader).fill(0xc208064060)
    /usr/local/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).ReadSlice(0xc208064060, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:295 +0x257
bufio.(*Reader).ReadLine(0xc208064060, 0x0, 0x0, 0x0, 0xc207ff7900, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:324 +0x62
net/textproto.(*Reader).readLineSlice(0xc208086030, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x9e
net/textproto.(*Reader).ReadLine(0xc208086030, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x4f
net/http.ReadRequest(0xc208064060, 0xc208032410, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:598 +0xcb
net/http.(*conn).readRequest(0xc208066b40, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:586 +0x26f
net/http.(*conn).serve(0xc208066b40)
    /usr/local/go/src/net/http/server.go:1162 +0x69e
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 11 [chan receive]:
github.com/mjibson/mog/server.(*Server).WebSocket(0xc208048700, 0xc208030c60)
    /Users/goutham/go/src/github.com/mjibson/mog/server/websocket.go:102 +0xe5
github.com/mjibson/mog/server.*Server.WebSocket·fm(0xc208030c60)
    /Users/goutham/go/src/github.com/mjibson/mog/server/web.go:49 +0x31
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Server.serveWebSocket(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45e2338, ...)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:90 +0x292
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Handler.ServeHTTP(0xc2080d8c90, 0x4a2ba50, 0xc208118460, 0xc20810b520)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:113 +0x8a
net/http.(*ServeMux).ServeHTTP(0xc2080f22d0, 0x4a2ba50, 0xc208118460, 0xc20810b520)
    /usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc208064540, 0x4a2ba50, 0xc208118460, 0xc20810b520)
    /usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc208118280)
    /usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 22866 [runnable, locked to thread]:
net._Cfunc_free(0x4c170d0)
    /usr/local/go/src/net/:47 +0x45
net.cgoLookupIPCNAME(0xc20833f300, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a35b70, 0xc208763f00, 0x1)
    /usr/local/go/src/net/cgo_unix.go:116 +0x32c
net.cgoLookupIP(0xc20833f300, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40104e9)
    /usr/local/go/src/net/cgo_unix.go:148 +0x65
net.lookupIP(0xc20833f300, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/lookup_unix.go:64 +0x5f
net.func·025(0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/lookup.go:41 +0x55
net.(*singleflight).doCall(0x47f7350, 0xc2083664e0, 0xc20833f300, 0x16, 0xc2081af548)
    /usr/local/go/src/net/singleflight.go:91 +0x2f
net.(*singleflight).Do(0x47f7350, 0xc20833f300, 0x16, 0xc2081af548, 0x0, 0x0, 0x0, 0x0, 0x4011818)
    /usr/local/go/src/net/singleflight.go:61 +0x280
net.lookupIPMerge(0xc20833f300, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/lookup.go:42 +0xae
net.lookupIPDeadline(0xc20833f300, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/lookup.go:64 +0x12d
net.resolveInternetAddr(0x44f9af0, 0x3, 0xc20833f300, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
    /usr/local/go/src/net/ipsock.go:285 +0x49b
net.resolveAddr(0x44f2a70, 0x4, 0x44f9af0, 0x3, 0xc20833f300, 0x19, 0x0, 0x0, 0x0, 0x0, ...)
    /usr/local/go/src/net/dial.go:110 +0x378
net.(*Dialer).Dial(0xc208164f80, 0x44f9af0, 0x3, 0xc20833f300, 0x19, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/dial.go:158 +0xf6
net.*Dialer.Dial·fm(0x44f9af0, 0x3, 0xc20833f300, 0x19, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:38 +0x79
net/http.(*Transport).dial(0xc2081362d0, 0x44f9af0, 0x3, 0xc20833f300, 0x19, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:479 +0x84
net/http.(*Transport).dialConn(0xc2081362d0, 0x0, 0xc208030870, 0x4, 0xc20833f300, 0x19, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:564 +0x1678
net/http.func·019()
    /usr/local/go/src/net/http/transport.go:520 +0x42
created by net/http.(*Transport).getConn
    /usr/local/go/src/net/http/transport.go:522 +0x335

goroutine 35 [IO wait]:
net.(*pollDesc).Wait(0xc20812e140, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc20812e140, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).Read(0xc20812e0e0, 0xc2080b2000, 0x1000, 0x1000, 0x0, 0x4a28c88, 0xc20810d3c8)
    /usr/local/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc2080e61d0, 0xc2080b2000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:121 +0xdc
net/http.(*liveSwitchReader).Read(0xc208066228, 0xc2080b2000, 0x1000, 0x1000, 0x2, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:214 +0xab
io.(*LimitedReader).Read(0xc2080ec000, 0xc2080b2000, 0x1000, 0x1000, 0x2, 0x0, 0x0)
    /usr/local/go/src/io/io.go:408 +0xce
bufio.(*Reader).fill(0xc2080e9260)
    /usr/local/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).ReadSlice(0xc2080e9260, 0xc208083b0a, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:295 +0x257
bufio.(*Reader).ReadLine(0xc2080e9260, 0x0, 0x0, 0x0, 0xc20876a400, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:324 +0x62
net/textproto.(*Reader).readLineSlice(0xc2080dec60, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x9e
net/textproto.(*Reader).ReadLine(0xc2080dec60, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x4f
net/http.ReadRequest(0xc2080e9260, 0xc2080328f0, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:598 +0xcb
net/http.(*conn).readRequest(0xc2080661e0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:586 +0x26f
net/http.(*conn).serve(0xc2080661e0)
    /usr/local/go/src/net/http/server.go:1162 +0x69e
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 26 [chan receive]:
github.com/mjibson/mog/server.(*Server).WebSocket(0xc208048700, 0xc208136120)
    /Users/goutham/go/src/github.com/mjibson/mog/server/websocket.go:102 +0xe5
github.com/mjibson/mog/server.*Server.WebSocket·fm(0xc208136120)
    /Users/goutham/go/src/github.com/mjibson/mog/server/web.go:49 +0x31
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Server.serveWebSocket(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45e2338, ...)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:90 +0x292
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Handler.ServeHTTP(0xc2080d8c90, 0x4a2ba50, 0xc208158320, 0xc208032750)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:113 +0x8a
net/http.(*ServeMux).ServeHTTP(0xc2080f22d0, 0x4a2ba50, 0xc208158320, 0xc208032750)
    /usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc208064540, 0x4a2ba50, 0xc208158320, 0xc208032750)
    /usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc2081581e0)
    /usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 82 [select]:
github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol.(*Transport).monitor(0xc208066a00)
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol/httpcontrol.go:249 +0x2a6
created by github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol.(*Transport).start
    /Users/goutham/go/src/github.com/mjibson/mog/_third_party/github.com/facebookgo/httpcontrol/httpcontrol.go:230 +0x2c6

interesting error spotted

2015/09/21 11:07:57 next
2015/09/21 11:07:57 stop
2015/09/21 11:07:57 play
2015/09/21 11:07:57 unknown id: file
/home/dieter/music-sdcard
/home/dieter/music-sdcard/Oceans of Sadness/ Send in the Clowns/05 - Conflict �?? Error �?? Disillusion �?? Denial.mp3

goroutine 5 [running]:
github.com/mjibson/mog/server.printErr(0x7f3f7db3d028, 0xc825fc20e0)
    /home/dieter/go/src/github.com/mjibson/mog/server/server.go:38 +0x134
github.com/mjibson/mog/server.(*Server).commands.func3(0x7f3f7db3d028, 0xc825fc20e0)
    /home/dieter/go/src/github.com/mjibson/mog/server/control.go:39 +0x46
github.com/mjibson/mog/server.(*Server).commands.func11()
    /home/dieter/go/src/github.com/mjibson/mog/server/control.go:168 +0x489
github.com/mjibson/mog/server.(*Server).commands.func14()
    /home/dieter/go/src/github.com/mjibson/mog/server/control.go:235 +0x105
github.com/mjibson/mog/server.(*Server).commands.func8()
    /home/dieter/go/src/github.com/mjibson/mog/server/control.go:110 +0xfb
github.com/mjibson/mog/server.(*Server).commands(0xc8200d61e0)
    /home/dieter/go/src/github.com/mjibson/mog/server/control.go:408 +0x1329
created by github.com/mjibson/mog/server.New
    /home/dieter/go/src/github.com/mjibson/mog/server/server.go:188 +0x5d0

2015/09/21 11:07:57 server.controlCmd

real random

Random mode should use a randomized list instead of randomly choosing a song each time, which can play the same track soon after itself.

Documentation

Hi, I am new to GoLang but I wanted to build something very similar mog.
I have decided to contribute to mog and I think it would be helpful to have documentation for me to get started.

Also a roadmap/checklist of what all have been achieved till date would be great.

And +1 for writing the music server.

Thanks,
Goutham

Message too big

I just added my local music folder and after moggio was ready reading all files I got the following error message:

2016/03/09 20:51:06 server.cmdRemoveInProgress
2016/03/09 20:51:06 server.cmdProtocolAddInstance
2016/03/09 20:51:07 server.cmdDoSave
2016/03/09 20:51:09 gob: encoder: message too big
goroutine 5 [running]:
github.com/mjibson/moggio/server.printErr(0x7fabea8c0028, 0xc8748e8010)
    /go/src/github.com/mjibson/moggio/server/server.go:42 +0x134
github.com/mjibson/moggio/server.(*Server).commands.func3(0x7fabea8c0028, 0xc8748e8010)
    /go/src/github.com/mjibson/moggio/server/control.go:41 +0x46
github.com/mjibson/moggio/server.(*Server).commands.func25()
    /go/src/github.com/mjibson/moggio/server/control.go:417 +0x56
github.com/mjibson/moggio/server.(*Server).commands(0xc820096b40)
    /go/src/github.com/mjibson/moggio/server/control.go:714 +0x1a99
created by github.com/mjibson/moggio/server.New
    /go/src/github.com/mjibson/moggio/server/server.go:201 +0x4ad

I suspect that I have too many music files in the specified folder, but I just wanted to let you know.

seek panic

Seeked during a SPC song:

2015/07/01 18:25:55 server.cmdSeek
mog: /go/src/github.com/mjibson/mog/_third_party/github.com/mjibson/spc/SNES_SPC_misc.cpp:339: const char* SNES_SPC::play(int, SNES_SPC::sample_t*): Assertion `(count & 1) == 0' failed.
SIGABRT: abort
PC=0x7f26488bb107
signal arrived during cgo execution

goroutine 9 [syscall, locked to thread]:
runtime.cgocall_errno(0x405a30, 0xc20a7cb728, 0x0)
        /usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc20a7cb708 sp=0xc20a7cb6e0
github.com/mjibson/mog/_third_party/github.com/mjibson/spc._Cfunc_spc_play(0x7f26340b8370, 0x1363dbf, 0xc2107f4000, 0x0)
        github.com/mjibson/mog/_third_party/github.com/mjibson/spc/_obj/_cgo_gotypes.go:102 +0x44 fp=0xc20a7cb728 sp=0xc20a7cb708
github.com/mjibson/mog/_third_party/github.com/mjibson/spc.(*SPC).Play(0xc2080f81c0, 0xc20e12c000, 0x1363dbf, 0x1363dbf, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/_third_party/github.com/mjibson/spc/spc.go:54 +0xb2 fp=0xc20a7cb7b0 sp=0xc20a7cb728
github.com/mjibson/mog/codec/spc.(*SPC).Play(0xc208082200, 0x1363dbf, 0x0, 0x0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/codec/spc/spc.go:102 +0x101 fp=0xc20a7cb810 sp=0xc20a7cb7b0
github.com/mjibson/mog/codec.Song.Play·fm(0x1363dbf, 0x0, 0x0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/audio.go:200 +0x70 fp=0xc20a7cb860 sp=0xc20a7cb810
github.com/mjibson/mog/server.(*Seek).Read(0xc2084dfc80, 0x1363dbf, 0x0, 0x0, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/seek.go:33 +0xed fp=0xc20a7cb8d8 sp=0xc20a7cb860
github.com/mjibson/mog/server.(*Seek).Seek(0xc2084dfc80, 0x4b75170703, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/seek.go:61 +0xb0 fp=0xc20a7cb920 sp=0xc20a7cb8d8
github.com/mjibson/mog/server.func·025(0x4b75170703)
        /go/src/github.com/mjibson/mog/server/audio.go:354 +0x4c fp=0xc20a7cb960 sp=0xc20a7cb920
github.com/mjibson/mog/server.(*Server).audio(0xc208064500)
        /go/src/github.com/mjibson/mog/server/audio.go:425 +0x12dc fp=0xc20a7cbfd8 sp=0xc20a7cb960
runtime.goexit()
        /usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20a7cbfe0 sp=0xc20a7cbfd8
created by github.com/mjibson/mog/server.New
        /go/src/github.com/mjibson/mog/server/server.go:173 +0x536

goroutine 1 [IO wait]:
net.(*pollDesc).Wait(0xc208011870, 0x72, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc208011870, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).accept(0xc208011810, 0x0, 0x7f2649c93cf0, 0xc2088e5068)
        /usr/local/go/src/net/fd_unix.go:419 +0x40b
net.(*TCPListener).AcceptTCP(0xc208034fe0, 0x47a44e, 0x0, 0x0)
        /usr/local/go/src/net/tcpsock_posix.go:234 +0x4e
net/http.tcpKeepAliveListener.Accept(0xc208034fe0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:1976 +0x4c
net/http.(*Server).Serve(0xc20803db60, 0x7f2649ca3ef8, 0xc208034fe0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:1728 +0x92
net/http.(*Server).ListenAndServe(0xc20803db60, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:1718 +0x154
net/http.ListenAndServe(0x904ab0, 0x5, 0x7f2649ca2e30, 0xc2081d0d80, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:1808 +0xba
github.com/mjibson/mog/server.(*Server).ListenAndServe(0xc208064500, 0x904ab0, 0x5, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/web.go:58 +0x1ea
github.com/mjibson/mog/server.ListenAndServe(0xc2080849e0, 0x18, 0x904ab0, 0x5, 0x0, 0x0, 0x0)
        /go/src/github.com/mjibson/mog/server/server.go:58 +0x2e6
main.main()
        /go/src/github.com/mjibson/mog/main.go:100 +0x97f

goroutine 18 [chan receive]:
github.com/mjibson/mog/server.func·028()
        /go/src/github.com/mjibson/mog/server/audio.go:364 +0x6c
created by github.com/mjibson/mog/server.(*Server).audio
        /go/src/github.com/mjibson/mog/server/audio.go:371 +0xd41

goroutine 394 [IO wait]:
net.(*pollDesc).Wait(0xc208010220, 0x72, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc208010220, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).Read(0xc2080101c0, 0xc20847b000, 0x1000, 0x1000, 0x0, 0x7f2649c93cf0, 0xc20e054040)
        /usr/local/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc208286008, 0xc20847b000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/net.go:121 +0xdc
net/http.(*liveSwitchReader).Read(0xc20828a048, 0xc20847b000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:214 +0xab
io.(*LimitedReader).Read(0xc20e078000, 0xc20847b000, 0x1000, 0x1000, 0x1, 0x0, 0x0)
        /usr/local/go/src/io/io.go:408 +0xce
bufio.(*Reader).fill(0xc208bfc000)
        /usr/local/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).ReadSlice(0xc208bfc000, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/bufio/bufio.go:295 +0x257
bufio.(*Reader).ReadLine(0xc208bfc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/bufio/bufio.go:324 +0x62
net/textproto.(*Reader).readLineSlice(0xc20d5a2030, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/textproto/reader.go:55 +0x9e
net/textproto.(*Reader).ReadLine(0xc20d5a2030, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/textproto/reader.go:36 +0x4f
net/http.ReadRequest(0xc208bfc000, 0xc208216270, 0x0, 0x0)
        /usr/local/go/src/net/http/request.go:598 +0xcb
net/http.(*conn).readRequest(0xc20828a000, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:586 +0x26f
net/http.(*conn).serve(0xc20828a000)
        /usr/local/go/src/net/http/server.go:1162 +0x69e
created by net/http.(*Server).Serve
        /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 65 [chan receive, 208 minutes]:
github.com/mjibson/mog/server.(*Server).WebSocket(0xc208064500, 0xc20825ebd0)
        /go/src/github.com/mjibson/mog/server/websocket.go:102 +0xe5
github.com/mjibson/mog/server.*Server.WebSocket·fm(0xc20825ebd0)
        /go/src/github.com/mjibson/mog/server/web.go:49 +0x31
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Server.serveWebSocket(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa025b8, ...)
        /go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:90 +0x292
github.com/mjibson/mog/_third_party/golang.org/x/net/websocket.Handler.ServeHTTP(0xc2081f4c50, 0x7f2649ca40b0, 0xc20828a8c0, 0xc2080cf520)
        /go/src/github.com/mjibson/mog/_third_party/golang.org/x/net/websocket/server.go:113 +0x8a
net/http.(*ServeMux).ServeHTTP(0xc2081d0d80, 0x7f2649ca40b0, 0xc20828a8c0, 0xc2080cf520)
        /usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc20803db60, 0x7f2649ca40b0, 0xc20828a8c0, 0xc2080cf520)
        /usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc20828a820)
        /usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
        /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 402 [IO wait]:
net.(*pollDesc).Wait(0xc20e047330, 0x72, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc20e047330, 0x0, 0x0)
        /usr/local/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).Read(0xc20e0472d0, 0xc20d5a0000, 0x1000, 0x1000, 0x0, 0x7f2649c93cf0, 0xc20e0f00a8)
        /usr/local/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc208286010, 0xc20d5a0000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/net.go:121 +0xdc
net/http.(*liveSwitchReader).Read(0xc20e0b8cc8, 0xc20d5a0000, 0x1000, 0x1000, 0x2, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:214 +0xab
io.(*LimitedReader).Read(0xc20e072020, 0xc20d5a0000, 0x1000, 0x1000, 0x2, 0x0, 0x0)
        /usr/local/go/src/io/io.go:408 +0xce
bufio.(*Reader).fill(0xc20836c0c0)
        /usr/local/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).ReadSlice(0xc20836c0c0, 0xc2083f9b0a, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/bufio/bufio.go:295 +0x257
bufio.(*Reader).ReadLine(0xc20836c0c0, 0x0, 0x0, 0x0, 0x8b4500, 0x0, 0x0)
        /usr/local/go/src/bufio/bufio.go:324 +0x62
net/textproto.(*Reader).readLineSlice(0xc2088ee030, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/textproto/reader.go:55 +0x9e
net/textproto.(*Reader).ReadLine(0xc2088ee030, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/textproto/reader.go:36 +0x4f
net/http.ReadRequest(0xc20836c0c0, 0xc2082160d0, 0x0, 0x0)
        /usr/local/go/src/net/http/request.go:598 +0xcb
net/http.(*conn).readRequest(0xc20e0b8c80, 0x0, 0x0, 0x0)
        /usr/local/go/src/net/http/server.go:586 +0x26f
net/http.(*conn).serve(0xc20e0b8c80)
        /usr/local/go/src/net/http/server.go:1162 +0x69e
created by net/http.(*Server).Serve
        /usr/local/go/src/net/http/server.go:1751 +0x35e

goroutine 113 [syscall, 208 minutes, locked to thread]:
runtime.goexit()
        /usr/local/go/src/runtime/asm_amd64.s:2232 +0x1

rax     0x0
rbx     0x7f2649cda000
rcx     0xffffffffffffffff
rdx     0x6
rdi     0x20ee
rsi     0x20f2
rbp     0x7f26489eace8
rsp     0x7f26424dbbc8
r8      0xfefefefefefefeff
r9      0xfefefefefeff092d
r10     0x8
r11     0x206
r12     0x776f49
r13     0x7761c0
r14     0x13
r15     0x8
rip     0x7f26488bb107
rflags  0x206
cs      0x33
fs      0x0
gs      0x0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.