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 "\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
|