main.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. if j != len(b)-1 {
  27. fmt.Fprintf(w, " ")
  28. }
  29. }
  30. }
  31. if i > 0 {
  32. fmt.Fprintf(w, "\n")
  33. }
  34. }
  35. func writeFileRep(pcm io.Writer, name, prefix string) {
  36. b, err := ioutil.ReadFile(name)
  37. if err != nil {
  38. log.Fatalf("%s", err)
  39. }
  40. writeVar(pcm, b[headerLen:], prefix)
  41. }
  42. func writeSingle(pcm io.Writer, name string) {
  43. fmt.Fprintf(pcm, "\nvar %sSound = []byte{\n\t", name)
  44. writeFileRep(pcm, name+".wav", "\t")
  45. fmt.Fprintf(pcm, "}\n")
  46. }
  47. func writeDigitSounds(pcm io.Writer) {
  48. fmt.Fprintf(pcm, "var digitSounds = [][]byte{\n")
  49. for i := 0; i <= 9; i++ {
  50. fmt.Fprintf(pcm, "\t{ // %d\n\t\t", i)
  51. writeFileRep(pcm, fmt.Sprintf("%d.wav", i), "\t\t")
  52. fmt.Fprintf(pcm, "\t},\n")
  53. }
  54. fmt.Fprintf(pcm, "}\n")
  55. }
  56. func main() {
  57. pcm, err := os.Create(path.Join("..", "sounds.go"))
  58. if err != nil {
  59. log.Fatalf("%s", err)
  60. }
  61. defer pcm.Close()
  62. fmt.Fprintf(pcm, `package captcha
  63. // This file has been generated from .wav files using generate.go.
  64. var waveHeader = []byte{
  65. 0x52, 0x49, 0x46, 0x46, 0xdf, 0x0a, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45,
  66. 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
  67. 0x40, 0x1f, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00,
  68. 0x64, 0x61, 0x74, 0x61,
  69. }
  70. // Byte slices contain raw 8 kHz unsigned 8-bit PCM data (without wav header).
  71. `)
  72. writeDigitSounds(pcm)
  73. writeSingle(pcm, "beep")
  74. }