From 7aa774a6c7cd23c17177b2f13e7b15463be111a5 Mon Sep 17 00:00:00 2001 From: scruzin Date: Fri, 22 Nov 2019 13:22:23 +1030 Subject: [PATCH] Make audio platform specific. --- revid/audio_linux.go | 64 +++++++++++++++++++++++++++++++++++++++++ revid/audio_windows.go | 65 ++++++++++++++++++++++++++++++++++++++++++ revid/revid.go | 22 +------------- 3 files changed, 130 insertions(+), 21 deletions(-) create mode 100644 revid/audio_linux.go create mode 100644 revid/audio_windows.go diff --git a/revid/audio_linux.go b/revid/audio_linux.go new file mode 100644 index 00000000..9c35d038 --- /dev/null +++ b/revid/audio_linux.go @@ -0,0 +1,64 @@ +/* +NAME + audio_linux.go + +AUTHORS + Alan Noble + +LICENSE + revid is Copyright (C) 2019 the Australian Ocean Lab (AusOcean) + + It is free software: you can redistribute it and/or modify them + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + It is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + in gpl.txt. If not, see http://www.gnu.org/licenses. +*/ + +package revid + +import ( + "errors" + "fmt" + "strconv" + + "bitbucket.org/ausocean/av/codec/codecutil" + "bitbucket.org/ausocean/av/codec/pcm" + "bitbucket.org/ausocean/av/container/mts" + "bitbucket.org/ausocean/av/device" + "bitbucket.org/ausocean/av/device/alsa" + "bitbucket.org/ausocean/utils/logger" +) + +func (r *Revid) setupAudio() error { + mts.Meta.Add("sampleRate", strconv.Itoa(r.cfg.SampleRate)) + mts.Meta.Add("channels", strconv.Itoa(r.cfg.Channels)) + mts.Meta.Add("period", fmt.Sprintf("%.6f", r.cfg.RecPeriod)) + mts.Meta.Add("bitDepth", strconv.Itoa(r.cfg.BitDepth)) + + switch r.cfg.InputCodec { + case codecutil.PCM: + mts.Meta.Add("codec", "pcm") + case codecutil.ADPCM: + mts.Meta.Add("codec", "adpcm") + default: + r.cfg.Logger.Log(logger.Fatal, pkg+"no audio codec set in config") + } + + r.input = alsa.New(r.cfg.Logger) + + l, err := codecutil.NewByteLexer(pcm.DataSize(r.cfg.SampleRate, r.cfg.Channels, r.cfg.BitDepth, r.cfg.RecPeriod, r.cfg.InputCodec)) + if err != nil { + return err + } + r.lexTo = l.Lex + + return nil +} diff --git a/revid/audio_windows.go b/revid/audio_windows.go new file mode 100644 index 00000000..5cbc2ba6 --- /dev/null +++ b/revid/audio_windows.go @@ -0,0 +1,65 @@ +/* +NAME + audio_linux.go + +AUTHORS + Alan Noble + +LICENSE + revid is Copyright (C) 2019 the Australian Ocean Lab (AusOcean) + + It is free software: you can redistribute it and/or modify them + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + It is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + in gpl.txt. If not, see http://www.gnu.org/licenses. +*/ + +package revid + +import ( + "errors" + "fmt" + "strconv" + + "bitbucket.org/ausocean/av/codec/codecutil" + "bitbucket.org/ausocean/av/codec/pcm" + "bitbucket.org/ausocean/av/container/mts" + // "bitbucket.org/ausocean/av/device" + // "bitbucket.org/ausocean/av/device/alsa" + "bitbucket.org/ausocean/utils/logger" +) + +func (r *Revid) setupAudio() error { + return errors.New("audio not implemented on Windows") + mts.Meta.Add("sampleRate", strconv.Itoa(r.cfg.SampleRate)) + mts.Meta.Add("channels", strconv.Itoa(r.cfg.Channels)) + mts.Meta.Add("period", fmt.Sprintf("%.6f", r.cfg.RecPeriod)) + mts.Meta.Add("bitDepth", strconv.Itoa(r.cfg.BitDepth)) + + switch r.cfg.InputCodec { + case codecutil.PCM: + mts.Meta.Add("codec", "pcm") + case codecutil.ADPCM: + mts.Meta.Add("codec", "adpcm") + default: + r.cfg.Logger.Log(logger.Fatal, pkg+"no audio codec set in config") + } + + // r.input = alsa.New(r.cfg.Logger) + + l, err := codecutil.NewByteLexer(pcm.DataSize(r.cfg.SampleRate, r.cfg.Channels, r.cfg.BitDepth, r.cfg.RecPeriod, r.cfg.InputCodec)) + if err != nil { + return err + } + r.lexTo = l.Lex + + return nil +} diff --git a/revid/revid.go b/revid/revid.go index 63072975..146eaffb 100644 --- a/revid/revid.go +++ b/revid/revid.go @@ -42,11 +42,9 @@ import ( "bitbucket.org/ausocean/av/codec/h264" "bitbucket.org/ausocean/av/codec/h265" "bitbucket.org/ausocean/av/codec/mjpeg" - "bitbucket.org/ausocean/av/codec/pcm" "bitbucket.org/ausocean/av/container/flv" "bitbucket.org/ausocean/av/container/mts" "bitbucket.org/ausocean/av/device" - "bitbucket.org/ausocean/av/device/alsa" "bitbucket.org/ausocean/av/device/file" "bitbucket.org/ausocean/av/device/geovision" "bitbucket.org/ausocean/av/device/raspivid" @@ -349,28 +347,10 @@ func (r *Revid) setupPipeline(mtsEnc func(dst io.WriteCloser, rate float64) (io. } case config.InputAudio: - mts.Meta.Add("sampleRate", strconv.Itoa(r.cfg.SampleRate)) - mts.Meta.Add("channels", strconv.Itoa(r.cfg.Channels)) - mts.Meta.Add("period", fmt.Sprintf("%.6f", r.cfg.RecPeriod)) - mts.Meta.Add("bitDepth", strconv.Itoa(r.cfg.BitDepth)) - - switch r.cfg.InputCodec { - case codecutil.PCM: - mts.Meta.Add("codec", "pcm") - case codecutil.ADPCM: - mts.Meta.Add("codec", "adpcm") - default: - r.cfg.Logger.Log(logger.Fatal, pkg+"no audio codec set in config") - } - - r.input = alsa.New(r.cfg.Logger) - - l, err := codecutil.NewByteLexer(pcm.DataSize(r.cfg.SampleRate, r.cfg.Channels, r.cfg.BitDepth, r.cfg.RecPeriod, r.cfg.InputCodec)) + err := r.setupAudio() if err != nil { return err } - r.lexTo = l.Lex - } // Configure the input device. We know that defaults are set, so no need to