@siteed/expo-audio-studio
Version:
Comprehensive audio processing library for React Native and Expo with recording, analysis, visualization, and streaming capabilities across iOS, Android, and web
91 lines (84 loc) • 2.94 kB
text/typescript
import { LegacyEventEmitter, type EventSubscription } from 'expo-modules-core'
import {
TrimAudioOptions,
TrimAudioResult,
TrimProgressEvent,
} from './ExpoAudioStream.types'
import ExpoAudioStreamModule from './ExpoAudioStreamModule'
// Create a single emitter instance
const emitter = new LegacyEventEmitter(ExpoAudioStreamModule)
/**
* Trims an audio file based on the provided options.
*
* @experimental This API is experimental and not fully optimized for production use.
* Performance may vary based on file size and device capabilities.
* Future versions may include breaking changes.
*
* @param options Configuration options for the trimming operation
* @param progressCallback Optional callback to receive progress updates
* @returns Promise resolving to the trimmed audio file information, including processing time
*/
export async function trimAudio(
options: TrimAudioOptions,
progressCallback?: (event: TrimProgressEvent) => void
): Promise<TrimAudioResult> {
// Validation
if (!options.fileUri) {
throw new Error('fileUri is required')
}
const mode = options.mode ?? 'single'
if (mode === 'single') {
if (
options.startTimeMs === undefined &&
options.endTimeMs === undefined
) {
throw new Error(
'At least one of startTimeMs or endTimeMs must be provided in single mode'
)
}
} else if (mode === 'keep' || mode === 'remove') {
if (!options.ranges || options.ranges.length === 0) {
throw new Error(
'ranges must be provided and non-empty for keep or remove modes'
)
}
} else {
throw new Error(
`Invalid mode: ${mode}. Must be 'single', 'keep', or 'remove'`
)
}
// Set up progress event listener if callback is provided
let subscription: EventSubscription | undefined
if (progressCallback) {
subscription = emitter.addListener(
'TrimProgress',
(event: TrimProgressEvent) => {
progressCallback(event)
}
)
}
try {
const result = await ExpoAudioStreamModule.trimAudio(options)
return result
} finally {
if (subscription) {
subscription.remove()
}
}
}
/**
* Simplified version of trimAudio that returns only the URI of the trimmed file.
*
* @experimental This API is experimental and not fully optimized for production use.
* Performance may vary based on file size and device capabilities.
* Future versions may include breaking changes.
*
* @param options Configuration options for the trimming operation
* @returns Promise resolving to the URI of the trimmed audio file
*/
export async function trimAudioSimple(
options: TrimAudioOptions
): Promise<string> {
const result = await trimAudio(options)
return result.uri
}