audiotoolheadless
Version:
A modern, headless audio player with HLS support, equalizer, queue management, and media session integration
1,001 lines (991 loc) • 30.8 kB
text/typescript
import Hls, { HlsConfig } from 'hls.js';
type InitMode = 'REACT' | 'VANILLA';
type PlaybackRate = 1.0 | 1.25 | 1.5 | 1.75 | 2.0 | 2.5 | 3.0;
type PreloadStrategy = 'none' | 'metadata' | 'auto' | '';
type CrossOriginValue = 'anonymous' | 'use-credentials' | null;
type PlaybackState = 'idle' | 'playing' | 'ended' | 'ready' | 'paused' | 'stalled' | 'error' | 'buffering' | 'trackchanged' | 'durationchanged' | 'queueended';
type QueuePlaybackType = 'DEFAULT' | 'REVERSE' | 'SHUFFLE';
type LoopMode = 'SINGLE' | 'QUEUE' | 'OFF';
interface MediaArtwork {
src: string;
name?: string;
sizes?: string;
type?: string;
}
interface MediaTrack {
id: string;
title: string;
source: string;
artwork: MediaArtwork[] | null;
duration?: number;
genre?: string;
album?: string;
comment?: string;
year?: number | string;
artist?: string;
}
interface PlayerConfiguration {
mode: InitMode;
useDefaultEventListeners: boolean;
showNotificationActions?: boolean;
preloadStrategy?: PreloadStrategy;
playbackRate?: PlaybackRate;
customEventListeners?: EventCallbackMap | null;
autoPlay?: boolean;
enablePlayLog?: boolean;
enableHls?: boolean;
enableEqualizer?: boolean;
crossOrigin?: CrossOriginValue;
hlsConfig?: HlsConfig;
}
interface PlayerError {
code: number | string | null;
message: string;
readable: string;
}
interface PlayerState {
playbackState: PlaybackState;
duration: number | undefined;
bufferedDuration: number;
progress: number | undefined;
volume: number;
playbackRate: PlaybackRate;
error: PlayerError;
currentTrack: MediaTrack;
currentTrackPlayTime: number;
previousTrackPlayTime: number;
}
interface ReadyState {
HAVE_NOTHING: 0;
HAVE_METADATA: 1;
HAVE_CURRENT_DATA: 2;
HAVE_FUTURE_DATA: 3;
HAVE_ENOUGH_DATA: 4;
}
interface NetworkState {
NETWORK_EMPTY: 0;
NETWORK_IDLE: 1;
NETWORK_LOADING: 2;
NETWORK_NO_SOURCE: 3;
}
interface AudioEvents {
ABORT: 'abort';
TIME_UPDATE: 'timeupdate';
CAN_PLAY: 'canplay';
CAN_PLAY_THROUGH: 'canplaythrough';
DURATION_CHANGE: 'durationchange';
ENDED: 'ended';
EMPTIED: 'emptied';
PLAYING: 'playing';
WAITING: 'waiting';
SEEKING: 'seeking';
SEEKED: 'seeked';
LOADED_META_DATA: 'loadedmetadata';
LOADED_DATA: 'loadeddata';
PLAY: 'play';
PAUSE: 'pause';
RATE_CHANGE: 'ratechange';
VOLUME_CHANGE: 'volumechange';
SUSPEND: 'suspend';
STALLED: 'stalled';
PROGRESS: 'progress';
LOAD_START: 'loadstart';
ERROR: 'error';
TRACK_CHANGE: 'trackchange';
QUEUE_ENDED: 'queueended';
}
interface HlsEvents {
MEDIA_ATTACHING: 'hlsMediaAttaching';
MEDIA_ATTACHED: 'hlsMediaAttached';
MEDIA_DETACHING: 'hlsMediaDetaching';
MEDIA_DETACHED: 'hlsMediaDetached';
BUFFER_RESET: 'hlsBufferReset';
BUFFER_CODECS: 'hlsBufferCodecs';
BUFFER_CREATED: 'hlsBufferCreated';
BUFFER_APPENDING: 'hlsBufferAppending';
BUFFER_APPENDED: 'hlsBufferAppended';
BUFFER_EOS: 'hlsBufferEos';
BUFFER_FLUSHING: 'hlsBufferFlushing';
BUFFER_FLUSHED: 'hlsBufferFlushed';
MANIFEST_LOADING: 'hlsManifestLoading';
MANIFEST_LOADED: 'hlsManifestLoaded';
MANIFEST_PARSED: 'hlsManifestParsed';
LEVEL_SWITCHING: 'hlsLevelSwitching';
LEVEL_SWITCHED: 'hlsLevelSwitched';
LEVEL_LOADING: 'hlsLevelLoading';
LEVEL_LOADED: 'hlsLevelLoaded';
LEVEL_UPDATED: 'hlsLevelUpdated';
LEVEL_PTS_UPDATED: 'hlsLevelPtsUpdated';
LEVELS_UPDATED: 'hlsLevelsUpdated';
AUDIO_TRACKS_UPDATED: 'hlsAudioTracksUpdated';
AUDIO_TRACK_SWITCHING: 'hlsAudioTrackSwitching';
AUDIO_TRACK_SWITCHED: 'hlsAudioTrackSwitched';
AUDIO_TRACK_LOADING: 'hlsAudioTrackLoading';
AUDIO_TRACK_LOADED: 'hlsAudioTrackLoaded';
SUBTITLE_TRACKS_UPDATED: 'hlsSubtitleTracksUpdated';
SUBTITLE_TRACKS_CLEARED: 'hlsSubtitleTracksCleared';
SUBTITLE_TRACK_SWITCH: 'hlsSubtitleTrackSwitch';
SUBTITLE_TRACK_LOADING: 'hlsSubtitleTrackLoading';
SUBTITLE_TRACK_LOADED: 'hlsSubtitleTrackLoaded';
SUBTITLE_FRAG_PROCESSED: 'hlsSubtitleFragProcessed';
CUES_PARSED: 'hlsCuesParsed';
NON_NATIVE_TEXT_TRACKS_FOUND: 'hlsNonNativeTextTracksFound';
INIT_PTS_FOUND: 'hlsInitPtsFound';
FRAG_LOADING: 'hlsFragLoading';
FRAG_LOAD_EMERGENCY_ABORTED: 'hlsFragLoadEmergencyAborted';
FRAG_LOADED: 'hlsFragLoaded';
FRAG_DECRYPTED: 'hlsFragDecrypted';
FRAG_PARSING_INIT_SEGMENT: 'hlsFragParsingInitSegment';
FRAG_PARSING_USERDATA: 'hlsFragParsingUserdata';
FRAG_PARSING_METADATA: 'hlsFragParsingMetadata';
FRAG_PARSED: 'hlsFragParsed';
FRAG_BUFFERED: 'hlsFragBuffered';
FRAG_CHANGED: 'hlsFragChanged';
FPS_DROP: 'hlsFpsDrop';
FPS_DROP_LEVEL_CAPPING: 'hlsFpsDropLevelCapping';
ERROR: 'hlsError';
DESTROYING: 'hlsDestroying';
KEY_LOADING: 'hlsKeyLoading';
KEY_LOADED: 'hlsKeyLoaded';
LIVE_BACK_BUFFER_REACHED: 'hlsLiveBackBufferReached';
BACK_BUFFER_REACHED: 'hlsBackBufferReached';
}
type EventCallbackMap = {
[key in keyof Partial<AudioEvents>]: (event: Event, audioInstance: HTMLAudioElement, playLogEnabled: boolean) => void;
};
type HlsEventCallbackMap = {
[key in keyof Partial<HlsEvents>]: (event: Event, data: any, hlsInstance: Hls, playLogEnabled: boolean) => void;
};
type EqualizerStatus = 'IDEAL' | 'RUNNING' | 'SUSPENDED' | 'CLOSED';
interface EqualizerBand {
type: BiquadFilterType;
frequency: number;
Q: number;
gain: number;
}
interface EqualizerPresets {
FLAT: number[];
ACOUSTIC: number[];
BASS_BOOSTER: number[];
BASS_REDUCER: number[];
CLASSICAL: number[];
DEEP: number[];
ELECTRONIC: number[];
LATIN: number[];
LOUDNESS: number[];
LOUNGE: number[];
PIANO: number[];
POP: number[];
RNB: number[];
ROCK: number[];
SMALL_SPEAKERS: number[];
SPOKEN_WORD: number[];
TREBLE_BOOSTER: number[];
TREBLE_REDUCER: number[];
VOCAL_BOOSTER: number[];
}
interface ErrorEvents {
MEDIA_ERR_ABORTED: 'Media playback was aborted';
MEDIA_ERR_NETWORK: 'Network error occurred';
MEDIA_ERR_DECODE: 'Media decoding error';
MEDIA_ERR_SRC_NOT_SUPPORTED: 'Media source not supported';
}
interface ErrorMessageMap {
MEDIA_ERR_ABORTED: string;
MEDIA_ERR_DECODE: string;
MEDIA_ERR_NETWORK: string;
MEDIA_ERR_SRC_NOT_SUPPORTED: string;
DEFAULT: string;
}
/**
* AudioHeadless - A modern, headless audio player with HLS support,
* equalizer, queue management, and media session integration.
*/
declare class AudioHeadless {
private audioElement;
private static playerInstance;
private isPlaybackLoggingEnabled;
private isEqualizerEnabled;
private shouldShowNotifications;
private playbackQueue;
private currentTrackIndex;
private originalPlaybackQueue;
private isShuffleEnabled;
private currentLoopMode;
private mediaFetchFunction;
private equalizerStatus;
private equalizerInstance;
private hlsManager;
private mediaSessionManager;
private eventEmitter;
private queueManager;
constructor();
/**
* Initialize core utility modules
* @private
*/
private initializeCoreModules;
/**
* Initialize the audio player with configuration
* @param config - Player configuration options
*/
initialize(config: PlayerConfiguration): Promise<void>;
/**
* Initialize event listeners for the audio element
* @private
*/
private initializeEventListeners;
/**
* Initialize the equalizer module
* @private
*/
private initializeEqualizer;
/**
* Load a media track into the player
* @param track - The media track to load
* @param fetchFunction - Optional function to fetch track data
*/
loadTrack(track: MediaTrack, fetchFunction?: (track: MediaTrack) => Promise<void>): Promise<void>;
/**
* Load and immediately play a media track
* @param track - The media track to load and play
* @param fetchFunction - Optional function to fetch track data
*/
loadAndPlay(track?: MediaTrack | null, fetchFunction?: (track: MediaTrack) => Promise<void>): Promise<void>;
/**
* Load HLS stream using HLS manager
* @private
*/
private loadHlsStream;
/**
* Start audio playback
*/
play(): Promise<void>;
/**
* Pause audio playback
*/
pause(): void;
/**
* Stop audio playback and reset position
*/
stop(): void;
/**
* Set audio volume (0-100)
* @param volume - Volume level between 0 and 100
*/
setVolume(volume: number): void;
/**
* Get current volume (0-100)
*/
getVolume(): number;
/**
* Set playback rate
* @param rate - Playback rate multiplier
*/
setPlaybackRate(rate: PlaybackRate): void;
/**
* Get current playback rate
*/
getPlaybackRate(): PlaybackRate;
/**
* Seek to specific time in seconds
* @param seconds - Time position in seconds
*/
seekToTime(seconds: number): void;
/**
* Seek by relative time offset
* @param seconds - Time offset in seconds (can be negative)
*/
seekByTime(seconds: number): void;
/**
* Mute audio
*/
mute(): void;
/**
* Unmute audio
*/
unmute(): void;
/**
* Check if audio is muted
*/
isMuted(): boolean;
/**
* Set the playback queue
* @param tracks - Array of media tracks
* @param playbackType - Type of queue playback (default, reverse, shuffle)
*/
setQueue(tracks: MediaTrack[], playbackType?: QueuePlaybackType): void;
/**
* Add tracks to the current queue
* @param tracks - Single track or array of tracks to add
*/
addToQueue(tracks: MediaTrack | MediaTrack[]): void;
/**
* Remove track from queue by ID
* @param trackId - ID of the track to remove
*/
removeFromQueue(trackId: string): void;
/**
* Clear the entire queue
*/
clearQueue(): void;
/**
* Get current queue
*/
getQueue(): MediaTrack[];
/**
* Get current track index
*/
getCurrentTrackIndex(): number;
/**
* Play next track in queue
*/
playNext(): Promise<void>;
/**
* Play previous track in queue
*/
playPrevious(): Promise<void>;
/**
* Play track at specific index
* @param index - Index of track to play
*/
playTrackAt(index: number): Promise<void>;
/**
* Enable or disable shuffle mode
* @param enabled - Whether to enable shuffle
*/
enableShuffle(enabled: boolean): void;
/**
* Check if shuffle is enabled
*/
isShuffleActive(): boolean;
/**
* Set loop mode
* @param mode - Loop mode (SINGLE, QUEUE, OFF)
*/
setLoopMode(mode: LoopMode): void;
/**
* Get current loop mode
*/
getLoopMode(): LoopMode;
/**
* Get available equalizer presets
*/
getEqualizerPresets(): EqualizerPresets;
/**
* Set equalizer preset
* @param presetName - Name of the preset to apply
*/
setEqualizerPreset(presetName: keyof EqualizerPresets): void;
/**
* Set custom equalizer gains
* @param gains - Array of gain values for each band
*/
setCustomEqualizer(gains: number[]): void;
/**
* Enable or disable bass boost
* @param enabled - Whether to enable bass boost
* @param boost - Boost amount (default: 6)
*/
enableBassBoost(enabled: boolean, boost?: number): void;
/**
* Get equalizer status
*/
getEqualizerState(): EqualizerStatus;
/**
* Subscribe to state changes
* @param callback - Function to call when state changes
* @returns Unsubscribe function
*/
onStateChange(callback: (state: PlayerState) => void): () => void;
/**
* Get current player state
*/
getCurrentState(): PlayerState;
/**
* Add event listener to audio element
* @param event - Event name
* @param callback - Event callback
*/
addEventListener(event: keyof HTMLMediaElementEventMap, callback: EventListener): void;
/**
* Remove event listener from audio element
* @param event - Event name
* @param callback - Event callback
*/
removeEventListener(event: keyof HTMLMediaElementEventMap, callback: EventListener): void;
/**
* Reset player to initial state
*/
reset(): Promise<void>;
/**
* Destroy player instance and cleanup resources
*/
destroy(): Promise<void>;
/**
* Get singleton instance
*/
static getInstance(): AudioHeadless;
/**
* Get audio element
*/
static getAudioElement(): HTMLAudioElement;
/**
* Legacy method name for backward compatibility
*/
static getAudioInstance(): HTMLAudioElement;
/**
* Update current track index based on track ID
* @private
*/
private updateCurrentTrackIndex;
/**
* Emit state change event
* @private
*/
private emitStateChange;
/**
* Emit queue change event
* @private
*/
private emitQueueChange;
}
declare const PLAYER_CONSTANTS: Readonly<{
REACT: InitMode;
VANILLA: InitMode;
DEVELOPMENT: "development";
PRODUCTION: "production";
}>;
declare const PLAYBACK_STATES: Readonly<{
BUFFERING: "buffering";
PLAYING: "playing";
PAUSED: "paused";
READY: "ready";
IDLE: "idle";
ENDED: "ended";
STALLED: "stalled";
ERROR: "error";
TRACK_CHANGE: "trackchanged";
DURATION_CHANGE: "durationchanged";
QUEUE_ENDED: "queueended";
}>;
declare const READY_STATES: Readonly<{
HAVE_NOTHING: 0;
HAVE_METADATA: 1;
HAVE_CURRENT_DATA: 2;
HAVE_FUTURE_DATA: 3;
HAVE_ENOUGH_DATA: 4;
}>;
declare const NETWORK_STATES: Readonly<{
NETWORK_EMPTY: 0;
NETWORK_IDLE: 1;
NETWORK_LOADING: 2;
NETWORK_NO_SOURCE: 3;
}>;
declare const ERROR_MESSAGES: ErrorMessageMap;
declare const EXTERNAL_URLS: Readonly<{
HLS_CDN: "https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.5.18/hls.min.js";
CAST_SDK: "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1";
}>;
declare const EQUALIZER_PRESETS: Readonly<{
FLAT: number[];
ACOUSTIC: number[];
BASS_BOOSTER: number[];
BASS_REDUCER: number[];
CLASSICAL: number[];
DEEP: number[];
ELECTRONIC: number[];
LATIN: number[];
LOUDNESS: number[];
LOUNGE: number[];
PIANO: number[];
POP: number[];
RNB: number[];
ROCK: number[];
SMALL_SPEAKERS: number[];
SPOKEN_WORD: number[];
TREBLE_BOOSTER: number[];
TREBLE_REDUCER: number[];
VOCAL_BOOSTER: number[];
}>;
declare const EQUALIZER_BANDS: {
type: BiquadFilterType;
frequency: number;
Q: number;
gain: number;
}[];
declare const AUDIO_EVENTS: Readonly<{
ABORT: "abort";
TIME_UPDATE: "timeupdate";
CAN_PLAY: "canplay";
CAN_PLAY_THROUGH: "canplaythrough";
DURATION_CHANGE: "durationchange";
ENDED: "ended";
EMPTIED: "emptied";
PLAYING: "playing";
WAITING: "waiting";
SEEKING: "seeking";
SEEKED: "seeked";
LOADED_META_DATA: "loadedmetadata";
LOADED_DATA: "loadeddata";
PLAY: "play";
PAUSE: "pause";
RATE_CHANGE: "ratechange";
VOLUME_CHANGE: "volumechange";
SUSPEND: "suspend";
STALLED: "stalled";
PROGRESS: "progress";
LOAD_START: "loadstart";
ERROR: "error";
TRACK_CHANGE: "trackchange";
QUEUE_ENDED: "queueended";
}>;
declare const HLS_EVENTS: Readonly<{
MEDIA_ATTACHING: "hlsMediaAttaching";
MEDIA_ATTACHED: "hlsMediaAttached";
MEDIA_DETACHING: "hlsMediaDetaching";
MEDIA_DETACHED: "hlsMediaDetached";
BUFFER_RESET: "hlsBufferReset";
BUFFER_CODECS: "hlsBufferCodecs";
BUFFER_CREATED: "hlsBufferCreated";
BUFFER_APPENDING: "hlsBufferAppending";
BUFFER_APPENDED: "hlsBufferAppended";
BUFFER_EOS: "hlsBufferEos";
BUFFER_FLUSHING: "hlsBufferFlushing";
BUFFER_FLUSHED: "hlsBufferFlushed";
MANIFEST_LOADING: "hlsManifestLoading";
MANIFEST_LOADED: "hlsManifestLoaded";
MANIFEST_PARSED: "hlsManifestParsed";
LEVEL_SWITCHING: "hlsLevelSwitching";
LEVEL_SWITCHED: "hlsLevelSwitched";
LEVEL_LOADING: "hlsLevelLoading";
LEVEL_LOADED: "hlsLevelLoaded";
LEVEL_UPDATED: "hlsLevelUpdated";
LEVEL_PTS_UPDATED: "hlsLevelPtsUpdated";
LEVELS_UPDATED: "hlsLevelsUpdated";
AUDIO_TRACKS_UPDATED: "hlsAudioTracksUpdated";
AUDIO_TRACK_SWITCHING: "hlsAudioTrackSwitching";
AUDIO_TRACK_SWITCHED: "hlsAudioTrackSwitched";
AUDIO_TRACK_LOADING: "hlsAudioTrackLoading";
AUDIO_TRACK_LOADED: "hlsAudioTrackLoaded";
SUBTITLE_TRACKS_UPDATED: "hlsSubtitleTracksUpdated";
SUBTITLE_TRACKS_CLEARED: "hlsSubtitleTracksCleared";
SUBTITLE_TRACK_SWITCH: "hlsSubtitleTrackSwitch";
SUBTITLE_TRACK_LOADING: "hlsSubtitleTrackLoading";
SUBTITLE_TRACK_LOADED: "hlsSubtitleTrackLoaded";
SUBTITLE_FRAG_PROCESSED: "hlsSubtitleFragProcessed";
CUES_PARSED: "hlsCuesParsed";
NON_NATIVE_TEXT_TRACKS_FOUND: "hlsNonNativeTextTracksFound";
INIT_PTS_FOUND: "hlsInitPtsFound";
FRAG_LOADING: "hlsFragLoading";
FRAG_LOAD_EMERGENCY_ABORTED: "hlsFragLoadEmergencyAborted";
FRAG_LOADED: "hlsFragLoaded";
FRAG_DECRYPTED: "hlsFragDecrypted";
FRAG_PARSING_INIT_SEGMENT: "hlsFragParsingInitSegment";
FRAG_PARSING_USERDATA: "hlsFragParsingUserdata";
FRAG_PARSING_METADATA: "hlsFragParsingMetadata";
FRAG_PARSED: "hlsFragParsed";
FRAG_BUFFERED: "hlsFragBuffered";
FRAG_CHANGED: "hlsFragChanged";
FPS_DROP: "hlsFpsDrop";
FPS_DROP_LEVEL_CAPPING: "hlsFpsDropLevelCapping";
ERROR: "hlsError";
DESTROYING: "hlsDestroying";
KEY_LOADING: "hlsKeyLoading";
KEY_LOADED: "hlsKeyLoaded";
LIVE_BACK_BUFFER_REACHED: "hlsLiveBackBufferReached";
BACK_BUFFER_REACHED: "hlsBackBufferReached";
}>;
declare const ERROR_EVENTS: Readonly<{
MEDIA_ERR_ABORTED: "Media playback was aborted";
MEDIA_ERR_NETWORK: "Network error occurred";
MEDIA_ERR_DECODE: "Media decoding error";
MEDIA_ERR_SRC_NOT_SUPPORTED: "Media source not supported";
}>;
declare const AUDIO_X_CONSTANTS: Readonly<{
REACT: InitMode;
VANILLA: InitMode;
DEVELOPMENT: "development";
PRODUCTION: "production";
}>;
declare const PLAYBACK_STATE: Readonly<{
BUFFERING: "buffering";
PLAYING: "playing";
PAUSED: "paused";
READY: "ready";
IDLE: "idle";
ENDED: "ended";
STALLED: "stalled";
ERROR: "error";
TRACK_CHANGE: "trackchanged";
DURATION_CHANGE: "durationchanged";
QUEUE_ENDED: "queueended";
}>;
declare const READY_STATE: Readonly<{
HAVE_NOTHING: 0;
HAVE_METADATA: 1;
HAVE_CURRENT_DATA: 2;
HAVE_FUTURE_DATA: 3;
HAVE_ENOUGH_DATA: 4;
}>;
declare const ERROR_MSG_MAP: ErrorMessageMap;
declare const URLS: Readonly<{
HLS_CDN: "https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.5.18/hls.min.js";
CAST_SDK: "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1";
}>;
type EventCallback = (data: any) => void;
/**
* Simple event emitter for player state management
*/
declare class EventEmitter {
private eventMap;
/**
* Subscribe to an event
* @param eventName - Name of the event
* @param callback - Function to call when event is emitted
* @returns Unsubscribe function
*/
subscribe(eventName: string, callback: EventCallback): () => void;
/**
* Unsubscribe from an event
* @param eventName - Name of the event
* @param callback - Function to remove
*/
unsubscribe(eventName: string, callback: EventCallback): void;
/**
* Emit an event to all subscribers
* @param eventName - Name of the event
* @param data - Data to pass to callbacks
*/
emit(eventName: string, data: any): void;
/**
* Remove all listeners for an event
* @param eventName - Name of the event
*/
removeAllListeners(eventName?: string): void;
/**
* Get the number of listeners for an event
* @param eventName - Name of the event
* @returns Number of listeners
*/
listenerCount(eventName: string): number;
/**
* Get all event names that have listeners
* @returns Array of event names
*/
eventNames(): string[];
}
/**
* Queue management utility for the audio player
*/
declare class QueueManager {
private queue;
/**
* Set the queue with specific playback type
* @param tracks - Array of tracks
* @param playbackType - Type of playback ordering
*/
setQueue(tracks: MediaTrack[], playbackType: QueuePlaybackType): void;
/**
* Get the current queue
* @returns Array of tracks
*/
getQueue(): MediaTrack[];
/**
* Add tracks to the queue
* @param tracks - Single track or array of tracks
*/
addToQueue(tracks: MediaTrack | MediaTrack[]): void;
/**
* Remove track from queue by ID
* @param trackId - ID of track to remove
* @returns True if track was removed
*/
removeFromQueue(trackId: string): boolean;
/**
* Clear the entire queue
*/
clearQueue(): void;
/**
* Get queue length
* @returns Number of tracks in queue
*/
getQueueLength(): number;
/**
* Get track at specific index
* @param index - Index of track
* @returns Track at index or undefined
*/
getTrackAt(index: number): MediaTrack | undefined;
/**
* Find track index by ID
* @param trackId - ID of track to find
* @returns Index of track or -1 if not found
*/
findTrackIndex(trackId: string): number;
/**
* Move track to new position
* @param fromIndex - Current index
* @param toIndex - Target index
* @returns True if move was successful
*/
moveTrack(fromIndex: number, toIndex: number): boolean;
/**
* Shuffle the queue using Fisher-Yates algorithm
* @param currentTrackId - Optional current track ID to keep at current position
* @returns Shuffled queue
*/
shuffleQueue(currentTrackId?: string): MediaTrack[];
/**
* Shuffle an array using Fisher-Yates algorithm
* @param array - Array to shuffle
* @returns New shuffled array
*/
private shuffleArray;
/**
* Get next track index with loop support
* @param currentIndex - Current track index
* @param loopMode - Current loop mode
* @returns Next track index or -1 if no next track
*/
getNextTrackIndex(currentIndex: number, loopMode: 'OFF' | 'SINGLE' | 'QUEUE'): number;
/**
* Get previous track index
* @param currentIndex - Current track index
* @returns Previous track index or -1 if no previous track
*/
getPreviousTrackIndex(currentIndex: number): number;
/**
* Check if queue is empty
* @returns True if queue is empty
*/
isEmpty(): boolean;
/**
* Get queue statistics
* @returns Object with queue statistics
*/
getQueueStats(): {
totalTracks: number;
totalDuration: number;
averageDuration: number;
};
}
/**
* Validation utilities for the audio player
*/
declare class ValidationUtils {
/**
* Check if an array is valid and has elements
* @param arr - Array to validate
* @returns True if array is valid and not empty
*/
static isValidArray(arr: any[]): boolean;
/**
* Check if a function is valid
* @param fn - Function to validate
* @returns True if function is valid
*/
static isValidFunction(fn: any): boolean;
/**
* Check if an object is valid and not null
* @param obj - Object to validate
* @returns True if object is valid
*/
static isValidObject(obj: any): boolean;
/**
* Check if a string is valid and not empty
* @param str - String to validate
* @returns True if string is valid
*/
static isValidString(str: any): boolean;
/**
* Check if a number is valid and finite
* @param num - Number to validate
* @returns True if number is valid
*/
static isValidNumber(num: any): boolean;
/**
* Check if a value is defined (not null or undefined)
* @param value - Value to check
* @returns True if value is defined
*/
static isDefined(value: any): boolean;
/**
* Validate volume range (0-100)
* @param volume - Volume value to validate
* @returns True if volume is in valid range
*/
static isValidVolume(volume: number): boolean;
/**
* Validate time value (non-negative)
* @param time - Time value to validate
* @returns True if time is valid
*/
static isValidTime(time: number): boolean;
}
/**
* Playback utility functions
*/
declare class PlaybackUtils {
private static playbackStartTime;
private static totalPlayTime;
/**
* Calculate actual played length for analytics
* @param audioElement - HTML audio element
* @param event - Event type that triggered calculation
*/
static calculateActualPlayedLength(audioElement: HTMLAudioElement, event: string): void;
/**
* Get total playback time
* @returns Total playback time in milliseconds
*/
static getTotalPlayTime(): number;
/**
* Reset playback time tracking
*/
static resetPlayTime(): void;
/**
* Handle loop playback mode
* @param loopMode - The loop mode to apply
*/
static handleLoopPlayback(loopMode: LoopMode): void;
/**
* Handle queue playback progression
*/
static handleQueuePlayback(): void;
/**
* Calculate playback progress percentage
* @param currentTime - Current playback time
* @param duration - Total track duration
* @returns Progress percentage (0-100)
*/
static calculateProgress(currentTime: number, duration: number): number;
/**
* Calculate remaining time
* @param currentTime - Current playback time
* @param duration - Total track duration
* @returns Remaining time in seconds
*/
static calculateRemainingTime(currentTime: number, duration: number): number;
/**
* Format time for display
* @param seconds - Time in seconds
* @returns Formatted time string (MM:SS or HH:MM:SS)
*/
static formatTime(seconds: number): string;
/**
* Get buffered duration
* @param audioElement - HTML audio element
* @returns Buffered duration in seconds
*/
static getBufferedDuration(audioElement: HTMLAudioElement): number;
/**
* Check if track can be played through without buffering
* @param audioElement - HTML audio element
* @returns True if track can play through
*/
static canPlayThrough(audioElement: HTMLAudioElement): boolean;
/**
* Get playback rate adjusted duration
* @param duration - Original duration
* @param playbackRate - Current playback rate
* @returns Adjusted duration
*/
static getAdjustedDuration(duration: number, playbackRate: number): number;
/**
* Smooth seek to prevent audio glitches
* @param audioElement - HTML audio element
* @param targetTime - Target time to seek to
* @param smooth - Whether to use smooth seeking
*/
static seekTo(audioElement: HTMLAudioElement, targetTime: number, smooth?: boolean): void;
}
/**
* Professional audio equalizer with 10-band EQ and bass boost
*/
declare class Equalizer {
private static equalizerInstance;
private audioContext;
private contextStatus;
private filterBands;
private bassBoostFilter;
private compressorNode;
private gainNode;
constructor();
/**
* Initialize AudioContext with browser compatibility
* @private
*/
private initializeAudioContext;
/**
* Add listener to resume AudioContext on user interaction
* @private
*/
private addContextResumeListener;
/**
* Initialize all audio processing nodes
* @param audioElement - The HTML audio element to connect
*/
initializeWithAudioElement(audioElement: HTMLAudioElement): void;
/**
* Connect all audio nodes in the processing chain
* @private
*/
private connectAudioChain;
/**
* Apply equalizer preset
* @param presetName - Name of the preset to apply
*/
setPreset(presetName: keyof EqualizerPresets): void;
/**
* Set custom equalizer gains
* @param gains - Array of gain values (-12 to +12 dB)
*/
setCustomEQ(gains: number[]): void;
/**
* Enable or disable bass boost
* @param enabled - Whether to enable bass boost
* @param boostAmount - Boost amount in dB (default: 6)
*/
setBassBoost(enabled: boolean, boostAmount?: number): void;
/**
* Set master volume
* @param volume - Volume level (0.0 to 1.0)
*/
setMasterVolume(volume: number): void;
/**
* Get current equalizer gains
* @returns Array of current gain values
*/
getCurrentGains(): number[];
/**
* Reset equalizer to flat response
*/
reset(): void;
/**
* Get equalizer status
* @returns Current equalizer status
*/
status(): EqualizerStatus;
/**
* Update compressor settings
* @param settings - Partial compressor settings
*/
setCompressorSettings(settings: Partial<{
threshold: number;
knee: number;
ratio: number;
attack: number;
release: number;
}>): void;
/**
* Get available presets
* @returns Object containing all available presets
*/
static getPresets(): EqualizerPresets;
/**
* Destroy equalizer and cleanup resources
*/
destroy(): Promise<void>;
}
export { AUDIO_EVENTS, AUDIO_X_CONSTANTS, type AudioEvents, AudioHeadless, AudioHeadless as AudioX, type CrossOriginValue, EQUALIZER_BANDS, EQUALIZER_PRESETS, ERROR_EVENTS, ERROR_MESSAGES, ERROR_MSG_MAP, EXTERNAL_URLS, Equalizer, type EqualizerBand, type EqualizerPresets, type EqualizerStatus, type ErrorEvents, type EventCallbackMap, EventEmitter, HLS_EVENTS, type HlsEventCallbackMap, type HlsEvents, type InitMode, type LoopMode, type MediaArtwork, type MediaTrack, NETWORK_STATES, type NetworkState, PLAYBACK_STATE, PLAYBACK_STATES, PLAYER_CONSTANTS, type PlaybackRate, PlaybackUtils, type PlayerConfiguration, type PlayerError, type PlayerState, type PreloadStrategy, QueueManager, type QueuePlaybackType, READY_STATE, READY_STATES, type ReadyState, URLS, ValidationUtils };