| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // This is a simple demo of Go running under Native Client. | |
| // It is a tetris clone built on top of the exp/nacl/av and exp/draw | |
| // packages. | |
| // | |
| // See ../nacl/README for how to run it. | |
| package main | |
| import ( | |
| "exp/nacl/av" | |
| "exp/nacl/srpc" | |
| "log" | |
| "runtime" | |
| "os" | |
| ) | |
| var sndc chan []uint16 | |
| func main() { | |
| // Native Client requires that some calls are issued | |
| // consistently by the same OS thread. | |
| runtime.LockOSThread() | |
| if srpc.Enabled() { | |
| go srpc.ServeRuntime() | |
| } | |
| args := os.Args | |
| p := pieces4 | |
| if len(args) > 1 && args[1] == "-5" { | |
| p = pieces5 | |
| } | |
| dx, dy := 500, 500 | |
| w, err := av.Init(av.SubsystemVideo|av.SubsystemAudio, dx, dy) | |
| if err != nil { | |
| log.Exit(err) | |
| } | |
| sndc = make(chan []uint16, 10) | |
| go audioServer() | |
| Play(p, w) | |
| } | |
| func audioServer() { | |
| // Native Client requires that all audio calls | |
| // original from a single OS thread. | |
| runtime.LockOSThread() | |
| n, err := av.AudioStream(nil) | |
| if err != nil { | |
| log.Exit(err) | |
| } | |
| for { | |
| b := <-sndc | |
| for len(b)*2 >= n { | |
| var a []uint16 | |
| a, b = b[0:n/2], b[n/2:] | |
| n, err = av.AudioStream(a) | |
| if err != nil { | |
| log.Exit(err) | |
| } | |
| println(n, len(b)*2) | |
| } | |
| a := make([]uint16, n/2) | |
| copy(a, b) | |
| n, err = av.AudioStream(a) | |
| } | |
| } | |
| func PlaySound(b []uint16) { sndc <- b } | |
| var whoosh = []uint16{ | |
| // Insert your favorite sound samples here. | |
| } |