Version 1.0.9 terminalphone.sh
This commit is contained in:
parent
4145b2108b
commit
5d36206861
1 changed files with 163 additions and 4 deletions
167
terminalphone.sh
167
terminalphone.sh
|
|
@ -9,7 +9,7 @@ set -euo pipefail
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
APP_NAME="TerminalPhone"
|
APP_NAME="TerminalPhone"
|
||||||
VERSION="1.0.8"
|
VERSION="1.0.9"
|
||||||
BASE_DIR="$(dirname "$(readlink -f "$0")")"
|
BASE_DIR="$(dirname "$(readlink -f "$0")")"
|
||||||
DATA_DIR="$BASE_DIR/.terminalphone"
|
DATA_DIR="$BASE_DIR/.terminalphone"
|
||||||
TOR_DIR="$DATA_DIR/tor_data"
|
TOR_DIR="$DATA_DIR/tor_data"
|
||||||
|
|
@ -40,6 +40,7 @@ CIPHER="aes-256-cbc" # OpenSSL cipher for encryption
|
||||||
SNOWFLAKE_ENABLED=0 # Snowflake bridge (off by default)
|
SNOWFLAKE_ENABLED=0 # Snowflake bridge (off by default)
|
||||||
AUTO_LISTEN=0 # Auto-listen after Tor starts (off by default)
|
AUTO_LISTEN=0 # Auto-listen after Tor starts (off by default)
|
||||||
VOICE_EFFECT="none" # Voice effect (none, deep, high, robot, echo, whisper, custom)
|
VOICE_EFFECT="none" # Voice effect (none, deep, high, robot, echo, whisper, custom)
|
||||||
|
VOL_PTT=0 # Volume-down double-tap PTT (Termux only, experimental)
|
||||||
|
|
||||||
# Custom voice effect parameters (used when VOICE_EFFECT=custom)
|
# Custom voice effect parameters (used when VOICE_EFFECT=custom)
|
||||||
VOICE_PITCH=0 # Pitch shift in cents (-600 to +600, 0=off)
|
VOICE_PITCH=0 # Pitch shift in cents (-600 to +600, 0=off)
|
||||||
|
|
@ -182,6 +183,7 @@ VOICE_ECHO_DELAY=$VOICE_ECHO_DELAY
|
||||||
VOICE_ECHO_DECAY=$VOICE_ECHO_DECAY
|
VOICE_ECHO_DECAY=$VOICE_ECHO_DECAY
|
||||||
VOICE_HIGHPASS=$VOICE_HIGHPASS
|
VOICE_HIGHPASS=$VOICE_HIGHPASS
|
||||||
VOICE_TREMOLO=$VOICE_TREMOLO
|
VOICE_TREMOLO=$VOICE_TREMOLO
|
||||||
|
VOL_PTT=$VOL_PTT
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -226,7 +228,13 @@ install_deps() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "\n${YELLOW}Missing dependencies: ${deps_needed[*]}${NC}"
|
echo -e "\n${YELLOW}Missing dependencies: ${deps_needed[*]}${NC}"
|
||||||
echo -e "Attempting to install...\n"
|
echo -ne "\n${BOLD}Install missing dependencies? [Y/n]: ${NC}"
|
||||||
|
read -r _install_confirm
|
||||||
|
if [ "$_install_confirm" = "n" ] || [ "$_install_confirm" = "N" ]; then
|
||||||
|
echo -e "\n ${YELLOW}Installation skipped.${NC}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
# Use sudo only if available and not on Termux
|
# Use sudo only if available and not on Termux
|
||||||
local SUDO="sudo"
|
local SUDO="sudo"
|
||||||
|
|
@ -754,6 +762,13 @@ cleanup_call() {
|
||||||
# Wait briefly for processes to die
|
# Wait briefly for processes to die
|
||||||
sleep 0.2
|
sleep 0.2
|
||||||
|
|
||||||
|
# Kill volume monitor if active
|
||||||
|
if [ -n "$VOL_MON_PID" ]; then
|
||||||
|
kill "$VOL_MON_PID" 2>/dev/null || true
|
||||||
|
kill -9 "$VOL_MON_PID" 2>/dev/null || true
|
||||||
|
VOL_MON_PID=""
|
||||||
|
fi
|
||||||
|
|
||||||
# Remove all runtime files for this PID
|
# Remove all runtime files for this PID
|
||||||
rm -f "$PTT_FLAG" "$CONNECTED_FLAG"
|
rm -f "$PTT_FLAG" "$CONNECTED_FLAG"
|
||||||
rm -f "$RECV_PIPE" "$SEND_PIPE"
|
rm -f "$RECV_PIPE" "$SEND_PIPE"
|
||||||
|
|
@ -761,6 +776,7 @@ cleanup_call() {
|
||||||
rm -f "$DATA_DIR/run/remote_id_$$"
|
rm -f "$DATA_DIR/run/remote_id_$$"
|
||||||
rm -f "$DATA_DIR/run/remote_cipher_$$"
|
rm -f "$DATA_DIR/run/remote_cipher_$$"
|
||||||
rm -f "$DATA_DIR/run/incoming_$$"
|
rm -f "$DATA_DIR/run/incoming_$$"
|
||||||
|
rm -f "$DATA_DIR/run/vol_ptt_trigger_$$"
|
||||||
|
|
||||||
# Clean temp audio files
|
# Clean temp audio files
|
||||||
rm -f "$AUDIO_DIR"/*.opus "$AUDIO_DIR"/*.bin "$AUDIO_DIR"/*.txt "$AUDIO_DIR"/*.wav 2>/dev/null || true
|
rm -f "$AUDIO_DIR"/*.opus "$AUDIO_DIR"/*.bin "$AUDIO_DIR"/*.txt "$AUDIO_DIR"/*.wav 2>/dev/null || true
|
||||||
|
|
@ -801,6 +817,90 @@ stop_auto_listener() {
|
||||||
rm -f "$AUTO_LISTEN_FLAG" "$RECV_PIPE" "$SEND_PIPE"
|
rm -f "$AUTO_LISTEN_FLAG" "$RECV_PIPE" "$SEND_PIPE"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# VOLUME-DOWN DOUBLE-TAP PTT MONITOR (Termux only, experimental)
|
||||||
|
#=============================================================================
|
||||||
|
VOL_MON_PID=""
|
||||||
|
|
||||||
|
start_vol_monitor() {
|
||||||
|
local trigger_file="${1:-$DATA_DIR/run/vol_ptt_trigger_$$}"
|
||||||
|
[ "$VOL_PTT" -ne 1 ] && return
|
||||||
|
[ "$IS_TERMUX" -ne 1 ] && return
|
||||||
|
if ! check_dep jq; then
|
||||||
|
log_warn "jq not found — Volume PTT disabled"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
if ! check_dep termux-volume; then
|
||||||
|
log_warn "termux-volume not found — Volume PTT disabled"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f "$trigger_file"
|
||||||
|
|
||||||
|
(
|
||||||
|
local last_vol=""
|
||||||
|
local last_tap=0
|
||||||
|
local restore_vol=""
|
||||||
|
|
||||||
|
while [ -f "$CONNECTED_FLAG" ]; do
|
||||||
|
local cur_vol
|
||||||
|
cur_vol=$(termux-volume 2>/dev/null \
|
||||||
|
| jq -r '.[] | select(.stream=="music") | .volume' 2>/dev/null \
|
||||||
|
|| echo "")
|
||||||
|
|
||||||
|
# Remember the initial volume so we can restore after detection
|
||||||
|
if [ -n "$cur_vol" ] && [ -z "$restore_vol" ]; then
|
||||||
|
restore_vol="$cur_vol"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$cur_vol" ] && [ -n "$last_vol" ]; then
|
||||||
|
local drop=$(( last_vol - cur_vol ))
|
||||||
|
|
||||||
|
if [ "$drop" -ge 2 ] 2>/dev/null; then
|
||||||
|
# Rapid double-tap: both presses landed in one poll cycle
|
||||||
|
touch "$trigger_file"
|
||||||
|
last_tap=0
|
||||||
|
# Restore volume for next use
|
||||||
|
if [ -n "$restore_vol" ]; then
|
||||||
|
termux-volume music "$restore_vol" 2>/dev/null || true
|
||||||
|
last_vol="$restore_vol"
|
||||||
|
sleep 0.5
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
elif [ "$drop" -ge 1 ] 2>/dev/null; then
|
||||||
|
# Single press — check if second press follows within 1s
|
||||||
|
local now
|
||||||
|
now=$(date +%s)
|
||||||
|
if [ "$last_tap" -gt 0 ] && [ $((now - last_tap)) -le 1 ]; then
|
||||||
|
touch "$trigger_file"
|
||||||
|
last_tap=0
|
||||||
|
if [ -n "$restore_vol" ]; then
|
||||||
|
termux-volume music "$restore_vol" 2>/dev/null || true
|
||||||
|
last_vol="$restore_vol"
|
||||||
|
sleep 0.5
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
last_tap=$now
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
last_vol="$cur_vol"
|
||||||
|
sleep 0.4
|
||||||
|
done
|
||||||
|
) &
|
||||||
|
VOL_MON_PID=$!
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_vol_monitor() {
|
||||||
|
if [ -n "$VOL_MON_PID" ]; then
|
||||||
|
kill "$VOL_MON_PID" 2>/dev/null || true
|
||||||
|
kill -9 "$VOL_MON_PID" 2>/dev/null || true
|
||||||
|
VOL_MON_PID=""
|
||||||
|
fi
|
||||||
|
rm -f "$DATA_DIR/run/vol_ptt_trigger_$$"
|
||||||
|
}
|
||||||
|
|
||||||
# Check if an incoming call arrived on the background listener
|
# Check if an incoming call arrived on the background listener
|
||||||
check_auto_listen() {
|
check_auto_listen() {
|
||||||
if [ -f "$AUTO_LISTEN_FLAG" ]; then
|
if [ -f "$AUTO_LISTEN_FLAG" ]; then
|
||||||
|
|
@ -1045,6 +1145,12 @@ in_call_session() {
|
||||||
rm -f "$PTT_FLAG"
|
rm -f "$PTT_FLAG"
|
||||||
mkdir -p "$AUDIO_DIR"
|
mkdir -p "$AUDIO_DIR"
|
||||||
|
|
||||||
|
# Start volume-down double-tap monitor (Termux only)
|
||||||
|
VOL_MON_PID=""
|
||||||
|
local vol_trigger_file="$DATA_DIR/run/vol_ptt_trigger_$$"
|
||||||
|
rm -f "$vol_trigger_file"
|
||||||
|
start_vol_monitor "$vol_trigger_file"
|
||||||
|
|
||||||
# Write cipher to runtime file so subshells can track changes
|
# Write cipher to runtime file so subshells can track changes
|
||||||
echo "$CIPHER" > "$CIPHER_RUNTIME_FILE"
|
echo "$CIPHER" > "$CIPHER_RUNTIME_FILE"
|
||||||
|
|
||||||
|
|
@ -1226,7 +1332,13 @@ in_call_session() {
|
||||||
|
|
||||||
while [ -f "$CONNECTED_FLAG" ]; do
|
while [ -f "$CONNECTED_FLAG" ]; do
|
||||||
local key=""
|
local key=""
|
||||||
key=$(dd bs=1 count=1 2>/dev/null) || true
|
# Check volume-down double-tap trigger
|
||||||
|
if [ -f "$vol_trigger_file" ]; then
|
||||||
|
rm -f "$vol_trigger_file"
|
||||||
|
key="$PTT_KEY" # simulate PTT key press
|
||||||
|
else
|
||||||
|
key=$(dd bs=1 count=1 2>/dev/null) || true
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$key" = "$PTT_KEY" ]; then
|
if [ "$key" = "$PTT_KEY" ]; then
|
||||||
if [ $IS_TERMUX -eq 1 ]; then
|
if [ $IS_TERMUX -eq 1 ]; then
|
||||||
|
|
@ -1534,7 +1646,16 @@ settings_menu() {
|
||||||
|
|
||||||
local vfx_display="${VOICE_EFFECT}"
|
local vfx_display="${VOICE_EFFECT}"
|
||||||
[ "$vfx_display" = "none" ] && vfx_display="off"
|
[ "$vfx_display" = "none" ] && vfx_display="off"
|
||||||
echo -e " ${DIM}Voice effect: ${NC}${WHITE}${vfx_display}${NC}\n"
|
echo -e " ${DIM}Voice effect: ${NC}${WHITE}${vfx_display}${NC}"
|
||||||
|
|
||||||
|
if [ $IS_TERMUX -eq 1 ]; then
|
||||||
|
local vp_label="${RED}disabled${NC}"
|
||||||
|
if [ "$VOL_PTT" -eq 1 ]; then
|
||||||
|
vp_label="${GREEN}enabled${NC}"
|
||||||
|
fi
|
||||||
|
echo -e " ${DIM}Volume PTT: ${NC}${vp_label} ${DIM}(experimental)${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
echo -e " ${BOLD}${WHITE}1${NC} ${CYAN}│${NC} Change encryption cipher"
|
echo -e " ${BOLD}${WHITE}1${NC} ${CYAN}│${NC} Change encryption cipher"
|
||||||
echo -e " ${BOLD}${WHITE}2${NC} ${CYAN}│${NC} Change Opus encoding quality"
|
echo -e " ${BOLD}${WHITE}2${NC} ${CYAN}│${NC} Change Opus encoding quality"
|
||||||
|
|
@ -1542,6 +1663,9 @@ settings_menu() {
|
||||||
echo -e " ${BOLD}${WHITE}4${NC} ${CYAN}│${NC} Auto-listen (listen for calls automatically once Tor starts)"
|
echo -e " ${BOLD}${WHITE}4${NC} ${CYAN}│${NC} Auto-listen (listen for calls automatically once Tor starts)"
|
||||||
echo -e " ${BOLD}${WHITE}5${NC} ${CYAN}│${NC} Change PTT (push-to-talk) key"
|
echo -e " ${BOLD}${WHITE}5${NC} ${CYAN}│${NC} Change PTT (push-to-talk) key"
|
||||||
echo -e " ${BOLD}${WHITE}6${NC} ${CYAN}│${NC} Voice changer"
|
echo -e " ${BOLD}${WHITE}6${NC} ${CYAN}│${NC} Voice changer"
|
||||||
|
if [ $IS_TERMUX -eq 1 ]; then
|
||||||
|
echo -e " ${BOLD}${WHITE}7${NC} ${CYAN}│${NC} Volume PTT ${DIM}(double-tap Vol Down to talk, experimental)${NC}"
|
||||||
|
fi
|
||||||
echo -e " ${BOLD}${WHITE}0${NC} ${CYAN}│${NC} ${DIM}Back to main menu${NC}"
|
echo -e " ${BOLD}${WHITE}0${NC} ${CYAN}│${NC} ${DIM}Back to main menu${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo -ne " ${BOLD}Select: ${NC}"
|
echo -ne " ${BOLD}Select: ${NC}"
|
||||||
|
|
@ -1586,6 +1710,41 @@ settings_menu() {
|
||||||
sleep 1
|
sleep 1
|
||||||
;;
|
;;
|
||||||
6) settings_voice ;;
|
6) settings_voice ;;
|
||||||
|
7)
|
||||||
|
if [ $IS_TERMUX -eq 1 ]; then
|
||||||
|
if [ "$VOL_PTT" -eq 1 ]; then
|
||||||
|
VOL_PTT=0
|
||||||
|
log_ok "Volume PTT disabled"
|
||||||
|
else
|
||||||
|
if ! check_dep jq; then
|
||||||
|
echo ""
|
||||||
|
echo -ne " ${BOLD}jq is required for Volume PTT. Install now? [Y/n]: ${NC}"
|
||||||
|
read -r _jq_confirm
|
||||||
|
if [ "$_jq_confirm" != "n" ] && [ "$_jq_confirm" != "N" ]; then
|
||||||
|
pkg install -y jq 2>/dev/null || true
|
||||||
|
if ! check_dep jq; then
|
||||||
|
log_err "jq installation failed — Volume PTT not enabled"
|
||||||
|
sleep 2
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "\n ${YELLOW}Volume PTT not enabled (jq not installed)${NC}"
|
||||||
|
sleep 2
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
VOL_PTT=1
|
||||||
|
log_ok "Volume PTT enabled (double-tap Vol Down to toggle recording)"
|
||||||
|
echo -e " ${DIM}Note: Each press will lower your device volume.${NC}"
|
||||||
|
echo -e " ${DIM}You may want to start with volume at max.${NC}"
|
||||||
|
fi
|
||||||
|
save_config
|
||||||
|
sleep 2
|
||||||
|
else
|
||||||
|
echo -e "\n ${RED}Volume PTT is only available in Termux${NC}"
|
||||||
|
sleep 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
0|q|Q) return ;;
|
0|q|Q) return ;;
|
||||||
*)
|
*)
|
||||||
echo -e "\n ${RED}Invalid choice${NC}"
|
echo -e "\n ${RED}Invalid choice${NC}"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue