📄 spbtest.cpp
字号:
#include <QuickTime/QuickTime.h>#include "utils.c"#include <unistd.h>char extrabuf[800000];int extrabufsize = 800000;int extrabufpos = 0;void MySICompletionProc(SPBPtr inParamPtr) { printf("MySICompletionProc\n"); CFRunLoopStop(CFRunLoopGetCurrent());}SPB backup;void MySIInterruptProc(SPBPtr inParamPtr, Ptr dataBuffer, short peakAmplitude, long sampleSize) {/* printf("MySIInterruptProc\n"); if (inParamPtr->inRefNum != backup.inRefNum) printf("inRefNum\n"); if (inParamPtr->count != backup.count) printf("count\n"); if (inParamPtr->milliseconds != backup.milliseconds) printf("milliseconds\n"); if (inParamPtr->bufferLength != backup.bufferLength) printf("bufferLength\n"); if (inParamPtr->bufferPtr != backup.bufferPtr) printf("bufferPtr\n"); if (inParamPtr->completionRoutine != backup.completionRoutine) printf("completionRoutine\n"); if (inParamPtr->interruptRoutine != backup.interruptRoutine) printf("interruptRoutine\n"); if (inParamPtr->userLong != backup.userLong) printf("userLong\n"); if (inParamPtr->error != backup.error) printf("error %d\n", inParamPtr->error); if (inParamPtr->unused1 != backup.unused1) printf("unused1\n"); printf("dataBuffer: %p\n", dataBuffer); printf("peakAmplitude: %d\n", peakAmplitude); printf("sampleSize: %d\n", sampleSize);*/ int n = sampleSize; if (extrabufpos + n > extrabufsize) n = extrabufsize - extrabufpos; memcpy(extrabuf + extrabufpos, dataBuffer, n); extrabufpos += n;/* for (int i = 0; i < 10; i++) printf("%d ", dataBuffer[i]); printf("\n"); printf("\n");*/// printf("bufferPtr: %p\n", inParamPtr->bufferPtr);}int main(int argc, char *argv[]) { Str255 name; cstrToPstr(name, "Movino sound"); long refNum; OSErr err = SPBOpenDevice(name, siWritePermission, &refNum); if (err == noErr) { printf("opened\n"); } else { printf("SPBOpenDevice: %d\n", err); return 1; } short continuous = 1; SPBSetDeviceInfo(refNum, siContinuous, &continuous); SPBGetDeviceInfo(refNum, siDeviceName, name); char cname[200]; pstrToCstr(cname, name); printf("name: %s\n", cname); Handle handle; SPBGetDeviceInfo(refNum, siInputSourceNames, &handle); uint8_t* ptr = (uint8_t*) *handle; short sources = *(short*) ptr; ptr += 2; for (int i = 0; i < sources; i++) { pstrToCstr(cname, ptr); printf("source name %d: %s\n", i, cname); ptr += *ptr + 1; } short source = 1; SPBSetDeviceInfo(refNum, siInputSource, &source); long bufferInfo; SPBGetDeviceInfo(refNum, siDeviceBufferInfo, &bufferInfo); printf("bufferInfo: %d\n", bufferInfo); SPB spb; spb.inRefNum = refNum; spb.count = 80000; spb.bufferLength = spb.count; uint8_t *buf = (uint8_t*) malloc(spb.bufferLength); printf("buf: %p\n", buf); spb.milliseconds = 100000; spb.bufferPtr = (Ptr) buf;// spb.bufferPtr = NULL;// spb.count = 1; spb.completionRoutine = MySICompletionProc; spb.interruptRoutine = MySIInterruptProc; spb.userLong = 0x42; spb.error = 0; spb.unused1 = 0; printf("spb: %p\n", &spb); memcpy(&backup, &spb, sizeof(SPB)); err = SPBRecord(&spb, TRUE); printf("SPBRecord: %d\n", err);// sleep(10); CFRunLoopRun(); SPBCloseDevice(refNum); printf("error: %d\n", spb.error); printf("extrabufpos: %d\n", extrabufpos); printf("count: %d\n", spb.count);/* for (int i = 0; i < spb.count && i < extrabufpos; i++) { if (spb.bufferPtr[i] != extrabuf[i]) printf("diff at %d\n", i); }*/ free(buf); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -