diff options
| author | Gary Scavone <gary@music.mcgill.ca> | 2013-10-09 23:49:32 +0200 |
|---|---|---|
| committer | Stephen Sinclair <sinclair@music.mcgill.ca> | 2013-10-10 01:15:42 +0200 |
| commit | fdc3f15bec57b30fae67f65270392ba7a86680b8 (patch) | |
| tree | c40a558b21ec18df4a4fd2613ead8f54dd3c4156 /RtAudio.h | |
| parent | 2b55be781872498a3b4c6cde60be4c2f69ec7eb4 (diff) | |
Version 3.0.2
Diffstat (limited to 'RtAudio.h')
| -rw-r--r-- | RtAudio.h | 116 |
1 files changed, 107 insertions, 9 deletions
@@ -9,8 +9,8 @@ RtAudio WWW site: http://music.mcgill.ca/~gary/rtaudio/ - RtAudio: a realtime audio i/o C++ class - Copyright (c) 2001-2004 Gary P. Scavone + RtAudio: realtime audio i/o C++ classes + Copyright (c) 2001-2005 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files @@ -37,7 +37,7 @@ */ /************************************************************************/ -// RtAudio: Version 3.0.1, 22 March 2004 +// RtAudio: Version 3.0.2 (14 October 2005) #ifndef __RTAUDIO_H #define __RTAUDIO_H @@ -127,17 +127,27 @@ class RtApi { public: + enum StreamState { + STREAM_STOPPED, + STREAM_RUNNING + }; + RtApi(); virtual ~RtApi(); void openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers ); + void openStream( int outputDevice, int outputChannels, + int inputDevice, int inputChannels, + RtAudioFormat format, int sampleRate, + int *bufferSize, int *numberOfBuffers ); virtual void setStreamCallback( RtAudioCallback callback, void *userData ) = 0; virtual void cancelStreamCallback() = 0; int getDeviceCount(void); RtAudioDeviceInfo getDeviceInfo( int device ); char * const getStreamBuffer(); + RtApi::StreamState getStreamState() const; virtual void tickStream() = 0; virtual void closeStream(); virtual void startStream() = 0; @@ -158,9 +168,13 @@ protected: UNINITIALIZED = -75 }; - enum StreamState { - STREAM_STOPPED, - STREAM_RUNNING + // A protected structure used for buffer conversion. + struct ConvertInfo { + int channels; + int inJump, outJump; + RtAudioFormat inFormat, outFormat; + std::vector<int> inOffset; + std::vector<int> outOffset; }; // A protected structure for audio streams. @@ -183,10 +197,10 @@ protected: RtAudioFormat deviceFormat[2]; // Playback and record, respectively. StreamMutex mutex; CallbackInfo callbackInfo; + ConvertInfo convertInfo[2]; RtApiStream() :apiHandle(0), userBuffer(0), deviceBuffer(0) {} - // mode(UNINITIALIZED), state(STREAM_STOPPED), }; // A protected device structure for audio devices. @@ -217,7 +231,7 @@ protected: typedef float Float32; typedef double Float64; - char message_[256]; + char message_[1024]; int nDevices_; std::vector<RtApiDevice> devices_; RtApiStream stream_; @@ -281,7 +295,7 @@ protected: Protected method used to perform format, channel number, and/or interleaving conversions between the user and device buffers. */ - void convertStreamBuffer( StreamMode mode ); + void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ); //! Protected common method used to perform byte-swapping on buffers. void byteSwapBuffer( char *buffer, int samples, RtAudioFormat format ); @@ -350,6 +364,20 @@ public: RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers, RtAudioApi api=UNSPECIFIED ); + //! An overloaded constructor which opens a stream and also returns \c numberOfBuffers parameter via pointer argument. + /*! + See the previous constructor call for details. This overloaded + version differs only in that it takes a pointer argument for the + \c numberOfBuffers parameter and returns the value used by the + audio device (which may be different from that requested). Note + that the \c numberofBuffers parameter is not used with the Linux + Jack, Macintosh CoreAudio, and Windows ASIO APIs. + */ + RtAudio( int outputDevice, int outputChannels, + int inputDevice, int inputChannels, + RtAudioFormat format, int sampleRate, + int *bufferSize, int *numberOfBuffers, RtAudioApi api=UNSPECIFIED ); + //! The destructor. /*! Stops and closes an open stream and devices and deallocates @@ -389,6 +417,20 @@ public: RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers ); + //! A public method for opening a stream and also returning \c numberOfBuffers parameter via pointer argument. + /*! + See the previous function call for details. This overloaded + version differs only in that it takes a pointer argument for the + \c numberOfBuffers parameter and returns the value used by the + audio device (which may be different from that requested). Note + that the \c numberofBuffers parameter is not used with the Linux + Jack, Macintosh CoreAudio, and Windows ASIO APIs. + */ + void openStream( int outputDevice, int outputChannels, + int inputDevice, int inputChannels, + RtAudioFormat format, int sampleRate, + int *bufferSize, int *numberOfBuffers ); + //! A public method which sets a user-defined callback function for a given stream. /*! This method assigns a callback function to a previously opened @@ -634,6 +676,53 @@ public: void setStreamCallback( RtAudioCallback callback, void *userData ); void cancelStreamCallback(); + public: + // \brief Internal structure that provide debug information on the state of a running DSound device. + struct RtDsStatistics { + // \brief Sample Rate. + long sampleRate; + // \brief The size of one sample * number of channels on the input device. + int inputFrameSize; + // \brief The size of one sample * number of channels on the output device. + int outputFrameSize; + /* \brief The number of times the read pointer had to be adjusted to avoid reading from an unsafe buffer position. + * + * This field is only used when running in DUPLEX mode. INPUT mode devices just wait until the data is + * available. + */ + int numberOfReadOverruns; + // \brief The number of times the write pointer had to be adjusted to avoid writing in an unsafe buffer position. + int numberOfWriteUnderruns; + // \brief Number of bytes by attribute to buffer configuration by which writing must lead the current write pointer. + int writeDeviceBufferLeadBytes; + // \brief Number of bytes by attributable to the device driver by which writing must lead the current write pointer on this output device. + unsigned long writeDeviceSafeLeadBytes; + // \brief Number of bytes by which reading must trail the current read pointer on this input device. + unsigned long readDeviceSafeLeadBytes; + /* \brief Estimated latency in seconds. + * + * For INPUT mode devices, based the latency of the device's safe read pointer, plus one buffer's + * worth of additional latency. + * + * For OUTPUT mode devices, the latency of the device's safe write pointer, plus N buffers of + * additional buffer latency. + * + * For DUPLEX devices, the sum of latencies for both input and output devices. DUPLEX devices + * also back off the read pointers an additional amount in order to maintain synchronization + * between out-of-phase read and write pointers. This time is also included. + * + * Note that most software packages report latency between the safe write pointer + * and the software lead pointer, excluding the hardware device's safe write pointer + * latency. Figures of 1 or 2ms of latency on Windows audio devices are invariably of this type. + * The reality is that hardware devices often have latencies of 30ms or more (often much + * higher for duplex operation). + */ + + double latency; + }; + // \brief Report on the current state of a running DSound device. + static RtDsStatistics getDsStatistics(); + private: void initialize(void); @@ -641,6 +730,12 @@ public: bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); + + bool coInitialized; + bool buffersRolling; + long duplexPrerollBytes; + static RtDsStatistics statistics; + }; #endif @@ -674,6 +769,9 @@ public: bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); + + bool coInitialized; + }; #endif |
