14 Commits
v0.1 ... master

Author SHA1 Message Date
18f503c3e0 add --buffer-size=192000 2021-02-17 12:52:12 +00:00
ac0f0a6fbb README.md 2021-02-17 11:47:16 +00:00
bfbb10ed52 docu 2021-02-06 12:00:18 +00:00
88519bc4ab docu 2021-02-06 11:57:39 +00:00
d910a3d93f arecord parameter 2021-02-06 09:41:20 +00:00
197b2890e8 -max-file-time + filename 2021-02-04 20:41:07 +00:00
48c84601c5 . 2021-02-03 19:08:42 +00:00
a39c5ffb46 ... 2021-02-02 15:45:11 +00:00
769bb239e0 .. 2021-02-01 17:24:10 +00:00
cc9de03d26 source beautifying 2021-02-01 17:12:39 +00:00
753f6e1782 .. 2021-02-01 15:56:33 +00:00
89844ef368 all in one 2 2021-02-01 15:15:41 +00:00
13e6615435 all in one 2021-02-01 15:11:48 +00:00
b6f985a323 add sumsel.sh (all in one) 2021-02-01 15:05:37 +00:00
7 changed files with 227 additions and 111 deletions

View File

@@ -14,7 +14,7 @@
* Einrichtung ALSA
* über welches Device kann das Mikro angesprochen werden? (hier: plughw:1,0)
#### Entfernter Server (server)
#### Voraussetzungen entfernter Server (server)
* sshd
* apt-get install rsync
@@ -36,6 +36,7 @@ Auf dem Raspi folgendes ausführen:
```
git clone https://git.hs42.de/hs/sumsel.git
cd /sumsel
chmod a+x sumsel.sh
cp sumsel.conf.dist sumsel.conf
```
Anschliessend Variablen in ./sumsel.conf setzen:
@@ -49,27 +50,40 @@ Anschliessend Variablen in ./sumsel.conf setzen:
| UPL_DIR | optional | Ordner in dem die MP3 Dateien abgelegt werden | ./upqueue |
| UPL_SUFFIX | optional | Ordner in dem die MP3 Dateien abgelegt werden | sumsi |
## Skripte
| Kommando | Aktion |
| ------------ | ------------------------ |
| sumsel.sh -s | Simulieren |
| sumsel.sh -r | Aufnehmen |
| sumsel.sh -c | Konvertieren + Hochladen |
## Betrieb
### Endloses Aufnehmen
Im Dauerbetrieb laufen zwei Jobs:
| Jobtyp | Bezeichnung | Kommando | Betriebsart |
| ------- |------------------------- | ------------------------------- | -------------- |
| record | Aufnahme der WAV Dateien | ./sumsel.sh -r -C ./sumsel.conf | endlos |
| convert | Konvertierung + Upload | ./sumsel.sh -c -C ./sumsel.conf | alle 5 Minuten |
Die Jobs können über cron gestartet werden. Das Skript setzt einen Lock und sorgt dafür, dass von
jeden Jobtyp nur eine Instanz laufen kann. Stellt das Script fest, dass bereits eine Instanz läuft,
wird die aktuelle Instanz mit der Meldung "LOCK error" beendet.
```
pi@raspi:~> ./record.sh
hs@raspi4:~/dev/stage/sumsel $ ./sumsel.sh -c -C ./sumsel.conf
LOCK error
```
### Endloses Simulieren
Beispiel für crontab:
```
pi@raspi:~> ./simulate.sh
*/5 * * * * <path>/sumsel.sh -r -C <path>/sumsel.conf >> <path>/sumsel_r.log
1,10,11,21,31,41,51 * * * * <path>/sumsel.sh -c -C <path>/sumsel.conf >> <path>/sumsel_c.log
```
### Konvertieren und rsync Upload
Einplanung über crond
```
pi@raspi:~> ./convert.sh
```
### GIT commands
* git status

View File

