added custom sound and sound test button in admin panel

This commit is contained in:
2025-05-30 01:40:19 -04:00
parent 965f349817
commit 7405cd22e8
2 changed files with 95 additions and 14 deletions

View File

@@ -526,6 +526,7 @@
<button class="btn btn-warning btn-small" onclick="clearLog()">Clear Log</button>
<button class="btn btn-warning btn-small" onclick="resetDay()">Reset Daily Limit</button>
<button class="btn btn-danger btn-small" onclick="resetAllPoints()">Reset All</button>
<button class="btn btn-warning btn-small" onclick="testAudio()">Test Audio</button>
<button class="btn btn-primary btn-small" onclick="exitAdminMode()">Exit Admin</button>
</div>
</div>
@@ -1313,51 +1314,84 @@
let audioPlaying = false;
function startAlarmSound() {
console.log('Starting alarm sound...');
const audioElement = document.getElementById('timerAudio');
// Force load the audio
audioElement.load();
// Set volume to max
audioElement.volume = 1.0;
audioElement.loop = true;
audioElement.play().catch(error => {
console.log('Audio playback failed:', error);
// Fallback - try to create a beep sound
createBeepSound();
});
audioPlaying = true;
// Try to play
const playPromise = audioElement.play();
if (playPromise !== undefined) {
playPromise
.then(() => {
console.log('Audio playing successfully');
audioPlaying = true;
})
.catch(error => {
console.error('Audio playback failed:', error);
console.log('Audio src:', audioElement.src);
console.log('Audio readyState:', audioElement.readyState);
console.log('Audio error:', audioElement.error);
// Try fallback beep
createBeepSound();
});
}
}
function stopAlarmSound() {
console.log('Stopping alarm sound...');
const audioElement = document.getElementById('timerAudio');
audioElement.pause();
audioElement.currentTime = 0;
audioPlaying = false;
// Stop any fallback beep
if (window.audioContext) {
window.audioContext.close();
window.audioContext = null;
}
}
function playCompletionSound() {
// Single play for non-alarm situations
console.log('Playing completion sound (single)...');
const audioElement = document.getElementById('timerAudio');
audioElement.loop = false;
audioElement.volume = 1.0;
audioElement.play().catch(error => {
console.log('Audio playback failed:', error);
console.error('Single play failed:', error);
});
}
function createBeepSound() {
// Fallback beep using Web Audio API
console.log('Creating fallback beep sound...');
try {
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();
window.audioContext = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = window.audioContext.createOscillator();
const gainNode = window.audioContext.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);
gainNode.connect(window.audioContext.destination);
oscillator.frequency.value = 800; // Frequency in Hz
oscillator.type = 'sine';
gainNode.gain.value = 0.3; // Volume
oscillator.start();
audioPlaying = true;
// Create beeping pattern
const beepPattern = () => {
if (!audioPlaying) {
oscillator.stop();
window.audioContext.close();
window.audioContext = null;
return;
}
gainNode.gain.value = gainNode.gain.value > 0 ? 0 : 0.3;
@@ -1365,16 +1399,63 @@
};
beepPattern();
console.log('Beep sound started');
} catch (e) {
console.log('Web Audio API not supported');
console.error('Web Audio API error:', e);
// Last resort - use notification API if available
if ('Notification' in window && Notification.permission === 'granted') {
new Notification('Timer Complete!', {
body: 'Your timer has finished.',
requireInteraction: true
});
}
}
}
// Test audio on page load
window.addEventListener('load', () => {
const audioElement = document.getElementById('timerAudio');
console.log('Audio element found:', audioElement);
console.log('Audio sources:', audioElement.getElementsByTagName('source').length);
// Check if audio can play
audioElement.addEventListener('canplay', () => {
console.log('Audio can play');
});
audioElement.addEventListener('error', (e) => {
console.error('Audio error event:', e);
});
// Request notification permission for fallback
if ('Notification' in window && Notification.permission === 'default') {
Notification.requestPermission();
}
});
function dismissTimerComplete() {
stopAlarmSound();
closeModal('timerCompleteModal');
}
// Test audio function
function testAudio() {
console.log('Testing audio...');
startAlarmSound();
// Show test modal
showAlert('Testing audio alarm. Click OK to stop.', 'Audio Test');
// Override OK button to stop sound
setTimeout(() => {
const okButton = document.querySelector('#alertModal button');
okButton.onclick = () => {
stopAlarmSound();
closeModal('alertModal');
};
}, 100);
}
// Close modals when clicking outside (except for no-close modals)
window.onclick = function(event) {
const modals = document.querySelectorAll('.modal:not(.no-close)');

BIN
public/timer-complete.mp3 Normal file

Binary file not shown.