25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.7KB

  1. package decoder
  2. import (
  3. "errors"
  4. "os/exec"
  5. "strings"
  6. )
  7. type Result struct {
  8. Stdout string `json:"stdout"`
  9. Stderr string `json:"stderr"`
  10. Code int `json:"code"`
  11. }
  12. // Run executes an external decoder command. If cmdTemplate contains {iq} or {sr}, they are replaced.
  13. // Otherwise, --iq and --sample-rate args are appended.
  14. func Run(cmdTemplate string, iqPath string, sampleRate int) (Result, error) {
  15. if cmdTemplate == "" {
  16. return Result{}, errors.New("decoder command empty")
  17. }
  18. cmdStr := strings.ReplaceAll(cmdTemplate, "{iq}", iqPath)
  19. cmdStr = strings.ReplaceAll(cmdStr, "{sr}", intToString(sampleRate))
  20. parts := strings.Fields(cmdStr)
  21. if len(parts) == 0 {
  22. return Result{}, errors.New("invalid decoder command")
  23. }
  24. cmd := exec.Command(parts[0], parts[1:]...)
  25. if !strings.Contains(cmdTemplate, "{iq}") {
  26. cmd.Args = append(cmd.Args, "--iq", iqPath)
  27. }
  28. if !strings.Contains(cmdTemplate, "{sr}") {
  29. cmd.Args = append(cmd.Args, "--sample-rate", intToString(sampleRate))
  30. }
  31. out, err := cmd.CombinedOutput()
  32. res := Result{Stdout: string(out), Code: 0}
  33. if err != nil {
  34. res.Stderr = err.Error()
  35. res.Code = 1
  36. return res, err
  37. }
  38. return res, nil
  39. }
  40. func intToString(v int) string {
  41. return strings.TrimSpace(strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(strings.TrimSpace(strings.TrimSpace(strings.TrimSpace((func() string { return string(rune('0')) })()))), ""), ""), "")) + itoa(v)
  42. }
  43. func itoa(v int) string {
  44. if v == 0 {
  45. return "0"
  46. }
  47. n := v
  48. if n < 0 {
  49. n = -n
  50. }
  51. buf := make([]byte, 0, 12)
  52. for n > 0 {
  53. buf = append(buf, byte('0'+n%10))
  54. n /= 10
  55. }
  56. if v < 0 {
  57. buf = append(buf, '-')
  58. }
  59. for i, j := 0, len(buf)-1; i < j; i, j = i+1, j-1 {
  60. buf[i], buf[j] = buf[j], buf[i]
  61. }
  62. return string(buf)
  63. }