forked from MikeYankeeOscarBeta/PiFMPlay
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pifmplay
195 lines (174 loc) · 5.05 KB
/
pifmplay
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#!/bin/sh
# Written by Mikael Jakhelln, reversioned by Adrian Gonzalez Barbosa
# Requires pifm complied on /usr/lib/pifm if not on there change pifmfolder variable
# usage:
# fmplay "/path/to/folder/with/mp3/files/" frequency
# examples:
# fmplay "../sounds/Daft punk/Daft Punk - One More Time.mp3" 91.3
# Variables:
#if there is a third parameter probabli using verbosity, or using this worng
verb=false
if [ "$1" = -v ]; then
shift
verb=true
fi
# if there is a second parameter, use it as frequency instead.
if [ $# -eq 2 ]; then
frequency=$2
else
# Default frequency, you can change it if you want
frequency=88.0
fi
#This is what pifmplay is asked to play, optional, you can make your own default directory
#if [ $# -eq 0 ]; then
# thingtoplay='';
#else
thingtoplay=$1;
#fi
# saving the folderpath for easier use
folderpath=`pwd`;
if $verb -eq true ; then
echo "You are in folder $folderpath";
fi
# the folder pifm is in. (Change this if not installed with my .deb)
pifmfolder=/usr/local/lib;
# Functions:
pause() {
# pauses the stream of music to pifm by pausing the program doing the conversion
# this works(ish), but pifm is stuck with the last buffer, so doesn't sound good. now how do we fix that? maybe make a temporary nosound buffer and force feed pifm with it?
echo "Pausing fm-broadcast"
sudo pkill -STOP avconv
sudo pkill -STOP sox
}
resume() {
# it does what it says it does.
echo "Resuming FM-broadcast"
sudo pkill -CONT avconv
sudo pkill -CONT sox
}
next() {
# kills the conversion, and that makes pifmplay continue to the next item in list (if there is any)
sudo pkill sox
sudo pkill avconv
}
stop() {
# slaughers pifmplay (and everything that goes with it)
sudo pkill pifm
sudo pkill pifmplay
sudo kill -SIGINT $$
}
start(){
# not necessary, just for standarization
playit "$thingtoplay" $frequency;
}
# Lots of different ways to play files here...
playwav() {
if $verb -eq true ; then
echo "DEBUG: playwav"
fi
# this wont work with most wavs, so it should be modified to decode/recode the .wav file to the correct format so pifm will accept it.
# .wav must be 16bit 22050khz.
# maybe it would work to convert it to a wav with the correct format, then feed it to pifm
# $pifmfolder/pifm "$1" $2
playmp3ffmpeg "$1" $2
}
playm4a() {
# lol, you can use ffmpeg for m4a-2-wav :), sox doen't like m4a tho :(
playmp3ffmpeg "$1" $2
}
playstream() {
if $verb -eq true ; then
echo "DEBUG: playstream"
fi
#plays a stream from the internet
#plays a bbc stream by default, since idk about any online music/sound streams. definately room for improvement here if needed ;)
sox -v .9 -t mp3 http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-eieuk -t wav --input-buffer 80000 -r 22050 -c 2 - | sudo $pifmfolder/pifm - $2 22050 stereo
}
playmp3ffmpeg() {
if $verb -eq true ; then
echo "DEBUG: playmp3ffmpeg"
fi
# ffmpeg converts the mp3 file to a wav stream, that stream is piped to pifm, pifm then transmits it over fm-radio via gpio 4
avconv -i "$1" -f s16le -ar 22.05k -ac 2 - 2>/dev/null | sudo $pifmfolder/pifm - $2 22050 stereo
}
playmp3sox() {
if $verb -eq true ; then
echo "DEBUG: playmp3sox"
fi
# sox converts the mp3 file to a wav stream, that stream is piped to pifm, pifm then transmits it over fm-radio via gpio 4
sox -v .9 -t mp3 "$1" -t wav --input-buffer 80000 -r 22050 -c 2 - | sudo $pifmfolder/pifm - $2 22050 stereo
}
playmp3() {
if $verb -eq true ; then
echo "DEBUG: playmp3"
fi
#default is sox, just because it has less output :P
playmp3sox "$1" $2
}
# method to call on a file
playfile() {
echo "PiFMPlaying: file $1, frequency $2"
# add filetype validation here...
if echo "$1" | grep -q '.wav$'; then
playwav "$1" $2
elif echo "$1" | grep -q '.mp3$'; then
playmp3 "$1" $2
elif echo "$1" | grep -q '.m4a$'; then
playm4a "$1" $2
elif echo "$1" | grep -q '.jpeg'; then
if $verb -eq true ; then
echo "An image, skipped"
fi
else
if $verb -eq true ; then
echo "Uhm, yeah. I probably can't play that, but i will try"
fi
playmp3ffmpeg "$1" $2
fi
}
# method to loop through all elements in a folder, then try to play it
playfolder() {
for file in $1/*;
do
{
playit "$file" $2
}
done
}
playit() {
if [ -d "$1" ]; then
if $verb -eq true ; then
echo "DEBUG: $1 its a folder!"
fi
# if the thing is a directory, play all files in that directory
playfolder "$1" $2
elif [ -f "$1" ]; then
if $verb -eq true ; then
echo "DEBUG: found a file!"
fi
# its a file.. try to play it!
playfile "$1" $2
else
if $verb -eq true ; then
echo "DEBUG: $1 its something else!"
# its not a directory, and its not a file.. :P
echo "PiFMPlay cant play that, sorry :("
fi
fi
}
# And now we run it!! ;)
# if its given one of the control commands as first parameter, do it to it
if [ "$1" = "pause" ]; then
pause
elif [ "$1" = "resume" ]; then
resume
elif [ "$1" = "next" ]; then
next
elif [ "$1" = "stop" ]; then
stop
elif [ "$1" = "start" ]; then
start
else
# else we play the thing
playit "$thingtoplay" $frequency;
fi