#!/bin/bash # USER-CONFIGURABLE VARIABLES len=60 delay=030 ffmpeg_bin=ffmpeg # --- function log() { echo "[$(date "+%T")] $1" } function stream() { $ffmpeg_bin -re -f alsa -channels 2 -sample_rate 44100 -i hw:Loopback,1,0 -t $1 -f matroska -acodec $fmt -b:a $bitrate - 2>$tmp | nc $ip $port } function stream_wave() { $ffmpeg_bin -re -f alsa -channels 2 -sample_rate 44100 -i hw:Loopback,1,0 -t $1 -f wav - 2>$tmp | nc $ip $port } function stream_cont() { $stream $len & sleep $len.$delay } function rolling_rocks() { while true; do if [[ "$(cat $tmp | grep -a "Input/output error")" != '' ]]; then rm $tmp $stream $((len-1)).9 & log 'Hit a "Device Busy" error, consider increasing sleep delay!' fi sleep 0.1 done } if [[ "$1" == '' ]]; then if [[ "$0" != *"client.sh" ]]; then echo "usage: $0 client [fmt] [kbps]" else echo "usage: $0 [fmt] [kbps]" fi exit 1 fi if [[ "$3" != '' ]]; then fmt="$3" stream="stream" log 'Container: matroska' else fmt="wav" stream="stream_wave" log 'Container: RIFF' fi if [[ "$4" != '' ]]; then bitrate="$4" else bitrate="128k" fi ip=$1 port=$2 tmp=$(mktemp) rolling_rocks & log "Loop length: ${len}s" log "Post-loop delay: ${delay}ms" log 'Starting main loop...' while true; do stream_cont done