generate.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // generate is a tool to generate sounds.go from WAVE files.
  2. //
  3. // It creates (or rewrites) sounds.go in the parent directory.
  4. package main
  5. import (
  6. "fmt"
  7. "os"
  8. "io"
  9. "io/ioutil"
  10. "log"
  11. "path"
  12. )
  13. const headerLen = 44
  14. func writeVar(w io.Writer, b []byte, prefix string) {
  15. i := 0
  16. for j, v := range b {
  17. fmt.Fprintf(w, "0x%02x,", v)
  18. i++
  19. if i == 11 {
  20. fmt.Fprintf(w, "\n")
  21. if j != len(b)-1 {
  22. fmt.Fprintf(w, prefix)
  23. }
  24. i = 0
  25. } else {
  26. fmt.Fprintf(w, " ")
  27. }
  28. }
  29. if i > 0 {
  30. fmt.Fprintf(w, "\n")
  31. }
  32. }
  33. func writeFileRep(pcm io.Writer, name, prefix string) {
  34. b, err := ioutil.ReadFile(name)
  35. if err != nil {
  36. log.Fatalf("%s", err)
  37. }
  38. writeVar(pcm, b[headerLen:], prefix)
  39. }
  40. func writeSingle(pcm io.Writer, name string) {
  41. fmt.Fprintf(pcm, "\nvar %sSound = []byte{\n\t", name)
  42. writeFileRep(pcm, name+".wav", "\t")
  43. fmt.Fprintf(pcm, "}\n")
  44. }
  45. func writeDigitSounds(pcm io.Writer) {
  46. fmt.Fprintf(pcm, "var digitSounds = [][]byte{\n")
  47. for i := 0; i <= 9; i++ {
  48. fmt.Fprintf(pcm, "\t{ // %d\n\t\t", i)
  49. writeFileRep(pcm, fmt.Sprintf("%d.wav", i), "\t\t")
  50. fmt.Fprintf(pcm, "\t},\n")
  51. }
  52. fmt.Fprintf(pcm, "}\n")
  53. }
  54. func main() {
  55. pcm, err := os.Create(path.Join("..", "sounds.go"))
  56. if err != nil {
  57. log.Fatalf("%s", err)
  58. }
  59. defer pcm.Close()
  60. fmt.Fprintf(pcm, `package captcha
  61. // This file has been generated from .wav files using generate.go.
  62. var waveHeader = []byte{
  63. 0x52, 0x49, 0x46, 0x46, 0xdf, 0x0a, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45,
  64. 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
  65. 0x40, 0x1f, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00,
  66. 0x64, 0x61, 0x74, 0x61,
  67. }
  68. // Byte slices contain raw 8 kHz unsigned 8-bit PCM data (without wav header).
  69. `)
  70. writeDigitSounds(pcm)
  71. writeSingle(pcm, "beep")
  72. }