main.go 2.0 KB

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