@@ -1,27 +0,0 @@
#!/bin/bash
. ./sumsel.defaults
. ./sumsel.conf
. ./sumsel_functions.incl
if set_lockfile;
then
#Alle WAV Files ausser das letzte File.
#Das letzte File wird gerade recorded und wird beim naechsten Durchlauf verarbeitet
FILES=$(ls -tr ${REC_DIR} |head -n -1)
for F in ${FILES}
do
#echo ${F}
#Ermittle ctime des WAV Files
CTIME=$(date -r "${REC_DIR}/${F}" +"%Y%m%d%H%M%S")
ffmpeg -i "${REC_DIR}/${F}" -acodec mp3 "${UPL_DIR}/${CTIME}_${UPL_SUFFIX}.mp3"
rm "${REC_DIR}/${F}"
done
rsync -avzh --remove-source-files ${UPL_DIR} ${REMOTE_DIR}
del_lockfile
else
echo "LOCK error"
fi

View File

@@ -1,8 +0,0 @@
#!/bin/bash
. ./sumsel.defaults
. ./sumsel.conf
. ./sumsel_functions.incl
arecord --format=cd --device=${REC_DEVICE} --max-file-time ${REC_FILE_TIME} ${REC_DIR}/${REC_PREFIX}.wav

View File

@@ -1,16 +0,0 @@
#!/bin/bash
. ./sumsel.defaults
. ./sumsel.conf
. ./sumsel_functions.incl
COUNTER=0
echo "Press [CTRL+C] to stop.."
while :
do
sleep 1
COUNTER=$[$COUNTER +1]
dst_fn="${REC_DIR}/${REC_PREFIX}-${COUNTER}.wav"
cp ${SIM_EXAMPLE_FILE} ${dst_fn}
done

View File

@@ -1,23 +0,0 @@
LOCK_DIR=/var/lock
SIM_EXAMPLE_FILE=./res/test.wav
#Laenge der WAV Dateien in Sekunden
REC_FILE_TIME=360
#Ordner, ind dem die WAV Dateien abgelegt werden
#wenn der Ordner nicht existiert, wird er angelegt
REC_DIR=./recordings
#Dateiname der WAV Dateien
# sums-01.wav, sums-02.wav, ...
REC_PREFIX=sums
#Ordner in dem die MP3 Dateien abgelegt werden
#wenn der Ordner nicht existiert, wird er angelegt
UPL_DIR=./upqueue
#Dateiname der MP3 Dateien
# 20210130101112-sumsi.mp3, 20210130101120-sumsi.mp3, ...
UPL_SUFFIX=sumsi

202
sumsel.sh Executable file
View File

