Package Exports
- capacitor-audio-engine
- capacitor-audio-engine/package.json
Readme
Capacitor Audio Engine 🎙️
A powerful Capacitor plugin for audio recording and playback on mobile devices. This plugin provides high-quality audio recording with real-time monitoring and flexible playback controls for iOS and Android platforms.
💡 Note: This plugin is designed for native mobile platforms (Android and iOS). Web platform is not supported.
📋 Overview of Methods and Types
Methods
| Method Name | Description |
|---|---|
checkPermissions |
Check all audio-related permissions. |
checkPermissionMicrophone |
Check microphone permission. |
checkPermissionNotifications |
Check notification permission. |
requestPermissions |
Request all permissions with optional configuration. |
requestPermissionMicrophone |
Request microphone permission only. |
requestPermissionNotifications |
Request notification permission only. |
openSettings |
Open device settings for manual permission management. |
startRecording |
Start recording with specified output path. |
stopRecording |
Stop recording and get file information. |
pauseRecording |
Pause the current recording. |
resumeRecording |
Resume a paused recording. |
resetRecording |
Reset the current recording session without finalizing. |
getRecordingStatus |
Get current recording status. |
preloadTracks |
Preload audio tracks for optimized playback. |
playAudio |
Play current track or specific track by URL. |
pauseAudio |
Pause current track or specific track. |
resumeAudio |
Resume paused playback. |
stopAudio |
Stop playback and reset to beginning. |
seekAudio |
Seek to specific position in track. |
skipToNext |
Skip to next track in playlist. |
skipToPrevious |
Skip to previous track in playlist. |
skipToIndex |
Jump to specific track by index. |
getPlaybackInfo |
Get current playback information. |
configureWaveform |
Configure real-time audio level monitoring. |
destroyWaveform |
Clean up waveform resources. |
trimAudio |
Trim audio file to specific time range. |
getAudioInfo |
Get detailed audio file information. |
addListener |
Listen for recording and playback events. |
removeAllListeners |
Remove all event listeners. |
Interfaces, Enums, and Types
| Name | Description |
|---|---|
AudioFileInfo |
Complete information about an audio file. |
PermissionStatusResults |
Simplified permission status. |
PermissionStatus |
Enum for detailed permission statuses. |
AudioPermissionType |
Enum for audio permission types. |
RecordingStatusInfo |
Current recording state. |
RecordingStatus |
Type for recording statuses. |
PlaybackInfo |
Current playback state. |
PlaybackStatus |
Type for playback statuses. |
WaveLevelConfiguration |
Waveform monitoring configuration. |
WaveLevelEmissionInterval |
Enum for waveform emission intervals. |
PermissionRequestOptions |
Options for requesting permissions. |
PreloadTracksOptions |
Options for preloading audio tracks. |
PreloadTracksResult |
Result of preloading tracks. |
PreloadedTrackInfo |
Information about preloaded tracks. |
PlayAudioOptions |
Options for playing audio. |
PauseAudioOptions |
Options for pausing audio. |
ResumeAudioOptions |
Options for resuming audio. |
StopAudioOptions |
Options for stopping audio. |
SeekOptions |
Options for seeking audio. |
SkipToIndexOptions |
Options for skipping to a specific track index. |
WaveLevelConfigurationResult |
Result of waveform configuration. |
TrimAudioOptions |
Options for trimming audio. |
DurationChangeData |
Event data for duration changes. |
WaveLevelData |
Event data for waveform levels. |
ErrorEventData |
Event data for errors. |
PermissionStatusChangedData |
Event data for permission status changes. |
RecordingStatusChangedData |
Event data for recording status changes. |
PlaybackStartedData |
Event data for playback started. |
PlaybackPausedData |
Event data for playback paused. |
PlaybackStoppedData |
Event data for playback stopped. |
PlaybackErrorData |
Event data for playback errors. |
PlaybackProgressData |
Event data for playback progress. |
🚀 Installation
Prerequisites
- Capacitor 7.0.0+
- Android: Minimum API 29 (Android 10) or higher
- iOS: Minimum iOS 13.0 or higher
Setup
- Install the plugin:
npm install capacitor-audio-engine
# or
pnpm add capacitor-audio-engine
# or
yarn add capacitor-audio-engine- Sync your project:
npx cap sync- Add required permissions:
iOS
Add these to your Info.plist:
<key>NSMicrophoneUsageDescription</key>
<string>We need access to your microphone to record audio</string>Android
Add this to your AndroidManifest.xml:
<uses-permission android:name="android.permission.RECORD_AUDIO" />ℹ️ AndroidX Compatibility: This package is fully AndroidX-compatible and does not require Jetifier. If you see Jetifier warnings during installation, they can be safely ignored. The package uses modern AndroidX libraries and doesn't depend on legacy Android support libraries.
📖 API Documentation
Core Interfaces
AudioFileInfo
Complete information about an audio file:
interface AudioFileInfo {
path: string; // File system path
webPath: string; // Web accessible path
uri: string; // URI for file access
mimeType: string; // MIME type (audio/m4a)
size: number; // File size in bytes
duration: number; // Duration in seconds
sampleRate: number; // Sample rate in Hz
channels: number; // Number of audio channels
bitrate: number; // Bitrate in bps
createdAt: number; // Creation timestamp
filename: string; // File name
}PermissionStatusResults
Simplified permission status:
interface PermissionStatusResults {
granted: boolean; // Overall permission status
status: PermissionStatus; // Detailed status
}
enum PermissionStatus {
GRANTED = 'granted',
DENIED = 'denied',
DENIED_PERMANENTLY = 'denied_permanently',
NOT_DETERMINED = 'not_determined',
LIMITED = 'limited',
RESTRICTED = 'restricted',
REQUESTING = 'requesting',
UNSUPPORTED = 'unsupported',
}
enum AudioPermissionType {
MICROPHONE = 'microphone',
NOTIFICATIONS = 'notifications',
}RecordingStatusInfo
Current recording state:
interface RecordingStatusInfo {
status: RecordingStatus;
duration: number;
path?: string;
}
type RecordingStatus = 'recording' | 'paused' | 'stopped' | 'idle';PlaybackInfo
Current playback state:
interface PlaybackInfo {
currentTrack: {
id: string;
url: string;
} | null;
currentIndex: number;
currentPosition: number;
duration: number;
isPlaying: boolean;
}
type PlaybackStatus = 'idle' | 'loading' | 'playing' | 'paused' | 'stopped';WaveLevelConfiguration
Waveform monitoring configuration:
interface WaveLevelConfiguration {
emissionInterval?: WaveLevelEmissionInterval | number;
}
enum WaveLevelEmissionInterval {
REALTIME = 50, // 50ms - real-time
VERY_FAST = 100, // 100ms - very fast
FAST = 200, // 200ms - fast
MEDIUM = 500, // 500ms - medium
DEFAULT = 1000, // 1000ms - default
}Methods
Permission Management
checkPermissions()
Check all audio-related permissions:
checkPermissions(): Promise<PermissionStatusResults>checkPermissionMicrophone()
Check microphone permission:
checkPermissionMicrophone(): Promise<PermissionStatusResults>checkPermissionNotifications()
Check notification permission:
checkPermissionNotifications(): Promise<PermissionStatusResults>requestPermissions(options?)
Request all permissions with optional configuration:
requestPermissions(options?: PermissionRequestOptions): Promise<PermissionStatusResults>
interface PermissionRequestOptions {
showRationale?: boolean; // Show rationale before requesting (Android)
rationaleMessage?: string; // Custom rationale message
forceRequest?: boolean; // Force request even if denied permanently
}requestPermissionMicrophone(options?)
Request microphone permission only:
requestPermissionMicrophone(options?: PermissionRequestOptions): Promise<PermissionStatusResults>
interface PermissionRequestOptions {
showRationale?: boolean; // Show rationale before requesting (Android)
rationaleMessage?: string; // Custom rationale message
forceRequest?: boolean; // Force request even if denied permanently
}Example:
// Request only microphone permission
const micResult = await CapacitorAudioEngine.requestPermissionMicrophone();
if (micResult.granted) {
console.log('Microphone permission granted');
} else {
console.log('Microphone permission status:', micResult.status);
}requestPermissionNotifications(options?)
Request notification permission only:
requestPermissionNotifications(options?: PermissionRequestOptions): Promise<PermissionStatusResults>
interface PermissionRequestOptions {
showRationale?: boolean; // Show rationale before requesting (Android)
rationaleMessage?: string; // Custom rationale message
forceRequest?: boolean; // Force request even if denied permanently
}Example:
// Request only notification permission
const notifResult = await CapacitorAudioEngine.requestPermissionNotifications();
if (notifResult.granted) {
console.log('Notification permission granted');
} else {
console.log('Notification permission status:', notifResult.status);
}openSettings()
Open device settings for manual permission management:
openSettings(): Promise<void>Recording Control
startRecording(options)
Start recording with specified output path:
startRecording(options: { path: string }): Promise<void>stopRecording()
Stop recording and get file information:
stopRecording(): Promise<AudioFileInfo>pauseRecording()
Pause the current recording:
pauseRecording(): Promise<void>resumeRecording()
Resume a paused recording:
resumeRecording(): Promise<void>resetRecording()
Reset the current recording session without finalizing:
resetRecording(): Promise<void>getRecordingStatus()
Get current recording status:
getRecordingStatus(): Promise<RecordingStatusInfo>Playback Control
preloadTracks(options)
Preload audio tracks for optimized playback:
preloadTracks(options: PreloadTracksOptions): Promise<PreloadTracksResult>
interface PreloadTracksOptions {
tracks: string[]; // Array of track URLs or file paths
}
interface PreloadTracksResult {
tracks: PreloadedTrackInfo[];
}
interface PreloadedTrackInfo {
url: string;
loaded: boolean;
mimeType?: string;
duration?: number;
size?: number;
}playAudio(options?)
Play current track or specific track by URL:
playAudio(options?: PlayAudioOptions): Promise<void>
interface PlayAudioOptions {
url?: string; // Optional URL to play specific track
}pauseAudio(options?)
Pause current track or specific track:
pauseAudio(options?: PauseAudioOptions): Promise<void>
interface PauseAudioOptions {
url?: string;
}resumeAudio(options?)
Resume paused playback:
resumeAudio(options?: ResumeAudioOptions): Promise<void>
interface ResumeAudioOptions {
url?: string;
}stopAudio(options?)
Stop playback and reset to beginning:
stopAudio(options?: StopAudioOptions): Promise<void>
interface StopAudioOptions {
url?: string;
}seekAudio(options)
Seek to specific position in track:
seekAudio(options: SeekOptions): Promise<void>
interface SeekOptions {
seconds: number;
url?: string;
}skipToNext()
Skip to next track in playlist:
skipToNext(): Promise<void>skipToPrevious()
Skip to previous track in playlist:
skipToPrevious(): Promise<void>skipToIndex(options)
Jump to specific track by index:
skipToIndex(options: SkipToIndexOptions): Promise<void>
interface SkipToIndexOptions {
index: number;
}getPlaybackInfo()
Get current playback information:
getPlaybackInfo(): Promise<PlaybackInfo>Waveform Monitoring
configureWaveform(options?)
Configure real-time audio level monitoring:
configureWaveform(options?: { EmissionInterval?: number }): Promise<WaveLevelConfigurationResult>
interface WaveLevelConfigurationResult {
success: boolean;
configuration: {
emissionInterval: number;
};
}destroyWaveform()
Clean up waveform resources:
destroyWaveform(): Promise<void>Audio Processing
trimAudio(options)
Trim audio file to specific time range:
trimAudio(options: TrimAudioOptions): Promise<AudioFileInfo>
interface TrimAudioOptions {
uri: string; // URI or file path
startTime: number; // Start time in seconds
endTime: number; // End time in seconds
}getAudioInfo(options)
Get detailed audio file information:
getAudioInfo(options: { uri: string }): Promise<AudioFileInfo>Event Handling
addListener(eventName, callback)
Listen for recording and playback events:
addListener<T extends AudioEventName>(
eventName: T,
callback: (event: AudioEventMap[T]) => void
): Promise<PluginListenerHandle>Recording Events:
durationChange- Duration updates during recordingerror- Recording errorswaveLevel- Real-time audio level data (requiresconfigureWaveform)waveLevelInit- Waveform initialization statuswaveLevelDestroy- Waveform cleanup statuswaveLevelError- Waveform errorspermissionStatusChanged- Permission status changesrecordingStatusChanged- Recording status changes
Playback Events:
playbackStarted- Playback startedplaybackPaused- Playback pausedplaybackStopped- Playback stoppedplaybackError- Playback errorsplaybackProgress- Progress updates during playback
Event Data Structures:
interface DurationChangeData {
duration: number;
}
interface WaveLevelData {
level: number; // Normalized 0.0-1.0
timestamp: number;
}
interface ErrorEventData {
message: string;
code?: string | number;
details?: any;
}
interface PermissionStatusChangedData {
permissionType: AudioPermissionType;
status: PermissionStatus;
previousStatus?: PermissionStatus;
message?: string;
}
interface RecordingStatusChangedData {
status: RecordingStatus;
}
interface PlaybackStartedData {
trackId: string;
url: string;
}
interface PlaybackPausedData {
trackId: string;
url: string;
position: number;
}
interface PlaybackStoppedData {
trackId: string;
url: string;
}
interface PlaybackErrorData {
trackId: string;
message: string;
}
interface PlaybackProgressData {
trackId: string;
url: string;
currentPosition: number;
duration: number;
isPlaying: boolean;
}removeAllListeners()
Remove all event listeners:
removeAllListeners(): Promise<void>🛠️ Technical Details
Platform-Specific Implementations
Android:
- Recording: MediaRecorder with AAC codec
- Playback: MediaPlayer for individual track management
- Format: M4A/AAC (audio/m4a)
- Sample Rate: 48kHz, Mono, 128kbps
iOS:
- Recording: AVAudioRecorder with AAC codec
- Playback: AVPlayer for individual track management
- Format: M4A/AAC (audio/m4a)
- Sample Rate: 48kHz, Mono, 128kbps
Web:
- Not supported - designed for native mobile platforms only
🤝 Contributing
We love contributions! Whether it's fixing bugs, adding features, or improving docs, your help makes this plugin better for everyone. Here's how to help:
- Fork the repo
- Create your feature branch (
git checkout -b feature/feature-name) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/feature-name) - Open a Pull Request
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
📞 Need Help?
Found a bug? Have a feature request? Just want to chat? Open an issue on GitHub and we'll help you out!