naudiodon
Version:
Node Stream bindings for PortAudio.
138 lines (128 loc) • 6.32 kB
TypeScript
/**
* The type used to specify one or more sample formats. Each value indicates
* a possible format for sound data passed to and from the stream callback
* The standard formats SampleFormatFloat32, SampleFormat8Bit, SampleFormat16Bit,
* SampleFormat24Bit and SampleFormat32Bit are usually implemented by all implementations.
* The floating point representation (Float32) uses +1.0 and -1.0 as the
* maximum and minimum respectively.
*/
export const SampleFormatFloat32 = 1;
export const SampleFormat8Bit = 8;
export const SampleFormat16Bit = 16;
export const SampleFormat24Bit = 24;
export const SampleFormat32Bit = 32;
/** The details returned from getDevices for a particular device */
export interface DeviceInfo {
readonly id: number
readonly name: string
readonly maxInputChannels: number
readonly maxOutputChannels: number
readonly defaultSampleRate: number
/** Default latency values for interactive performance. */
readonly defaultLowInputLatency: number
readonly defaultLowOutputLatency: number
/** Default latency values for robust non-interactive applications (eg. playing sound files). */
readonly defaultHighInputLatency: number
readonly defaultHighOutputLatency: number
readonly hostAPIName: string
}
/** Get list of supported devices */
export function getDevices(): DeviceInfo[]
/** The details returned from getHostAPIs for a particular device */
export interface HostInfo {
readonly id: number
readonly name: string
/** Identifiers for each supported host API. The values are guaranteed to be
* unique and to never change, thus allowing code to be written that
* conditionally uses host API specific extensions.
* New type ids will be allocated when support for a host API reaches
* "public alpha" status, prior to that developers should use the InDevelopment type id.
*/
readonly type: 'InDevelopment' | 'DirectSound' | 'MME' | 'ASIO' | 'SoundManager' | 'CoreAudio' |
'OSS' | 'ALSA' | 'AL' | 'BeOS' | 'WDMKS' | 'JACK' | 'WASAPI' | 'AudioScienceHPI' | 'Unknown'
/** The number of devices belonging to this host API*/
readonly deviceCount: number
/**
* The default input device for this host API. The value will be a
* device index ranging from 0 to deviceCount - 1
*/
readonly defaultInput: number
/**
* The default output device for this host API. The value will be a
* device index ranging from 0 to deviceCount - 1
*/
readonly defaultOutput: number
}
/** Get information about host APIs */
export function getHostAPIs(): {
/**
* The index of the default host API. The default host API will be the lowest common
* denominator host API on the current platform and is unlikely to provide the best performance.
* Will be a non-negative value ranging from 0 to (HostAPIs.length-1) indicating the default
* host API index or a negative value if PortAudio is not initialized or an error is encountered.
*/
defaultHostAPI: number
/** Array of HostInfo objects containing information about a specific host API. */
HostAPIs: HostInfo[]
}
export interface AudioOptions {
/** Use -1 or omit the deviceId to select the default device. */
deviceId?: number
/** The required sampleRate. For full-duplex streams it must be the same sample rate for both input and output. */
sampleRate?: number
/** The number of channels of sound to be delivered to the stream callback
* It can range from 1 to the value of maxInputChannels from
* DeviceInfo for the device specified by the device parameter.
*/
channelCount?: number
sampleFormat?: 1 | 8 | 16 | 24 | 32
/** The number of blocks to buffer for a blocking. */
maxQueue?: number
/**
* The number of frames passed to the stream callback function,
* or the preferred block granularity for a blocking read/write stream.
* The special value 0 may be used to request that
* the stream callback will receive an optimal (and possibly varying) number of
* frames based on host requirements and the requested latency settings.
* Note: With some host APIs, the use of non-zero framesPerBuffer for a callback
* stream may introduce an additional layer of buffering which could introduce
* additional latency. PortAudio guarantees that the additional latency
* will be kept to the theoretical minimum however, it is strongly recommended
* that a non-zero framesPerBuffer value only be used when your algorithm
* requires a fixed number of frames per stream callback.
*/
framesPerBuffer?: number
/** The amount of data potentially buffered in streaming mode in bytes. */
highwaterMark?: number
/** Close the stream if an audio error is detected, if set false then just log the error. */
closeOnError?: boolean
}
export interface IoStream {
/**
* Start streaming to and/or from the device.
* @returns void when the stream has started.
*/
start(): void
/**
* Quit the stream. Waits to process all pending bytes.
* The optional callback will execute when the quit has completed.
*/
quit(callback?: () => void): void
/**
* Abort the stream. Throws away any pending bytes.
* The optional callback will execute when the abort has completed.
*/
abort(callback?: () => void): void
}
/** Interface classes returned from AudioIO creation, dependant on which options are provided. */
export interface IoStreamRead extends IoStream, NodeJS.ReadableStream {}
export interface IoStreamWrite extends IoStream, NodeJS.WritableStream {}
export interface IoStreamDuplex extends IoStream, NodeJS.ReadableStream, NodeJS.WritableStream {}
/**
* Create an AudioIO object. If both inOptions and outOptions are provided, a duplex stream is created.
* When just inOptions are provided, a readStream is created. When just outOptions, a writeStream is created.
* @param options object containing inOptions for readStreams, outOptions for writeStreams or both for duplex streams.
*/
export function AudioIO(options: { inOptions: AudioOptions }): IoStreamRead
export function AudioIO(options: { outOptions: AudioOptions }): IoStreamWrite
export function AudioIO(options: { inOptions: AudioOptions, outOptions: AudioOptions }): IoStreamDuplex