Update Readme. Add .conf files
parent
17a960833e
commit
0036cc1301
@ -0,0 +1,180 @@
|
|||||||
|
# Asterisk Jukebox & "Tape Cartridge" Player
|
||||||
|
|
||||||
|
Asterisk Jukebox & "Tape Cartridge" Player is a pair of scripts that provides
|
||||||
|
a jukebox like interface for playing songs/albums stored on the server, as well
|
||||||
|
as logic to perform this playback.
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
Asterisk Jukebox & Player consist of two basic dialplans:
|
||||||
|
|
||||||
|
a common set of logic for playback called from an jukebox interface
|
||||||
|
a jukebox interface dialplan for music/album selection
|
||||||
|
|
||||||
|
There is no reason you cannot use the player outside of a jukebox, provided you
|
||||||
|
set all the variables and call the proper extensions in it's context.
|
||||||
|
|
||||||
|
tapecart-player.conf is provided as it's own .conf file. It should go without
|
||||||
|
saying you only need to include this file in your extensions.conf. If you run a
|
||||||
|
big flat extensions.conf, then you probably already know to copy/paste it in.
|
||||||
|
|
||||||
|
Tracks are selected using a 4-digit code that consists of album number and
|
||||||
|
track number. Track "00" is special and will play the full album from the
|
||||||
|
beginning. During album playback; repeat, skip, and back controls are
|
||||||
|
provided. Pressing "0" will also take you back to the main menu.
|
||||||
|
|
||||||
|
Playback logic uses internal counters to request files. This requires your
|
||||||
|
files contain ONLY a track number, with or without leading zero. Only two
|
||||||
|
digits for a maximum of 99 tracks are supported. Playback logic's context is
|
||||||
|
called using extension pattern matching which dictates leading zero behavior
|
||||||
|
and passes some album information.
|
||||||
|
|
||||||
|
A related project, ajw - asterisk jukebox wizard, provides a bash script that
|
||||||
|
creates the jukebox interface for you.
|
||||||
|
|
||||||
|
## How To Use/Setup
|
||||||
|
|
||||||
|
Asterisk Jukebox depends heavily on your files being stored in a specific way;
|
||||||
|
each album is it's own folder, all filenames are track numbers, and the jukebox
|
||||||
|
folder lives in Asterisk's sounds directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
/var/lib/asterisk/sounds/en/jukeboxroot/album/[(0)1-99].ulaw
|
||||||
|
```
|
||||||
|
|
||||||
|
Include tapecart-player.conf (or tryinclude), or it's contents, in to your
|
||||||
|
extensions.conf.
|
||||||
|
|
||||||
|
tapecart-player.conf provides two contexts:
|
||||||
|
|
||||||
|
[cart-player] - provides single track playback
|
||||||
|
[8track-player] - provides album playback
|
||||||
|
|
||||||
|
For both contexts, the following variables will need to be set before sending a
|
||||||
|
channel to them:
|
||||||
|
|
||||||
|
c - the context you are sending from (used for returning from player)
|
||||||
|
aa - the path relative to your asterisk sounds directory your files live.
|
||||||
|
|
||||||
|
Both contexts use pattern matching extensions to select behavior as well as
|
||||||
|
pass information.
|
||||||
|
|
||||||
|
[cart-player]
|
||||||
|
|
||||||
|
```
|
||||||
|
#X - with X being 1 - 9 for files without leading zeros
|
||||||
|
*XX - with XX being all tracks > 10 or with leading zeros
|
||||||
|
```
|
||||||
|
|
||||||
|
[8track-player]
|
||||||
|
|
||||||
|
```
|
||||||
|
#XX - with XX being the number of tracks plus one. files without leading 0.
|
||||||
|
*XX - with XX being the same as above, but files with leading 0.
|
||||||
|
```
|
||||||
|
The idea is to keep the 4-digit leading zero code compatible with files that
|
||||||
|
don't have leading zeros. Originally I just forced leading zeros. But,
|
||||||
|
naturally; setting a variable to "01" and adding one to it results in "2",
|
||||||
|
which is not equal to "02" and causes playback to fail. Some of the logic for
|
||||||
|
cart-player is done at the jukebox dialplan for dealing with lack of leading
|
||||||
|
zeros; because sometimes you EXTEN:-2 and sometimes you want to EXTEN:-1.
|
||||||
|
|
||||||
|
|
||||||
|
## Using The Jukebox
|
||||||
|
|
||||||
|
When you dial the extension you're greeted with your intro file. You then need
|
||||||
|
to enter a 4 digit code comprised of the album and track number:
|
||||||
|
|
||||||
|
```
|
||||||
|
1234
|
||||||
|
| |_________Track number
|
||||||
|
|___________Album number
|
||||||
|
```
|
||||||
|
|
||||||
|
Track number "00" is special and when entered, will play the entire album back
|
||||||
|
from the beginning. In album playback, the following controls affect playback:
|
||||||
|
|
||||||
|
1 - skips back a track
|
||||||
|
2 - repeats the current track
|
||||||
|
3 - skips ahead a track
|
||||||
|
|
||||||
|
At the end of the album, or at any time during playback; pressing 0 returns to
|
||||||
|
the main menu.
|
||||||
|
|
||||||
|
Single track playback returns to the main menu at the end of the track, or by
|
||||||
|
pressing 0.
|
||||||
|
|
||||||
|
# History
|
||||||
|
|
||||||
|
```
|
||||||
|
05-MAY-2022: Initial Commit to self-hosted git.
|
||||||
|
06-MAY-2022: Update Readme. Add conf/examples.
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# Explanation of Operation
|
||||||
|
|
||||||
|
Rather than just write a script to generate a massively large dialplan with
|
||||||
|
everything hard-coded; the playback logic was designed to be universal and
|
||||||
|
uses extensions to configure parts of it.
|
||||||
|
|
||||||
|
From your jukebox dialplan, the first two digits of entry are hard-coded and
|
||||||
|
set the folder location for those tracks. The last two digits are pattern
|
||||||
|
matched. If they're 00, it calls the appropiate extension 8track-player.
|
||||||
|
Otherwise it calls the proper extension for cart-player; using additional
|
||||||
|
logic for leading 0s.
|
||||||
|
|
||||||
|
For single track playback (cart-player context), two pattern matching
|
||||||
|
extensions are used:
|
||||||
|
|
||||||
|
```
|
||||||
|
#X - with X being 1 - 9 for files without leading zeros
|
||||||
|
*XX - with XX being all tracks > 10 or with leading zeros
|
||||||
|
```
|
||||||
|
The only difference between them is how many digits you send and how many it
|
||||||
|
pulls from the "dialed extension". Pound and asterisk are used as a pre-fix to
|
||||||
|
avoid conflict with 1,2,3, and 0 controls.
|
||||||
|
|
||||||
|
For album playback, the situation is quite similar:
|
||||||
|
|
||||||
|
```
|
||||||
|
#XX - with XX being the number of tracks plus one. files without leading 0.
|
||||||
|
*XX - with XX being the same as above, but files with leading 0.
|
||||||
|
```
|
||||||
|
|
||||||
|
When you call the aprpropiate extension, the player determines if the track
|
||||||
|
number is less than 10 so it can write that variable appropiately. It then sets
|
||||||
|
a variable to either `#` or `*`, depending which was used. This variable is
|
||||||
|
used for the playback controls.
|
||||||
|
|
||||||
|
If your files don't have the leading zero (sent to #), then the routine simply
|
||||||
|
plays a track, increments the counter, compares it to the track count, and then
|
||||||
|
sends it back to playback or not. For channels sent to \* because you have
|
||||||
|
leading zeros, a few additional steps are done. Rather than jump directly to
|
||||||
|
playback; we check to see if current track has hit ten. If not, continue as
|
||||||
|
usual. But when you do hit track 10, we jump to a couple of lines that change
|
||||||
|
the varible from pound to star, and then dump us in to the context at normal
|
||||||
|
playback. We then finish the remainder of the album looping through the pound
|
||||||
|
extension.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# License
|
||||||
|
|
||||||
|
jaw - jukebox for asterisk wizard
|
||||||
|
Copyright (C) 2021 Jay Moore - nq4tango@gmail.com
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it 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.
|
||||||
|
|
||||||
|
This program 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
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
|||||||
|
[examplejuke-main]
|
||||||
|
exten = s,1,Answer()
|
||||||
|
same =n,Set(VOLUME(TX)=-3)
|
||||||
|
same = n,Set(c=examplejuke-main)
|
||||||
|
same = n(loop),Background(foobar/menu)
|
||||||
|
same = n,WaitExten(5)
|
||||||
|
same = n,Set(m=$[${m} + 1])
|
||||||
|
same = n,GoToIf($["${m}" < "5"]?loop)
|
||||||
|
same = n,Background(foobar/bye)
|
||||||
|
same = n,Hangup()
|
||||||
|
|
||||||
|
exten = _00XX,1,Set(aa=foobar/00album)
|
||||||
|
same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*11,1)
|
||||||
|
same = n,GoTo(cart-player,*${EXTEN:-2},1)
|
||||||
|
|
||||||
|
exten = _01XX,1,Set(aa=foobar/01album)
|
||||||
|
same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*15,1)
|
||||||
|
same = n,GoTo(cart-player,*${EXTEN:-2},1)
|
||||||
|
|
||||||
|
exten = _02XX,1,Set(aa=foobar/02album)
|
||||||
|
same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,#12,1)
|
||||||
|
same = n,GoToIf($["${EXTEN:-2}" < "10"]?cart-player,\#${EXTEN:-1},1) ; these files don't have a leading zero
|
||||||
|
same = n,GoTo(cart-player,*${EXTEN:-2},1)
|
@ -0,0 +1,37 @@
|
|||||||
|
[cart-player]
|
||||||
|
exten = _#X,1,Wait(.25)
|
||||||
|
same= n,Background(${aa}/${EXTEN:-1})
|
||||||
|
same = n,Goto(${c},s,return)
|
||||||
|
exten = _*XX,1,Wait(.25)
|
||||||
|
same= n,Background(${aa}/${EXTEN:-2})
|
||||||
|
same = n,Goto(${c},s,return)
|
||||||
|
exten = 0,1,Goto(${c},s,return)
|
||||||
|
|
||||||
|
[8track-player]
|
||||||
|
exten = _*XX,1,Set(tt=${IF($[${EXTEN:-2} < 10]?${EXTEN:-1}:${EXTEN:-2})})
|
||||||
|
same = n,Set(t=1)
|
||||||
|
same = n,Set(p=*)
|
||||||
|
same = n(lead),GoToIf($[${t} = 10]?tenplus)
|
||||||
|
same = n(hax),Background(${aa}/0${t})
|
||||||
|
same = n(next),Set(t=$[${t} + 1])
|
||||||
|
same = n,GoToIf($[${t} < ${tt}]?lead)
|
||||||
|
same = n,Goto(${c},s,goodbye)
|
||||||
|
same = n(tenplus),Set(p=#)
|
||||||
|
same = n,GoTo(#00,hax)
|
||||||
|
exten = _#XX,1,Set(tt=${IF($[${EXTEN:-2} < 10]?${EXTEN:-1}:${EXTEN:-2})})
|
||||||
|
same = n,Set(t=1)
|
||||||
|
same = n,Set(p=#)
|
||||||
|
same = n(hax),Background(${aa}/${t})
|
||||||
|
same = n(next),Set(t=$[${t} + 1])
|
||||||
|
same = n,GoToIf($[${t} < ${tt}]?hax)
|
||||||
|
same = n,Goto(${c},s,goodbye)
|
||||||
|
|
||||||
|
exten = 1,1,GoToIf($["${t}" = "1"]?wait)
|
||||||
|
same = n,Set(t=$[${t} - 1])
|
||||||
|
same = n(wait),Wait(.25)
|
||||||
|
same = n,Goto(${p}00,hax)
|
||||||
|
exten = 2,1,Wait(.25)
|
||||||
|
same = n,Goto(${p}00,hax)
|
||||||
|
exten = 3,1,Wait(.25)
|
||||||
|
same = n,Goto(${p}00,next)
|
||||||
|
exten = 0,1,Goto(${c},s,return)
|
Loading…
Reference in New Issue