@@ -0,0 +1,202 @@
#!/bin/bash
VERSION="0.3"
LOCK_DIR=/var/lock
SIM_EXAMPLE_FILE=./res/test.wav
#Laenge der WAV Dateien in Sekunden
REC_FILE_TIME=360
#Ordner, ind dem die WAV Dateien abgelegt werden
#wenn der Ordner nicht existiert, wird er angelegt
REC_DIR=./recordings
#Dateiname der WAV Dateien
# sums-01.wav, sums-02.wav, ...
REC_PREFIX=sums
#Ordner in dem die MP3 Dateien abgelegt werden
#wenn der Ordner nicht existiert, wird er angelegt
UPL_DIR=./upqueue
#Dateiname der MP3 Dateien
# 20210130101112-sumsi.mp3, 20210130101120-sumsi.mp3, ...
UPL_SUFFIX=sumsi
usage() {
echo "Usage: $0 [-h] (-s|-r|-t) [-C <configfile>]" 1>&2;
echo -e '\t-h Usage' 1>&2;
echo -e '\t-v Version' 1>&2;
echo -e '' 1>&2;
echo -e '\t-s Simulation' 1>&2;
echo -e '\t-r Aufnahme' 1>&2;
echo -e '\t-c Konvertierung' 1>&2;
echo -e '' 1>&2;
echo -e '\t-C <configfile> Konfiguration laden' 1>&2;
echo "" 1>&2;
echo "Doku: https://git.hs42.de/hs/sumsel" 1>&2;
exit 1;
}
mode=''
lock_mode=''
while getopts ":hsrcC:v" options;
do
case "${options}" in
v)
echo "$0 version ${VERSION}" 1>&2;
exit 1
;;
h)
usage
;;
"s" | "r" | "c") #simulate
mode=${options}
;;
C)
config=${OPTARG}
if [ -f ${config} ]; then
. ${config}
else
echo "config file not found: ${config}"
exit
fi
;;
*)
echo "unknown option"
usage
;;
esac
done
set_lockfile() {
local basename=$(basename "$0")
if [ ! -z ${1+x} ]; then
basename="${basename}_$1"
fi
local lock_file="${LOCK_DIR}/${basename}"
local random_file=$(mktemp --tmpdir=${LOCK_DIR})
echo $$ > ${random_file}
mv -n ${random_file} ${lock_file}
if [ -e ${random_file} ]; then
false
else
true
fi
}
del_lockfile() {
local basename=$(basename "$0")
if [ ! -z ${1+x} ]; then
basename="${basename}_$1"
fi
local lock_file="${LOCK_DIR}/${basename}"
rm ${lock_file}
}
cleanup() {
del_lockfile ${lock_mode}
exit 1
}
check_var_exists() {
local var_name=$1
if [[ ! -v ${var_name} ]]; then
echo "${var_name} not set"
cleanup
fi
}
ctrl_c() {
echo "** Trapped CTRL-C" 1>&2;
cleanup
}
simulate() {
check_var_exists "REC_DIR"
check_var_exists "REC_PREFIX"
check_var_exists "SIM_EXAMPLE_FILE"
local counter=0
local dst_fn=""
mkdir -p ${REC_DIR}
echo "Press [CTRL+C] to stop.." 1>&2;
trap ctrl_c INT
while :
do
sleep ${REC_FILE_TIME}
counter=$[$counter +1]
dst_fn="${REC_DIR}/${REC_PREFIX}-${counter}.wav"
cp ${SIM_EXAMPLE_FILE} ${dst_fn}
done
}
record() {
check_var_exists "REC_DEVICE"
check_var_exists "REC_FILE_TIME"
check_var_exists "REC_PREFIX"
check_var_exists "REC_DIR"
mkdir -p ${REC_DIR}
trap ctrl_c INT
arecord --format=cd --device=${REC_DEVICE} --buffer-size=192000 --max-file-time=${REC_FILE_TIME} --use-strftime ${REC_DIR}/${REC_PREFIX}%Y%m%d%H%M%v.wav
}
convert() {
check_var_exists "REC_DIR"
check_var_exists "UPL_DIR"
check_var_exists "UPL_SUFFIX"
check_var_exists "REMOTE_DIR"
mkdir -p ${REC_DIR}
mkdir -p ${UPL_DIR}
#Alle WAV Files ausser das letzte File.
#Das letzte File wird gerade recorded und wird beim naechsten Durchlauf verarbeitet
local FILES=$(ls -tr ${REC_DIR} |head -n -1)
for F in ${FILES}
do
#Ermittle ctime des WAV Files
local CTIME=$(date -r "${REC_DIR}/${F}" +"%Y%m%d%H%M%S")
ffmpeg -i "${REC_DIR}/${F}" -acodec mp3 "${UPL_DIR}/${CTIME}_${UPL_SUFFIX}.mp3"
rm "${REC_DIR}/${F}"
done
rsync -avzh --remove-source-files ${UPL_DIR} ${REMOTE_DIR}
}
case ${mode} in
s) #Simulation
lock_mode=record
func=simulate
;;
r) #Aufnahme
lock_mode=record
func=record
;;
c) #Konvertierung
lock_mode=convert
func=convert
;;
*)
echo "mode not set" 1>&2;
exit 1
;;
esac
if set_lockfile ${lock_mode}; then
${func}
del_lockfile ${lock_mode}
else
echo "LOCK error" 1>&2;
exit 1
fi

View File

@@ -1,26 +0,0 @@
function set_lockfile {
local BASENAME=$(basename "$0")
local LOCK_FILE="${LOCK_DIR}/${BASENAME}"
local RANDOM_FILE=$(mktemp --tmpdir=${LOCK_DIR})
echo $$ > ${RANDOM_FILE}
mv -n ${RANDOM_FILE} ${LOCK_FILE}
if [ -e ${RANDOM_FILE} ] ; then
OTHER_PID=$(cat ${LOCK_FILE})
false
else
true
fi
}
function del_lockfile {
local BASENAME=$(basename "$0")
local LOCK_FILE="${LOCK_DIR}/${BASENAME}"
rm ${LOCK_FILE}
}
mkdir -p ${REC_DIR}
mkdir -p ${UPL_DIR}