Sample Code

OSX Driver and Kext Samples/ SampleUSBAudioPlugin/ SampleUSBAudioPlugin/ SampleUSBAudioPlugin.cpp/

/*
*	File:		SampleUSBAudioPlugin.cpp
*
*	Contains:	com_MySoftwareCompany_driver_SampleUSBAudioPlugin Implementation
*
*			A simple USB audio plug-in that performs a lowpass filtering operation on audio streamed
*			through the Griffin iMic. The target SampleUSBAudioPlugin.kext must be copied to the 
*			/System/Library/Extensions folder of the boot volume by an administrator using a 
*			command like (from the project folder):
*
*			sudo cp -rf ./build/SampleUSBAudioPlugin.kext /System/Library/Extensions
*
*           Then you must notify the operating system that the contents of the kernel extension directory has 
*           changed by "touching the directory":
*
*			sudo touch /System/Library/Extensions
*
*			Restart the system.
* 
*			After restarting the system, the plug-in should automatically load when the device
*			specified in the Info.plist is plugged in. Plug-in logging can be observed by viewing 
*			the system log using Console in /Applications/Utilities.
*			
*	
*	Version:	1.0
*
*	Created:	11-23-2004
*
*   © Copyright 2004-2013 Apple Computer, Inc. All rights reserved.
*
*	Disclaimer:	IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in
*				consideration of your agreement to the following terms, and your use, installation, modification
*				or redistribution of this Apple software constitutes acceptance of these terms.  If you do
*				not agree with these terms, please do not use, install, modify or redistribute this Apple
*				software.
*
*				In consideration of your agreement to abide by the following terms, and subject to these terms,
*				Apple grants you a personal, non-exclusive license, under Apple's copyrights in this
*				original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the
*				Apple Software, with or without modifications, in source and/or binary forms; provided that if you
*				redistribute the Apple Software in its entirety and without modifications, you must retain this
*				notice and the following text and disclaimers in all such redistributions of the Apple Software.
*				Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to
*				endorse or promote products derived from the Apple Software without specific prior written
*				permission from Apple.  Except as expressly stated in this notice, no other rights or
*				licenses, express or implied, are granted by Apple herein, including but not limited to any
*				patent rights that may be infringed by your derivative works or by other works in which the
*				Apple Software may be incorporated.
*
*				The Apple Software is provided by Apple on an "AS IS" basis.  APPLE MAKES NO WARRANTIES, EXPRESS OR
*				IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY
*				AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE
*				OR IN COMBINATION WITH YOUR PRODUCTS.
*
*				IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
*				DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
*				OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
*				REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER
*				UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN
*				IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/

#include <IOKit/IOLib.h>

#include "SampleUSBAudioPlugin.h"

#define super AppleUSBAudioPlugin

OSDefineMetaClassAndStructors (com_MySoftwareCompany_driver_SampleUSBAudioPlugin, AppleUSBAudioPlugin);

// AppleUSBAudioPlugin methods
/*****************************************************
*
* com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginInit (IOService * provider, UInt16 vendorID, UInt16 productID)
*
* Purpose:  
*
* Inputs:   provider   -  AppleUSBAudioEngine object associated with device
*           vendorID   -  idVendor
*           productID  -  idProduct
*
* Returns:  IOReturn  result -  (0 == no error)
*/
IOReturn com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginInit (IOService * provider, UInt16 vendorID, UInt16 productID) 
{
	IOReturn				result;
	//IOUSBDevRequest		myRequest;

	// Init our superclass first
	result = super::pluginInit (provider, vendorID, productID);

#warning   Change the idVendor & idProduct here (and in Info.plist) to match the audio device you want to use! 
	// Double check that we're loaded on the device that we want to be;

	if (vendorID != 0x077D || productID != 0x07AF)
	{
		//NOTE: Avoid logging this type of information (idVendor, idProduct) in a released product
		//The plug-in should fail silently, if the incorrect (idVendor, idProduct) is given.
		//Only log this type of information during development!
		//IOLog ("vendorID = %u, productID = %u", vendorID, productID);
	
		return kIOReturnNoDevice;
	}
	
	if (result == kIOReturnSuccess) 
	{
		// Do our one time initialization
		IOLog ("com_MySoftwareCompany_driver_SampleUSBAudioPlugin initialized successfully\n");

		/* Just initialize to some random values to verify that pluginSetFormat is working.
		   These values should be overwritten by the device's actual format when pluginSetFormat is called. */
		mSampleRate = 44101;
		mNumChannels = 3;
		
		setProcessingParameters (&mParamStruct, mSampleRate, mNumChannels);
	}

	return result;
}

/*****************************************************
*
* com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginStart ()
*
* Purpose:  Start processing audio
*
* Inputs:   (void)
*
* Returns:  IOReturn  result -  (0 == no error)
*/
IOReturn com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginStart () 
{
	IOReturn				result;

	// Start our superclass first
	result = super::pluginStart ();
	
	if (result == kIOReturnSuccess) 
	{
		// Do our every time initialization
		resetProcessingState (&mStateStruct);
		IOLog ("com_MySoftwareCompany_driver_SampleUSBAudioPlugin starting.\n");
	}

	return result;
}

