@skylabs_technology/capacitor-mixer
v0.9.21
Published
Mix audio files and microphones on your device using a USB audio interface.
Readme
Mixer Plugin by Skylabs Technology
Android
Usage
Minimum target deployment: 28
to set this value you can add this to your ./android/variables.gradle
ext {
minSdkVersion = 28
}Permissions
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/custom_url_scheme" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="io.ionic.starter" />
<data android:mimeType="audio/*" />
</intent-filter><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>API
requestMixerPermissions()addListener(string, ...)addListener(string, ...)addListener(string, ...)playOrPause(...)stop(...)isPlaying(...)getCurrentVolume(...)getCurrentEq(...)initAudioFile(...)adjustVolume(...)adjustEq(...)setElapsedTimeEvent(...)getElapsedTime(...)getTotalTime(...)initMicInput(...)getInputChannelCount()initAudioSession(...)deinitAudioSession()checkAudioSessionState()resetPlugin()getAudioSessionPreferredInputPortType()destroyMicInput(...)destroyAudioFile(...)validateFileUri(...)startStream(...)stopStream()- Interfaces
- Type Aliases
- Enums
requestMixerPermissions()
requestMixerPermissions() => Promise<BaseResponse<null>>Requests permissions required by the mixer plugin
iOS: Permissions must be added to application in the Info Target Properties
Android: Permissions must be added to AndroidManifest.XML
See README for additional information on permissions
Returns: Promise<BaseResponse<null>>
addListener(string, ...)
addListener(eventName: string, listenerFunc: (response: AudioSessionEvent) => void) => Promise<PluginListenerHandle> & PluginListenerHandleAdds listener for AudioSession events
Ex:
Register Listener:
Mixer.addListener("myEventName", this.myListenerFunction.bind(this));
myListenerFunction(response: <a href="#audiosessionevent">AudioSessionEvent</a>) {
// handle event
}| Param | Type |
| ------------------ | -------------------------------------------------------------------------------------- |
| eventName | string |
| listenerFunc | (response: AudioSessionEvent) => void |
Returns: Promise<PluginListenerHandle> & PluginListenerHandle
addListener(string, ...)
addListener(eventName: string, listenerFunc: (response: MixerTimeEvent) => void) => Promise<PluginListenerHandle> & PluginListenerHandleAdds listener for audio track time update events
Ex:
Register Listener:
Mixer.addListener("myEventName", this.myListenerFunction.bind(this));
myListenerFunction(response: <a href="#mixertimeevent">MixerTimeEvent</a>) {
// handle event
}| Param | Type |
| ------------------ | -------------------------------------------------------------------------------------- |
| eventName | string |
| listenerFunc | (response: MixerTimeResponse) => void |
Returns: Promise<PluginListenerHandle> & PluginListenerHandle
addListener(string, ...)
addListener(eventName: string, listenerFunc: (response: VolumeMeterEvent) => void) => Promise<PluginListenerHandle> & PluginListenerHandleAdds listener for volume metering update events
Ex:
Register Listener:
Mixer.addListener("myEventName", this.myListenerFunction.bind(this));
myListenerFunction(response: <a href="#volumemeterevent">VolumeMeterEvent</a>) {
// handle event
}| Param | Type |
| ------------------ | ------------------------------------------------------------------------------------ |
| eventName | string |
| listenerFunc | (response: VolumeMeterEvent) => void |
Returns: Promise<PluginListenerHandle> & PluginListenerHandle
playOrPause(...)
playOrPause(request: BaseMixerRequest) => Promise<BaseResponse<PlaybackStateResponse>>Toggles playback and pause on an initialized audio file
| Param | Type |
| ------------- | ------------------------------------------------------------- |
| request | BaseMixerRequest |
Returns: Promise<BaseResponse<PlaybackStateResponse>>
stop(...)
stop(request: BaseMixerRequest) => Promise<BaseResponse<PlaybackStateResponse>>Stops playback on a playing audio file
| Param | Type |
| ------------- | ------------------------------------------------------------- |
| request | BaseMixerRequest |
Returns: Promise<BaseResponse<PlaybackStateResponse>>
isPlaying(...)
isPlaying(request: BaseMixerRequest) => Promise<BaseResponse<IsPlayingResponse>>A boolean that returns the playback state of initialized audio file
| Param | Type |
| ------------- | ------------------------------------------------------------- |
| request | BaseMixerRequest |
Returns: Promise<BaseResponse<IsPlayingResponse>>
getCurrentVolume(...)
getCurrentVolume(request: ChannelPropertyRequest) => Promise<BaseResponse<VolumeResponse>>Returns current volume of a channel as a number between 0 and 1
| Param | Type |
| ------------- | ------------------------------------------------------------------------- |
| request | ChannelPropertyRequest |
Returns: Promise<BaseResponse<VolumeResponse>>
getCurrentEq(...)
getCurrentEq(request: ChannelPropertyRequest) => Promise<BaseResponse<EqResponse>>Returns an object with numeric values for gain and frequency in bass, mid, and treble ranges
| Param | Type |
| ------------- | ------------------------------------------------------------------------- |
| request | ChannelPropertyRequest |
Returns: Promise<BaseResponse<EqResponse>>
initAudioFile(...)
initAudioFile(request: InitChannelRequest) => Promise<BaseResponse<InitResponse>>Returns AudioId string of initialized audio file
| Param | Type |
| ------------- | ----------------------------------------------------------------- |
| request | InitChannelRequest |
Returns: Promise<BaseResponse<InitResponse>>
adjustVolume(...)
adjustVolume(request: AdjustVolumeRequest) => Promise<BaseResponse<null>>Adjusts volume for a channel
| Param | Type |
| ------------- | ------------------------------------------------------------------- |
| request | AdjustVolumeRequest |
Returns: Promise<BaseResponse<null>>
adjustEq(...)
adjustEq(request: AdjustEqRequest) => Promise<BaseResponse<null>>Adjusts gain and frequency in bass, mid, and treble ranges for a channel
| Param | Type |
| ------------- | ----------------------------------------------------------- |
| request | AdjustEqRequest |
Returns: Promise<BaseResponse<null>>
setElapsedTimeEvent(...)
setElapsedTimeEvent(request: SetEventRequest) => Promise<BaseResponse<null>>Sets an elapsed time event name for a given audioId. To unset elapsedTimeEvent pass an empty string and this will stop the event from being triggered.
Only applicable for audio files
| Param | Type |
| ------------- | ----------------------------------------------------------- |
| request | SetEventRequest |
Returns: Promise<BaseResponse<null>>
getElapsedTime(...)
getElapsedTime(request: BaseMixerRequest) => Promise<BaseResponse<MixerTimeResponse>>Returns an object representing hours, minutes, seconds, and milliseconds elapsed
| Param | Type |
| ------------- | ------------------------------------------------------------- |
| request | BaseMixerRequest |
Returns: Promise<BaseResponse<MixerTimeResponse>>
getTotalTime(...)
getTotalTime(request: BaseMixerRequest) => Promise<BaseResponse<MixerTimeResponse>>Returns total time in an object of hours, minutes, seconds, and millisecond totals
| Param | Type |
| ------------- | ------------------------------------------------------------- |
| request | BaseMixerRequest |
Returns: Promise<BaseResponse<MixerTimeResponse>>
initMicInput(...)
initMicInput(request: InitChannelRequest) => Promise<BaseResponse<InitResponse>>Initializes microphone channel on mixer
Returns AudioId string of initialized microphone input
| Param | Type |
| ------------- | ----------------------------------------------------------------- |
| request | InitChannelRequest |
Returns: Promise<BaseResponse<InitResponse>>
getInputChannelCount()
getInputChannelCount() => Promise<BaseResponse<ChannelCountResponse>>Returns the channel count and name of the initialized audio device
Returns: Promise<BaseResponse<ChannelCountResponse>>
initAudioSession(...)
initAudioSession(request: InitAudioSessionRequest) => Promise<BaseResponse<InitAudioSessionResponse>>Initializes audio session with selected port type,
Returns a value describing the initialized port type for the audio session (usb, built-in, etc.)
| Param | Type |
| ------------- | --------------------------------------------------------------------------- |
| request | InitAudioSessionRequest |
Returns: Promise<BaseResponse<InitAudioSessionResponse>>
deinitAudioSession()
deinitAudioSession() => Promise<BaseResponse<null>>Cancels audio session and resets selected port. Use prior to changing port type
Returns: Promise<BaseResponse<null>>
checkAudioSessionState()
checkAudioSessionState() => Promise<BaseResponse<SessionStateResponse>>Checks the current state of the AudioSession.
Returns: Promise<BaseResponse<SessionStateResponse>>
resetPlugin()
resetPlugin() => Promise<BaseResponse<null>>Resets plugin state back to its initial state
<span style="color: 'red'">CAUTION: This will completely wipe everything you have initialized from the plugin!</span>
Returns: Promise<BaseResponse<null>>
getAudioSessionPreferredInputPortType()
getAudioSessionPreferredInputPortType() => Promise<BaseResponse<InitResponse>>Returns a value describing the initialized port type for the audio session (usb, built-in, etc.)
Returns: Promise<BaseResponse<InitResponse>>
destroyMicInput(...)
destroyMicInput(request: BaseMixerRequest) => Promise<BaseResponse<DestroyResponse>>De-initializes a mic input channel based on audioId
Note: Once destroyed, the channel cannot be recovered
| Param | Type | Description |
| ------------- | ------------------------------------------------------------- | ----------- |
| request | BaseMixerRequest | audioId |
Returns: Promise<BaseResponse<DestroyResponse>>
destroyAudioFile(...)
destroyAudioFile(request: BaseMixerRequest) => Promise<BaseResponse<DestroyResponse>>De-initializes an audio file channel based on audioId
Note: Once destroyed, the channel cannot be recovered
| Param | Type | Description |
| ------------- | ------------------------------------------------------------- | ----------- |
| request | BaseMixerRequest | audioId |
Returns: Promise<BaseResponse<DestroyResponse>>
validateFileUri(...)
validateFileUri(request: FileValidationRequest) => Promise<BaseResponse<FileValidationResponse>>Validates file path and returns true if valid, false if invalid
| Param | Type |
| ------------- | ----------------------------------------------------------------------- |
| request | FileValidationRequest |
Returns: Promise<BaseResponse<FileValidationResponse>>
startStream(...)
startStream(request: StreamRequest) => Promise<BaseResponse<null>>Starts a stream to a provided URL
| Param | Type |
| ------------- | ------------------------------------------------------- |
| request | StreamRequest |
Returns: Promise<BaseResponse<null>>
stopStream()
stopStream() => Promise<BaseResponse<null>>Stops a stream if one is currently active.
Returns: Promise<BaseResponse<null>>
Interfaces
BaseResponse
The response wrapper for all response objects
| Prop | Type | Description |
| ------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| status | ResponseStatus | Status of returned request. Ex: 'SUCCESS', 'ERROR' |
| message | string | Message that describes response Note: Can be used for user messages |
| data | T | Response data object field Ex: A MixerTimeResponse object |
PluginListenerHandle
| Prop | Type |
| ------------ | ----------------------------------------- |
| remove | () => Promise<void> |
AudioSessionEvent
Event response for handling audio session notifications
| Prop | Type | Description |
| ----------------- | ----------------------------------------------------------------------------- | ---------------------------- |
| handlerType | AudioSessionHandlerTypes | The event type that occurred |
MixerTimeResponse
Response representing HH:MM:SS.ms-formatted time
| Prop | Type | Description |
| ------------------ | ------------------- | -------------------- |
| milliSeconds | number | ms in formatted time |
| seconds | number | SS in formatted time |
| minutes | number | MM in formatted time |
| hours | number | HH in formatted time |
VolumeMeterEvent
Event response for handling current volume level
| Prop | Type | Description |
| ---------------- | ------------------- | ----------------------------------------------- |
| meterLevel | number | Calculated amplitude in dB - Range: -80 to 0 dB |
PlaybackStateResponse
Response that returns PlayerState
| Prop | Type | Description |
| ----------- | --------------------------------------------------- | ---------------------------------- |
| state | PlayerState | Represents the state of the player |
BaseMixerRequest
Base class for all mixer requests, consists of audioId only
| Prop | Type | Description |
| ------------- | ------------------- | ------------------------------------------------------------------ |
| audioId | string | A string identifying the audio file or microphone channel instance |
IsPlayingResponse
Response for tracking player state as a boolean
| Prop | Type | Description |
| ----------- | -------------------- | ----------------------------- |
| value | boolean | Value of tracked player state |
VolumeResponse
Response for tracking channel volume
| Prop | Type | Description |
| ------------ | ------------------- | ------------------------------- |
| volume | number | Value of tracked channel volume |
ChannelPropertyRequest
Request to get info about channel properties such as current volume, EQ, etc.
| Prop | Type | Description |
| --------------- | ----------------------------------------------- | ----------------------------------------------------- |
| inputType | InputType | Type of input on which properties are being requested |
EqResponse
Response for tracking channel EQ
| Prop | Type | Description |
| --------------------- | ------------------- | --------------------------------------------------------------- |
| bassGain | number | Bass gain for channel - Range: -36 to +15 dB |
| bassFrequency | number | Bass frequency for channel - Suggested range: 20Hz to 499Hz |
| midGain | number | Mid gain for channel - Range: -36 to +15 dB |
| midFrequency | number | Mid frequency for channel - Suggested range: 500Hz to 1499Hz |
| trebleGain | number | Treble gain for channel - Range: -36 to +15 dB |
| trebleFrequency | number | Treble frequency for channel - Suggested range: 1.5kHz to 20kHz |
InitResponse
Response for initialization of channel
| Prop | Type | Description |
| ----------- | ------------------- | --------------------------- |
| value | string | Initialized channel audioId |
InitChannelRequest
Request used to initialize a channel on the mixer
| Prop | Type | Description |
| -------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| filePath | string | A string identifying the path to the audio file on device. Unused if initializing microphone channel |
| elapsedTimeEventName | string | A string identifying the elapsed time event name. This will automatically set the event and setElapsedTimeEvent is not needed. Unused if initializing microphone channel |
| channelNumber | number | The channel number being initialized for microphone. Starts at 0. Unused if initializing audio file |
| bassGain | number | Optional bass gain setting for initialization: -36dB to +15 dB Default: 0dB |
| bassFrequency | number | Optional init eq setting for bass EQ band iOS Default: 115Hz Android Default: 200Hz |
| midGain | number | Optional mid gain setting for initialization: -36dB to +15 dB Default: 0dB |
| midFrequency | number | Optional init setting for mid EQ band iOS Default: 500Hz Android Default: 1499Hz |
| trebleGain | number | Optional treble gain setting for initialization: -36dB to +15 dB Default: 0dB |
| trebleFrequency | number | Optional init eq setting for treble EQ band iOS Default: 1.5kHz Android Default: 20kHz |
| volume | number | Optional init setting for volume Default: 1 Range: 0 - 1 |
| channelListenerName | string | Required name used to set listener for volume metering Subscribed event returns VolumeMeterEvent Note: if empty string is passed, metering will be disabled on channel |
AdjustVolumeRequest
For mixer requests manipulating volume level
| Prop | Type | Description |
| --------------- | ----------------------------------------------- | ---------------------------------------------------------- |
| volume | number | A number between 0 and 1 specifying volume level being set |
| inputType | InputType | Type of input on which volume is being adjusted |
AdjustEqRequest
For mixer requests manipulating EQ
| Prop | Type | Description |
| --------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| eqType | EqType | Identifies EQ band to adjust: Bass, Mid, Treble |
| gain | number | A number between -36dB and +15dB identifying EQ band gain |
| frequency | number | A number identifying cutoff/central frequency for EQ band Bass: - iOS implemented as a low shelf - Android implemented as a high pass filter Mid: - implemented as a parametric 'bump' Treble: - iOS implemented as a high shelf - Android implemented as a low pass filter |
| inputType | InputType | Type of input on which EQ is being adjusted |
SetEventRequest
Request to set an event listener
| Prop | Type | Description |
| --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| eventName | string | The name of the event that will be subscribed to Subscribed event returns MixerTimeEvent |
ChannelCountResponse
Response for channel count of requested audio port
| Prop | Type | Description |
| ------------------ | ------------------- | ---------------------------------------------- |
| channelCount | number | Number of channels found |
| deviceName | string | Name of the device at the requested audio port |
InitAudioSessionResponse
Response for initalizing audio session
| Prop | Type | Description |
| ------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------ |
| preferredInputPortType | AudioSessionPortType | Type found when initializing audio session |
| preferredInputPortName | string | Device name found when initializing audio session |
| preferredIOBufferDuration | number | iOS only Preferred buffer duration when initializing audio session |
InitAudioSessionRequest
Request to initialize an audio session
| Prop | Type | Description |
| ------------------------------ | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| inputPortType | AudioSessionPortType | An enum describing input hardware device to be used |
| ioBufferDuration | number | iOS only The preferred duration of the input buffer (0.05 recommended as a starting point, change may be observed as output latency) |
| audioSessionListenerName | string | The name of the audio session event that will be subscribed to. Subscribed event returns AudioSessionEvent |
SessionStateResponse
Response that returns PlayerState
| Prop | Type | Description |
| ----------- | -------------------- | ---------------------------------- |
| state | boolean | Represents the state of the player |
DestroyResponse
Response for destroying a channel
| Prop | Type | Description |
| -------------------------- | ------------------- | ------------------------------------------------------------------------------------------ |
| listenerName | string | The name of the volume metering event Note: If no event is found, empty string is returned |
| elapsedTimeEventName | string | The name of the elapsed time event Note: If no event is found, empty string is returned |
FileValidationResponse
Response for validating file path
| Prop | Type | Description |
| ----------------- | -------------------- | ----------------------------------------------------------- |
| isFileValid | boolean | True if file path is found, False if file path is not found |
| filePath | string | File path that was checked. |
FileValidationRequest
Request to validate a file path.
| Prop | Type | Description |
| -------------- | ------------------- | ------------------------------------- |
| filePath | string | The file path that will be validated. |
StreamRequest
Request to stream audio to provided url
| Prop | Type |
| --------------- | ------------------- |
| streamUrl | string |
Type Aliases
MixerTimeEvent
Event response for handling current elapsed time
MixerTimeResponse
PlayerState
Possible states of player
"play" | "pause" | "stop" | "not implemented"
Enums
ResponseStatus
| Members | Value |
| ------------- | ---------------------- |
| SUCCESS | "success" |
| ERROR | "error" |
AudioSessionHandlerTypes
| Members | Value | Description |
| ------------------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| INTERRUPT_BEGAN | "INTERRUPT_BEGAN" | Invoked when another audio session has started This can cause your audio to be 'ducked', or silenced with the audio session |
| INTERRUPT_ENDED | "INTERRUPT_ENDED" | Invoked when another audio session has ended Your audio session should resume |
| ROUTE_DEVICE_DISCONNECTED | "ROUTE_DEVICE_DISCONNECTED" | Invoked when the device you're currently connected to is disconnected from the audio session |
| ROUTE_DEVICE_RECONNECTED | "ROUTE_DEVICE_RECONNECTED" | Invoked when previously-used device is reconnected to the audio session |
| ROUTE_NEW_DEVICE_FOUND | "ROUTE_NEW_DEVICE_FOUND" | Invoked when previously-UNUSED device is connected to the audio session |
InputType
| Members | Value |
| ---------- | ------------------- |
| MIC | "mic" |
| FILE | "file" |
EqType
| Members | Value |
| ------------ | --------------------- |
| BASS | "bass" |
| MID | "mid" |
| TREBLE | "treble" |
AudioSessionPortType
| Members | Value | Description |
| ----------------------- | ------------------------------ | ----------- |
| HDMI | "hdmi" | |
| AIRPLAY | "airplay" | iOS only |
| BLUETOOTH_A2DP | "bluetoothA2DP" | |
| BLUETOOTH_HFP | "bluetoothHFP" | |
| BLUETOOTH_LE | "bluetoothLE" | iOS only |
| BUILT_IN_MIC | "builtInMic" | |
| HEADSET_MIC_WIRED | "headsetMicWired" | iOS only |
| HEADSET_MIC_USB | "headsetMicUsb" | |
| LINE_IN | "lineIn" | |
| THUNDERBOLT | "thunderbolt" | iOS only |
| USB_AUDIO | "usbAudio" | |
| VIRTUAL | "virtual" | |
