From e3ea4977a1cb77ebefa4480bf953ef9c92f0eb30 Mon Sep 17 00:00:00 2001 From: fusionate Date: Fri, 9 Feb 2024 13:12:14 -0700 Subject: [PATCH] Ring Groups: Audio waveform generation integration. --- app/ring_groups/ring_group_edit.php | 6 +- app/ring_groups/waveform.php | 132 ++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 app/ring_groups/waveform.php diff --git a/app/ring_groups/ring_group_edit.php b/app/ring_groups/ring_group_edit.php index 77175dc68a..48c1e770d3 100644 --- a/app/ring_groups/ring_group_edit.php +++ b/app/ring_groups/ring_group_edit.php @@ -786,7 +786,7 @@ echo "\n"; echo " ".$text['label-'.$instance_label]."\n"; echo "\n"; - echo "\n"; + echo "\n"; echo "\n"; echo "\n"; echo "\n"; @@ -844,7 +844,7 @@ case 'ogg' : $mime_type = 'audio/ogg'; break; } echo ""; - echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$_SESSION['theme']['button_icon_play'],'id'=>'recording_button_'.$instance_id,'style'=>'display: '.(!empty($mime_type) ? 'inline' : 'none'),'onclick'=>"recording_play('".$instance_id."')"]); + echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$_SESSION['theme']['button_icon_play'],'id'=>'recording_button_'.$instance_id,'style'=>'display: '.(!empty($mime_type) ? 'inline' : 'none'),'onclick'=>"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'))"]); unset($playable, $mime_type); } echo "
\n"; @@ -1285,4 +1285,4 @@ //include the footer require_once "resources/footer.php"; -?> +?> \ No newline at end of file diff --git a/app/ring_groups/waveform.php b/app/ring_groups/waveform.php new file mode 100644 index 0000000000..3408037311 --- /dev/null +++ b/app/ring_groups/waveform.php @@ -0,0 +1,132 @@ + + Portions created by the Initial Developer are Copyright (C) 2024 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//includes files + require_once dirname(__DIR__, 2) . "/resources/require.php"; + require_once "resources/check_auth.php"; + require_once "resources/classes/waveform.php"; + + use maximal\audio\Waveform; + +//check permisions + if (permission_exists('recording_play')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +//create the waveform file + if ($_GET['id'] && !empty($_GET['data']) && !empty($_GET['type'])) { + + //determine path of audio file by type + if ($_GET['type'] == 'recordings') { + + $slash = substr($_GET['data'],0,1) != '/' ? '/' : null; + $full_file_path = $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].$slash.str_replace($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'], '', $_GET['data']); + + } + else if ($_GET['type'] == 'sounds') { + + //get first installed language (like en/us/callie) + $language_paths = glob($_SESSION["switch"]['sounds']['dir']."/*/*/*"); + foreach ($language_paths as $key => $path) { + $path = str_replace($_SESSION["switch"]['sounds']['dir'].'/', "", $path); + $path_array = explode('/', $path); + if (count($path_array) <> 3 || strlen($path_array[0]) <> 2 || strlen($path_array[1]) <> 2) { + unset($language_paths[$key]); + } + $language_paths[$key] = str_replace($_SESSION["switch"]['sounds']['dir']."/","",$language_paths[$key] ?? ''); + if (empty($language_paths[$key])) { + unset($language_paths[$key]); + } + } + $language_path = $language_paths[0]; + + //determine the path for sound file + $filename_parts = explode('/', str_replace('..', '', $_GET['data'])); + if (!is_array($filename_parts) || @sizeof($filename_parts) != 2) { exit; } + $path = $_SESSION['switch']['sounds']['dir'].'/'.$language_path.'/'.$filename_parts[0].'/8000/'; + + //build full path to sound file + $full_file_path = $path.$filename_parts[1]; + + } + + //stream waveform file + if (file_exists($full_file_path)) { + + //temporary waveform image filename + $temp_filename = 'waveform_'.$_GET['id'].'_'.rand(0000,9999).'.png'; + + //create temporary waveform image, if doesn't exist + if (file_exists($temp_filename)) { + $wf = true; + } + else { + //create temporary waveform image + $waveform = new Waveform($full_file_path); + Waveform::$linesPerPixel = 1; // default: 8 + Waveform::$samplesPerLine = 512; // default: 512 + Waveform::$colorA = !empty($_SESSION['theme']['audio_player_waveform_color_a_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_a_leg']['text']) : [32,134,37,0.6]; // array rgba, left (a-leg) wave color + Waveform::$colorB = !empty($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) : [0,125,232,0.6]; // array rgba, right (b-leg) wave color + Waveform::$backgroundColor = !empty($_SESSION['theme']['audio_player_waveform_color_background']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_background']['text']) : [0,0,0,0]; // array rgba, default: transparent + Waveform::$axisColor = !empty($_SESSION['theme']['audio_player_waveform_color_axis']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_axis']['text']) : [0,0,0,0.3]; // array rgba + Waveform::$singlePhase = empty($_SESSION['theme']['audio_player_waveform_single_phase']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] !== 'true' ? false : true; // positive phase only - left (a-leg) top, right (b-leg) bottom + Waveform::$singleAxis = empty($_SESSION['theme']['audio_player_waveform_single_axis']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] !== 'false' ? true : false; // combine channels into single axis + $height = !empty($_SESSION['theme']['audio_player_waveform_height']['text']) && is_numeric(str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text'])) ? 2.2 * (int) str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text']) : null; + $wf = $waveform->getWaveform($temp_filename, 1600, $height ?? 180); // input: png filename returns boolean true/false, or 'base64' returns base64 string + } + + //stream image to browser + if ($wf === true && file_exists($temp_filename)) { + + ob_clean(); + $fd = fopen($temp_filename, 'rb'); + header("Content-Type: application/force-download"); + header("Content-Type: application/octet-stream"); + header("Content-Type: application/download"); + header("Content-Description: File Transfer"); + header("Content-Type: image/png"); + header('Content-Disposition: attachment; filename="'.$temp_filename.'"'); + header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past + header("Content-Length: ".filesize($temp_filename)); + ob_clean(); + + fpassthru($fd); + + } + + } + + //delete temp waveform image + @unlink($temp_filename); + + } + +?> \ No newline at end of file