⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 patest_devinfo.c

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 C
字号:
/* * Test calling SPBSetDeviceInfo() * Should small parameters less than 4 bytes long be passed through a pointer, or directly? * * According to an Applet TechNote at: *     http://developer.apple.com/technotes/tn/tn1048.html * * ------------- begin quote -------------- * Trouble with Void Pointers  * The SetSoundOutputInfo, SndSetInfo, and SPBSetDeviceInfo all take a void* as their last parameter. * Because the last parameter of these calls is a void*, it looks as if you need to pass a pointer * to the value you are setting, but this is not the case if what you are passing is 4 bytes or * less in size. If you are passing a parameter that is larger than four bytes, you must pass a * pointer to it. * * If you are calling GetSoundOutputInfo, SndGetInfo, or SPBGetDeviceInfo and * it is returning a value that is 4 bytes in size or less, it does not return a pointer to * that value, it just returns the value. * ------------ end quote ------------------ *  * But my experiments on a PowerComputing Mac clone running Mac OS 8.1 indicate that * the TechNote is wrong and that a pointer should be passed to SPBSetDeviceInfo. * * Author: Phil Burk * Copyright 2000 Phil Burk * This code may be used freely for any purpose. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <memory.h>#include <math.h>/* Mac specific includes */#include "OSUtils.h"#include <MacTypes.h>#include <Math64.h>#include <Errors.h>#include <Sound.h>#include <SoundInput.h>#include <Devices.h>#include <DateTimeUtils.h>#include <Timer.h>#include <Gestalt.h>/* Change this to 0 or 1 to use the direct parameter method, or the indirect pointer method. */#define USE_POINTER    (1)/* Debugging output macros. */#define PRINT(x) { printf x; fflush(stdout); }#define ERR_RPT(x) PRINT(x)#define DBUG(x)   PRINT(x)static int TestSettingDeviceInfo( const unsigned char *deviceName  );int main( void );int main( void ){	unsigned char noname = 0;	int result = TestSettingDeviceInfo( (const unsigned char *) &noname );	PRINT(("Test complete. result = %d\n", result ));	return 0;}/***************************************************************************	TestSettingDeviceInfo()**  Query information about a named input device.*/static int TestSettingDeviceInfo( const unsigned char *deviceName ){	OSErr err;	long  mRefNum = 0;	long  tempL;	short tempS;	Fixed tempF;		err = SPBOpenDevice( deviceName, siWritePermission, &mRefNum);	if (err)	{		PRINT(("Cound not open device!\n"));		return -1;	}	/* Define macros for printing out device info. */#define PrintDeviceInfo(selector,var) \	err = SPBGetDeviceInfo(mRefNum, selector, (Ptr) &var); \	if (err) { \		PRINT(("query %s failed\n", #selector )); \	}\	else { \		PRINT(("query %s = 0x%x\n", #selector, var )); \	}		PrintDeviceInfo( siContinuous, tempS );	PrintDeviceInfo( siAsync, tempS );	PrintDeviceInfo( siNumberChannels, tempS );	PrintDeviceInfo( siSampleSize, tempS );	PrintDeviceInfo( siSampleRate, tempF );	PrintDeviceInfo( siChannelAvailable, tempS );	PrintDeviceInfo( siActiveChannels, tempL );	PrintDeviceInfo( siDeviceBufferInfo, tempL );#if USE_POINTER/* Continuous Mode ---------- */	PRINT(("Attempt to set siContinuous to 1 using pointer method.\n"));	tempS = 1;	err = SPBSetDeviceInfo(mRefNum, siContinuous, (Ptr) &tempS);	if (err) PRINT(("setting siContinuous using pointer failed\n"));	PrintDeviceInfo( siContinuous, tempS );	PRINT(("Attempt to set siContinuous to 0 using pointer method.\n"));	tempS = 1;	err = SPBSetDeviceInfo(mRefNum, siContinuous, (Ptr) &tempS);	if (err) PRINT(("setting siContinuous using pointer failed\n"));	PrintDeviceInfo( siContinuous, tempS );#else		PRINT(("Attempt to set siContinuous to 1 using direct method.\n"));	err = SPBSetDeviceInfo(mRefNum, siContinuous, (Ptr) 1);	if (err) PRINT(("setting siContinuous using direct failed\n"));	PrintDeviceInfo( siContinuous, tempS );		PRINT(("Attempt to set siContinuous to 0 using direct method.\n"));	err = SPBSetDeviceInfo(mRefNum, siContinuous, (Ptr) 0);	if (err) PRINT(("setting siContinuous using direct failed\n"));	PrintDeviceInfo( siContinuous, tempS );#endif/* Sample rate ----------- */#if USE_POINTER	PRINT(("Attempt to set siSampleRate to 44100 using pointer method.\n"));	tempF = ((unsigned long)44100) << 16;	err = SPBSetDeviceInfo(mRefNum, siSampleRate, (Ptr) &tempF);	if (err) PRINT(("setting siSampleRate using pointer failed\n"));	tempF = 0;	PrintDeviceInfo( siSampleRate, tempF );		PRINT(("Attempt to set siSampleRate to 22050 using pointer method.\n"));	tempF = ((unsigned long)22050) << 16;	err = SPBSetDeviceInfo(mRefNum, siSampleRate, (Ptr) &tempF);	if (err) PRINT(("setting siSampleRate using pointer failed\n"));	tempF = 0;	PrintDeviceInfo( siSampleRate, tempF );#else	PRINT(("Attempt to set siSampleRate to 44100 using direct method.\n"));	err = SPBSetDeviceInfo(mRefNum, siSampleRate, (Ptr) (((unsigned long)44100) << 16));	if (err) PRINT(("setting siSampleRate using direct failed\n"));	PrintDeviceInfo( siSampleRate, tempF );		PRINT(("Attempt to set siSampleRate to 22050 using direct method.\n"));	err = SPBSetDeviceInfo(mRefNum, siSampleRate, (Ptr)  (((unsigned long)44100) << 16));	if (err) PRINT(("setting siSampleRate using direct failed\n"));	PrintDeviceInfo( siSampleRate, tempF );#endif/* All done so close up device. */	if( mRefNum )  SPBCloseDevice(mRefNum);	return 0;	error:	if( mRefNum )  SPBCloseDevice(mRefNum);	return -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -