maccoreaudio.h
来自「安装 H323需要的pwlib库」· C头文件 代码 · 共 240 行
H
240 行
/* * maccoreaudio.h * * Copyright (c) 2004 Network for Educational Technology ETH * * Written by Hannes Friederich, Andreas Fenkart. * Based on work of Shawn Pai-Hsiang Hsiao * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * maccoreaudio.h * */#pragma interface// workaround to remove warnings, when including OSServiceProviders#define __OPENTRANSPORTPROVIDERS__#include <CoreAudio/CoreAudio.h>#include <AudioToolbox/AudioToolbox.h>;#include <AudioUnit/AudioUnit.h>// needed by lists.h of pwlib, unfortunately also defined in previous// includes from Apple#undef nil// static loading of plugins#define P_FORCE_STATIC_PLUGIN#include <ptlib.h>#include <ptlib/sound.h>#define CA_DUMMY_DEVICE_NAME "Null"#define kAudioDeviceDummy kAudioDeviceUnknownclass CircularBuffer;class PSoundChannelCoreAudio : public PSoundChannel{ public: enum State{ init_, open_, setformat_, setbuffer_, running_, destroy_ }; static void Init(); PSoundChannelCoreAudio(); PSoundChannelCoreAudio(const PString &device, PSoundChannel::Directions dir, unsigned numChannels, unsigned sampleRate, unsigned bitsPerSample); ~PSoundChannelCoreAudio(); virtual BOOL SetFormat(unsigned numChannels, unsigned sampleRate, unsigned bitsPerSample); virtual unsigned GetChannels() const; virtual unsigned GetSampleRate() const; virtual unsigned GetSampleSize() const; virtual BOOL SetBuffers(PINDEX size, PINDEX count); virtual BOOL GetBuffers(PINDEX & size, PINDEX & count); virtual BOOL SetVolume(unsigned volume); virtual BOOL GetVolume(unsigned & volume); /* Open functions */ virtual BOOL Open(const PString & device, Directions dir, unsigned numChannels, unsigned sampleRate, unsigned bitsPerSample); /* gets never called, see sound.h: * baseChannel->PChannel::IsOpen(); */ virtual BOOL IsOpen() const; /* gets never called, see sound.h: * baseChannel->PChannel::GetHandle();*/ virtual int GetHandle() const; virtual BOOL Abort(); PSoundChannel *CreateOpenedChannel(const PString & driverName, const PString & deviceName, const PSoundChannel::Directions, unsigned numChannels, unsigned sampleRate, unsigned bitsPerSample); static PString GetDefaultDevice(Directions dir); static PStringList GetDeviceNames(Directions dir); virtual BOOL Write(const void *buf, PINDEX len); virtual BOOL PlaySound(const PSound & sound, BOOL wait); virtual BOOL PlayFile(const PFilePath & file, BOOL wait); virtual BOOL HasPlayCompleted(); virtual BOOL WaitForPlayCompletion(); virtual BOOL Read(void *buf, PINDEX len); virtual BOOL RecordSound(PSound & sound); virtual BOOL RecordFile(const PFilePath & file); virtual BOOL StartRecording(); virtual BOOL isRecordBufferFull(); virtual BOOL AreAllRecordBuffersFull(); virtual BOOL WaitForRecordBufferFull(); virtual BOOL WaitForAllRecordBuffersFull(); protected: /** * Common steps for all constructors */ void CommonConstruct(){ os_handle = -1; // == channel closed. // set to a non negative value so IsOpen() returns true } OSStatus SetupInputUnit(AudioDeviceID in); OSStatus EnableIO(); OSStatus SetupOutputUnit(AudioDeviceID in); OSStatus SetDeviceAsCurrent(AudioDeviceID in); /** * Based on the desired format, try to configure the AUHAL * Units to match this format as close as possible * e.g. 32bit float -> 16int, stereo -> mono */ OSStatus MatchHALInputFormat(); OSStatus MatchHALOutputFormat(); OSStatus CallbackSetup(); /** * Pull/Callback function to pass data to AudioConverter */ static OSStatus ComplexBufferFillPlayback(OpaqueAudioConverter*, UInt32*, AudioBufferList*, AudioStreamPacketDescription**, void*); static OSStatus ComplexBufferFillRecord(OpaqueAudioConverter*, UInt32*, AudioBufferList*, AudioStreamPacketDescription**, void*); /** * Callback for the AudioUnit to pull/notify more data */ static OSStatus PlayRenderProc(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const struct AudioTimeStamp *TimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, struct AudioBufferList * ioData); static OSStatus RecordProc(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData); /** * Recording needs a couple more buffers, which are setup by this * function */ OSStatus SetupAdditionalRecordBuffers(); /** * Player or Recorder ? */ Directions direction; State state; /** * Devices */ AudioUnit mAudioUnit; AudioDeviceID mDeviceID; AudioStreamBasicDescription hwASBD, pwlibASBD; /** Sample rate converter part of AudioToolbox Framework */ AudioConverterRef converter; CircularBuffer *mCircularBuffer; /** sample rate of the AudioUnit as a mutliple of pwlib sample rate */ Float64 rateTimes8kHz; /** number and size of internal buffers * see also SetBuffers */ PINDEX bufferSizeBytes; PINDEX bufferCount; /* * Buffer to hold data that are passed to the converter. * Separate means independant of the circular_buffer */ char* converter_buffer; UInt32 converter_buffer_size; /* ========================================================== * Variables used only by the Recorder to circumvent * the inappropriaty control flow of the pull model */ /** Buffers to capture raw data from the microphone */ CircularBuffer* mInputCircularBuffer; AudioBufferList* mInputBufferList; UInt32 mRecordInputBufferSize;#define MIN_INPUT_FILL 20 /** buffer list to catch the output of the AudioConverter */ AudioBufferList* mOutputBufferList; UInt32 mRecordOutputBufferSize;};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?