@extends('layouts.app') @push('style') @endpush @section('content')

Call Center Music on Hold

Upload and manage MOH classes for queues and other call center destinations.
@if(session('success'))
{{ session('success') }}
@endif @if($errors->any())
Upload failed:
@endif
Upload Music on Hold
@csrf
Letters, numbers, dashes, and underscores only. A new MOH class is created on Asterisk automatically; an existing class is appended to.
Recommended. Converts MP3, M4A, FLAC, OGG, etc. into Asterisk-compatible audio on the server. @if(!$converter) ⚠ Server has no audio converter installed — only native formats will be accepted. @endif
Supported file formats
Native (no conversion needed):
@foreach($supportedUploadExtensions as $ext) {{ $ext }} @endforeach
@if($converter && !empty($convertibleExtensions))
Auto-convertible:
@foreach($convertibleExtensions as $ext) {{ $ext }} @endforeach
@endif
Server Status & Tips
@if($converter)
Audio conversion enabled via {{ $converter }}
@else
No converter installed. Install ffmpeg or sox to upload non-WAV files.
@endif
📁 Where files are stored
Each MOH class lives in /var/lib/asterisk/moh/<class>. The class is registered in musiconhold_custom.conf and Asterisk reloads automatically.
🎵 Best format for clarity
Mono WAV at 8 kHz, 16-bit PCM. Asterisk plays this directly with no transcoding overhead. For higher quality on G.722 codec, use 16 kHz WAV.
🎯 How to use a MOH class
After uploading, set the class on a Queue or Ring Group as the "Music on Hold" value. Callers will hear those tracks while waiting.
Configured MOH Classes {{ count($classes) }}
@forelse($classes as $class) @php $isDefault = $class['name'] === 'default'; $isActive = $isDefault && $activeDefault !== null; $thisIsActive = !$isDefault && $activeDefault === $class['name']; @endphp @empty @endforelse
Class Directory Files Last Updated Actions
{{ $class['name'] }} @if($isDefault && $isActive) using "{{ $activeDefault }}" @elseif($isDefault && !$isActive) Built-in @endif @if($thisIsActive) Active Default @endif
{{ $class['managed'] ? 'Custom class' : 'Built-in/default class' }}
{{ $class['directory'] }} {{ $class['file_count'] }} @if(!empty($class['files'])) {{ collect($class['files'])->max('modified_at') }} @else No files @endif @if($class['managed'] && !$thisIsActive && $class['file_count'] > 0)
@csrf
@endif @if($isDefault && $isActive)
@csrf
@endif
@if(empty($class['files']))
No audio files found in this MOH class.
@else
@foreach($class['files'] as $file) @endforeach
Filename Size Modified Actions
{{ $file['name'] }} {{ number_format($file['size'] / 1024, 1) }} KB {{ $file['modified_at'] }} @if($class['managed'])
@csrf @method('DELETE')
@else Protected @endif
@endif
No MOH classes detected.
@push('scripts') @endpush @endsection