From 53f4de6d5b7531870256c6b61521a9e7a5a623b5 Mon Sep 17 00:00:00 2001 From: Ella Pietraroia Date: Wed, 26 Feb 2020 16:05:03 +1030 Subject: [PATCH] looper: looper verisons for pi3 and for pi0 --- cmd/audio-player/looper0/README | 55 ++++++++++ cmd/audio-player/{looper => looper0}/main.go | 9 +- cmd/audio-player/looper3/README | 55 ++++++++++ cmd/audio-player/looper3/main.go | 108 +++++++++++++++++++ 4 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 cmd/audio-player/looper0/README rename cmd/audio-player/{looper => looper0}/main.go (94%) create mode 100644 cmd/audio-player/looper3/README create mode 100644 cmd/audio-player/looper3/main.go diff --git a/cmd/audio-player/looper0/README b/cmd/audio-player/looper0/README new file mode 100644 index 00000000..b1065257 --- /dev/null +++ b/cmd/audio-player/looper0/README @@ -0,0 +1,55 @@ +/* +NAME + test-audio/README + +AUTHORS + Ella Pietraroia + +LICENSE + revid is Copyright (C) 2017-2020 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. +*/ + +Pi Setup: +pull master +navigate to /go/src/bitbucket.org/ausocean/av/cmd/audio-player/looper + $sudo nano main.go +chage file variable at top of function to be wav file that you have put onto the pi (hint: spc command to put a new file on the pi) +and build +edit rc.local to run looper at boot + $sudo nano /etc/rc.local +paste this in after comments but before 'exit 0': ----------------------------------------------------------- + +exec 2> /tmp/rc.local.log # send stderr from rc.local to a log file +exec 1>&2 # send stdout to the same log file +printf "rc.local started" # show start of execution +set -x # tell sh to display commands before execution + +AUDIOPATH=/home/pi/go/src/bitbucket.org/ausocean/av/cmd/audio-player/looper +cd $AUDIOPATH + +./looper & +----------------------------------------------------------------------------------------------------------------- + $systemctl enable rc-local + $sudo systemctl start rc-local.service +after starting the service the looping should start straight away + +Useful commands: + $cat /tmp/rc.local.log + $sudo systemctl status rc-local.service + $cat audio.log (in looper directory) + +On computer + $scp something.wav pi@192.168.1.106:/home/pi diff --git a/cmd/audio-player/looper/main.go b/cmd/audio-player/looper0/main.go similarity index 94% rename from cmd/audio-player/looper/main.go rename to cmd/audio-player/looper0/main.go index 88e5bb5d..ffce3362 100644 --- a/cmd/audio-player/looper/main.go +++ b/cmd/audio-player/looper0/main.go @@ -57,7 +57,6 @@ func main() { defer f.Close() log.SetOutput(f) - //alsactl ensures that the sound will be played through the correct soundcard path, err := exec.LookPath("alsactl") if err != nil { log.Fatalf("fatal: didn't find 'alsactl' executable\n") @@ -65,6 +64,14 @@ func main() { log.Printf("'alsactl' executable is in '%s'\n", path) } + //alsactl ensures that the sound will be played through the correct soundcard + path, err = exec.LookPath("alsactl") + if err != nil { + log.Fatalf("fatal: didn't find 'alsactl' executable\n") + } else { + log.Printf("'alsactl' executable is in '%s'\n", path) + } + for { cmdInit := exec.Command("alsactl", "-f", soundcardPath, "restore") err := cmdInit.Run() diff --git a/cmd/audio-player/looper3/README b/cmd/audio-player/looper3/README new file mode 100644 index 00000000..90ea817d --- /dev/null +++ b/cmd/audio-player/looper3/README @@ -0,0 +1,55 @@ +/* +NAME + test-audio/README + +AUTHORS + Ella Pietraroia + +LICENSE + revid is Copyright (C) 2017-2020 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. +*/ + +Pi Setup: +pull master +navigate to /go/src/bitbucket.org/ausocean/av/cmd/audio-player/looper + $sudo nano main.go +chage file variable at top of function to be wav file that you have put onto the pi (hint: spc command to put a new file on the pi) +and build +edit rc.local to run looper at boot + $sudo nano /etc/rc.local +paste this in after comments but before 'exit 0': ----------------------------------------------------------- + +exec 2> /tmp/rc.local.log # send stderr from rc.local to a log file +exec 1>&2 # send stdout to the same log file +printf "rc.local started" # show start of execution +set -x # tell sh to display commands before execution + +AUDIOPATH=/home/pi/go/src/bitbucket.org/ausocean/av/cmd/audio-player/looper3 +cd $AUDIOPATH + +./looper3 & +----------------------------------------------------------------------------------------------------------------- + $systemctl enable rc-local + $sudo systemctl start rc-local.service +after starting the service the looping should start straight away + +Useful commands: + $cat /tmp/rc.local.log + $sudo systemctl status rc-local.service + $cat audio.log (in looper directory) + +On computer + $scp something.wav pi@192.168.1.106:/home/pi diff --git a/cmd/audio-player/looper3/main.go b/cmd/audio-player/looper3/main.go new file mode 100644 index 00000000..a74067ff --- /dev/null +++ b/cmd/audio-player/looper3/main.go @@ -0,0 +1,108 @@ +/* +NAME + test-audio/main.go + +AUTHORS + Ella Pietraroia + +LICENSE + revid is Copyright (C) 2017-2020 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. +*/ + +//testing for underwater speaker audio playing on pi + +package main + +import ( + "bytes" + "io" + "log" + "os" + "os/exec" + "sync" +) + +func main() { + soundFile := "48khz.wav" //"5mStartToEndOfTrials.wav" + logFile := "audio.log" + + //making log file + _, err := os.Stat(logFile) + if !os.IsNotExist(err) { + err := os.Remove(logFile) + if err != nil { + log.Fatalf("fatal: error clearing file: %v", err) + } + } + + f, err := os.OpenFile(logFile, os.O_RDWR|os.O_CREATE, 0666) //chage to empty each time + if err != nil { + log.Fatalf("fatal: error opening file %s: %v", logFile, err) + } + defer f.Close() + log.SetOutput(f) + + //making sure that play is on pi + path, err := exec.LookPath("omxplayer") + if err != nil { + log.Fatalf("fatal: didn't find 'omxplayer' executable\n") + } else { + log.Printf("'omxplayer' executable is in '%s'\n", path) + } + + numPlays := 0 + for { + numPlays++ + log.Printf(" Play number: %d\n", numPlays) + + cmd := exec.Command("omxplayer", soundFile) + + var stdoutBuf, stderrBuf bytes.Buffer + stdoutIn, _ := cmd.StdoutPipe() + stderrIn, _ := cmd.StderrPipe() + + var errStdout, errStderr error + stdout := io.MultiWriter(os.Stdout, &stdoutBuf) + stderr := io.MultiWriter(os.Stderr, &stderrBuf) + + err := cmd.Start() + if err != nil { + log.Fatalf("fatal: cmd.Start() for 'play' failed with '%s'\n", err) + } + + var wg sync.WaitGroup + wg.Add(1) + + go func() { + _, errStdout = io.Copy(stdout, stdoutIn) + wg.Done() + }() + + _, errStderr = io.Copy(stderr, stderrIn) + wg.Wait() + + err = cmd.Wait() + if err != nil { + log.Fatalf("fatal: cmd.Run() for 'play' failed with %s\n", err) + } + if errStdout != nil || errStderr != nil { + log.Fatal("fatal: failed to capture stdout or stderr\n") + } + outStr, errStr := string(stdoutBuf.Bytes()), string(stderrBuf.Bytes()) + log.Printf("\nout:\n%s\nerr:\n%s\n____________________________________________________\n\n", outStr, errStr) + } + +}