/*****************************************************
*
* com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginReset ()
*
* Purpose:  Reset processing parameters and state.
*
* Inputs:   (void)
*
* Returns:  IOReturn  result -  (0 == no error)
*/
IOReturn com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginReset () 
{
	IOReturn				result;

	IOLog ("com_MySoftwareCompany_driver_SampleUSBAudioPlugin resetting...\n");

	// Reset the plugin's state
	setProcessingParameters (&mParamStruct, mSampleRate, mNumChannels);
	resetProcessingState (&mStateStruct);

	// No need to call super::pluginReset
	result = kIOReturnSuccess;

	return result;
}

/*****************************************************
*
* com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginSetFormat(const IOAudioStreamFormat * const newFormat, const IOAudioSampleRate * const newSampleRate)
*
* Purpose:  Changes the current audio stream format
*
* Inputs:   newFormat - new audio stream format
*			newSampleRate- new sample rate
*
* Returns:  IOReturn  result -  (0 == no error)
*/
IOReturn com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginSetFormat (const IOAudioStreamFormat * const newFormat, const IOAudioSampleRate * const newSampleRate) 
{
	IOReturn				result;

	IOLog ("com_MySoftwareCompany_driver_SampleUSBAudioPlugin changing format\n");
	
	// If parameters depend on sample rate or number of channels (or other format info), update them here
	if (NULL != newSampleRate) 
	{
		mSampleRate = newSampleRate->whole;
	}
	
	if (NULL != newFormat) 
	{
		mNumChannels = newFormat->fNumChannels;
	}

	setProcessingParameters (&mParamStruct, mSampleRate, mNumChannels);

	IOLog ("mSampleRate = %u, mNumChannels = %u\n", (unsigned int)mSampleRate, (unsigned int)mNumChannels);
	
	// No need to call super::pluginProcess
	result = kIOReturnSuccess;

	return result;
	
} 

/*****************************************************
*
* com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginProcess (float * mixBuf, UInt32 numSampleFrames, UInt32 numChannels) 
*
* Purpose:  Calls processSamples() (low pass filter) to process audio data
*
* Inputs:   mixBuf - pointer to the mixed buffer samples
*			numSampleFrames - number of sample frames in mixed buffer
*			numChannels - number of channels that are interleaved in the mixed buffer
*
* Returns:  IOReturn  result -  (kIOReturnSuccess == no error)
*/
IOReturn com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginProcess (float * mixBuf, UInt32 numSampleFrames, UInt32 numChannels) 
{
	IOReturn				result;

	// Do our data processing methods
	
	if (    (mSampleRate == 44100)
		 && (mNumChannels <= 2))
	{
		processSamples (mixBuf, numSampleFrames, numChannels, &mParamStruct, &mStateStruct);
	}
	
	// No need to call super::pluginProcess
	result = kIOReturnSuccess;

	return result;
}

/*****************************************************
*
* com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginStop ()
*
* Purpose:  Start processing audio
*
* Inputs:   (void)
*
* Returns:  IOReturn  result -  (0 == no error)
*/
IOReturn com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginStop () 
{
	IOReturn				result;

	// Do our stop work first, then call super
	IOLog ("com_MySoftwareCompany_driver_SampleUSBAudioPlugin stopping.\n");

	pluginReset ();
	result = super::pluginStop ();

	return result;
}

/*****************************************************
 *
 * com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginProcessInput (float * destBuf, UInt32 numSampleFrames, UInt32 numChannels) 
 *
 * Purpose:  Calls processSamples() (low pass filter) to process audio data
 *
 * Inputs:   destBuf - pointer to the input & destination buffer samples
 *			numSampleFrames - number of sample frames in mixed buffer
 *			numChannels - number of channels that are interleaved in the mixed buffer
 *
 * Returns:  IOReturn  result -  (kIOReturnSuccess == no error)
 */
IOReturn com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginProcessInput (float * destBuf, UInt32 numSampleFrames, UInt32 numChannels) 
{
	// Do our data processing methods
	
	if (    (mSampleRate == 44100)
		&& (mNumChannels <= 2))
	{
		processSamples (destBuf, numSampleFrames, numChannels, &mParamStruct, &mStateStruct);
	}
	
	return kIOReturnSuccess;
}

/*****************************************************
 *
 * com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginSetDirection (IOAudioStreamDirection direction) 
 *
 * Purpose:  Process audio data
 *
 * Inputs:   direction - Direction of audio stream, either input or output.
 *			numSampleFrames - number of sample frames in mixed buffer
 *			numChannels - number of channels that are interleaved in the mixed buffer
 *
 * Returns:  IOReturn  result -  (kIOReturnSuccess == no error)
 */
IOReturn com_MySoftwareCompany_driver_SampleUSBAudioPlugin::pluginSetDirection (IOAudioStreamDirection direction) 
{
	IOLog ("com_MySoftwareCompany_driver_SampleUSBAudioPlugin set direction - %u\n", (unsigned int)direction);

	mDirection = direction;
	
	return kIOReturnSuccess;
}

Our Services

  • What our customers say about us?

© 2011-2024 All Rights Reserved. Joya Systems. 4425 South Mopac Building II Suite 101 Austin, TX 78735 Tel: 800-DEV-KERNEL

Privacy Policy. Terms of use. Valid XHTML & CSS