Skip to content

Commit b2c8e8d

Browse files
committed
finally fixed most of the driver issues
1 parent 8d66334 commit b2c8e8d

8 files changed

Lines changed: 221 additions & 39 deletions

File tree

native/app/Sandbox.playground/timeline.xctimeline

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
version = "3.0">
44
<TimelineItems>
55
<LoggerValueHistoryTimelineItem
6-
documentLocation = "file:///Users/nodeful/Programming/Bitgapp/eqMac/native/app/Sandbox.playground#CharacterRangeLen=57&amp;CharacterRangeLoc=494&amp;EndingColumnNumber=0&amp;EndingLineNumber=19&amp;StartingColumnNumber=32&amp;StartingLineNumber=16&amp;Timestamp=645400816.412694"
6+
documentLocation = "file:///Users/nodeful/Programming/Bitgapp/eqMac/native/app/Sandbox.playground#CharacterRangeLen=1118&amp;CharacterRangeLoc=0&amp;EndingColumnNumber=0&amp;EndingLineNumber=43&amp;StartingColumnNumber=0&amp;StartingLineNumber=0&amp;Timestamp=651537732.92888"
7+
selectedRepresentationIndex = "0"
8+
shouldTrackSuperviewWidth = "NO">
9+
</LoggerValueHistoryTimelineItem>
10+
<LoggerValueHistoryTimelineItem
11+
documentLocation = "file:///Users/nodeful/Programming/Bitgapp/eqMac/native/app/Sandbox.playground#CharacterRangeLen=1118&amp;CharacterRangeLoc=0&amp;EndingColumnNumber=0&amp;EndingLineNumber=43&amp;StartingColumnNumber=0&amp;StartingLineNumber=0&amp;Timestamp=651537732.9289711"
712
selectedRepresentationIndex = "0"
813
shouldTrackSuperviewWidth = "NO">
914
</LoggerValueHistoryTimelineItem>

native/driver/Driver.xcodeproj/project.pbxproj

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 47;
6+
objectVersion = 54;
77
objects = {
88

99
/* Begin PBXBuildFile section */
@@ -156,6 +156,7 @@
156156
1CB8B3601BBBB78D000E2DD1 /* Sources */,
157157
1CB8B3611BBBB78D000E2DD1 /* Frameworks */,
158158
1CB8B3621BBBB78D000E2DD1 /* Resources */,
159+
7823A93C26D597F6004BABC6 /* ShellScript */,
159160
);
160161
buildRules = (
161162
);
@@ -216,6 +217,28 @@
216217
};
217218
/* End PBXResourcesBuildPhase section */
218219

220+
/* Begin PBXShellScriptBuildPhase section */
221+
7823A93C26D597F6004BABC6 /* ShellScript */ = {
222+
isa = PBXShellScriptBuildPhase;
223+
alwaysOutOfDate = 1;
224+
buildActionMask = 2147483647;
225+
files = (
226+
);
227+
inputFileListPaths = (
228+
);
229+
inputPaths = (
230+
);
231+
outputFileListPaths = (
232+
);
233+
outputPaths = (
234+
);
235+
runOnlyForDeploymentPostprocessing = 0;
236+
shellPath = /bin/sh;
237+
shellScript = "export SUDO_ASKPASS=~/askpass.sh\n# Uninstall any new driver leftovers\nsudo -A rm -rf /Library/Audio/Plug-Ins/HAL/eqMac.driver/\n# Install the new driver\nsudo -A cp -f -r \"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\" /Library/Audio/Plug-Ins/HAL/\n# Restart CoreAudio\nsudo -A launchctl kickstart -k system/com.apple.audio.coreaudiod\n";
238+
showEnvVarsInLog = 0;
239+
};
240+
/* End PBXShellScriptBuildPhase section */
241+
219242
/* Begin PBXSourcesBuildPhase section */
220243
1CB8B3601BBBB78D000E2DD1 /* Sources */ = {
221244
isa = PBXSourcesBuildPhase;
@@ -422,7 +445,11 @@
422445
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist";
423446
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Audio/Plug-Ins/HAL";
424447
IPHONEOS_DEPLOYMENT_TARGET = "";
425-
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
448+
LD_RUNPATH_SEARCH_PATHS = (
449+
"$(inherited)",
450+
"@executable_path/../Frameworks",
451+
"@loader_path/../Frameworks",
452+
);
426453
MACOSX_DEPLOYMENT_TARGET = 10.10;
427454
MARKETING_VERSION = 1.2.3;
428455
MTL_ENABLE_DEBUG_INFO = YES;
@@ -487,7 +514,11 @@
487514
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist";
488515
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Audio/Plug-Ins/HAL";
489516
IPHONEOS_DEPLOYMENT_TARGET = "";
490-
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
517+
LD_RUNPATH_SEARCH_PATHS = (
518+
"$(inherited)",
519+
"@executable_path/../Frameworks",
520+
"@loader_path/../Frameworks",
521+
);
491522
MACOSX_DEPLOYMENT_TARGET = 10.10;
492523
MARKETING_VERSION = 1.2.3;
493524
MTL_ENABLE_DEBUG_INFO = NO;

native/driver/Source/EQMControl.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ class EQMControl: EQMObject {
301301
// case, only that number of items will be returned
302302

303303
// eqMac only has 1 Source
304-
return .integerList([0])
304+
return .integer(0)
305305
case kAudioSelectorControlPropertyItemName:
306306
// This returns the user-readable name for the selector item in the qualifier
307307
return .string(kDeviceName as CFString)

native/driver/Source/EQMDevice.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class EQMDevice: EQMObject {
184184
kObjectID_Mute_Output_Master,
185185
kObjectID_DataSource_Output_Master,
186186
])
187-
default: return .objectIDList([])
187+
default: return .null()
188188
}
189189
case kAudioDevicePropertyDeviceUID:
190190
// This is a CFString that is a persistent token that can identify the same
@@ -267,12 +267,12 @@ class EQMDevice: EQMObject {
267267
return .objectIDList([ kObjectID_Stream_Input, kObjectID_Stream_Output ])
268268
case kAudioObjectPropertyScopeInput:
269269
// input scope means just the objects on the input side
270-
return .objectIDList([ kObjectID_Stream_Input ])
270+
return .integer(kObjectID_Stream_Input)
271271
case kAudioObjectPropertyScopeOutput:
272272
// output scope means just the objects on the output side
273-
return .objectIDList([ kObjectID_Stream_Output ])
273+
return .integer(kObjectID_Stream_Output)
274274
default:
275-
return .objectIDList([])
275+
return .null()
276276
}
277277

278278
case kAudioObjectPropertyControlList:

native/driver/Source/EQMInterface.swift

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ func EQM_AbortDeviceConfigurationChange (inDriver: AudioServerPlugInDriverRef, i
160160
func EQM_HasProperty (inDriver: AudioServerPlugInDriverRef, inObjectID: AudioObjectID, inClientProcessID: pid_t, inAddress: UnsafePointer<AudioObjectPropertyAddress>) -> DarwinBoolean {
161161
// This method returns whether or not the given object has the given property.
162162

163-
log("Invoking: \(EQMDriver.getEQMObjectClassName(from: inObjectID)).hasProperty(\(inAddress.pointee.mSelector.code))")
163+
log("Invoking: \(EQMDriver.getEQMObjectClassName(from: inObjectID)).hasProperty(\(propertyName(inAddress.pointee.mSelector)))")
164164
let hasProperty: Bool = ({
165165
guard EQMDriver.validateDriver(inDriver) else { return false }
166166
if let obj = EQMDriver.getEQMObject(from: inObjectID) {
@@ -169,7 +169,7 @@ func EQM_HasProperty (inDriver: AudioServerPlugInDriverRef, inObjectID: AudioObj
169169
return false
170170
}
171171
})()
172-
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).hasProperty(\(inAddress.pointee.mSelector.code)) = \(hasProperty)")
172+
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).hasProperty(\(propertyName(inAddress.pointee.mSelector))) = \(hasProperty)")
173173

174174
return DarwinBoolean(hasProperty)
175175
}
@@ -178,15 +178,15 @@ func EQM_IsPropertySettable (inDriver: AudioServerPlugInDriverRef, inObjectID: A
178178
// This method returns whether or not the given property on the object can have its value changed.
179179
guard EQMDriver.validateDriver(inDriver) else { return kAudioHardwareBadObjectError }
180180

181-
log("Invoking: \(EQMDriver.getEQMObjectClassName(from: inObjectID)).isPropertySettable(\(inAddress.pointee.mSelector.code))")
181+
log("Invoking: \(EQMDriver.getEQMObjectClassName(from: inObjectID)).isPropertySettable(\(propertyName(inAddress.pointee.mSelector)))")
182182
let isSettable = DarwinBoolean(({
183183
if let obj = EQMDriver.getEQMObject(from: inObjectID) {
184184
return obj.isPropertySettable(objectID: inObjectID, address: inAddress.pointee)
185185
} else {
186186
return false
187187
}
188188
})())
189-
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertySettable(\(inAddress.pointee.mSelector.code)) = \(isSettable)")
189+
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertySettable(\(propertyName(inAddress.pointee.mSelector))) = \(isSettable)")
190190

191191
outIsSettable.pointee = isSettable
192192

@@ -197,15 +197,15 @@ func EQM_GetPropertyDataSize (inDriver: AudioServerPlugInDriverRef, inObjectID:
197197
// This method returns the byte size of the property's data.
198198
guard EQMDriver.validateDriver(inDriver) && EQMDriver.validateObject(inObjectID) else { return kAudioHardwareBadObjectError }
199199

200-
log("Invoking: \(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertyDataSize(\(inAddress.pointee.mSelector.code))")
200+
log("Invoking: \(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertyDataSize(\(propertyName(inAddress.pointee.mSelector)))")
201201
let size = ({ () -> UInt32? in
202202
if let obj = EQMDriver.getEQMObject(from: inObjectID) {
203203
return obj.getPropertyDataSize(objectID: inObjectID, address: inAddress.pointee)
204204
} else {
205205
return nil
206206
}
207207
})()
208-
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertyDataSize(\(inAddress.pointee.mSelector.code)) = \(size ?? 0)")
208+
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertyDataSize(\(propertyName(inAddress.pointee.mSelector))) = \(size ?? 0)")
209209

210210
if size != nil {
211211
outDataSize.pointee = size!
@@ -218,11 +218,11 @@ func EQM_GetPropertyDataSize (inDriver: AudioServerPlugInDriverRef, inObjectID:
218218
func EQM_GetPropertyData (inDriver: AudioServerPlugInDriverRef, inObjectID: AudioObjectID, inClientProcessID: pid_t, inAddress: UnsafePointer<AudioObjectPropertyAddress>, inQualifierDataSize: UInt32, inQualifierData: UnsafeRawPointer?, inDataSize: UInt32, outDataSize: UnsafeMutablePointer<UInt32>, outData: UnsafeMutableRawPointer) -> OSStatus {
219219
// Fetches the data of the given property and places it in the provided buffer.
220220
guard EQMDriver.validateDriver(inDriver) && EQMDriver.validateObject(inObjectID) else {
221-
log("Invalid driver or object id while in EQM_GetPropertyData(\(inAddress.pointee.mSelector.code))")
221+
log("Invalid driver or object id while in EQM_GetPropertyData(\(propertyName(inAddress.pointee.mSelector)))")
222222
return kAudioHardwareBadObjectError
223223
}
224224

225-
log("Invoking: \(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertyData(\(inAddress.pointee.mSelector.code)) - Size requested: \(inDataSize)")
225+
log("Invoking: \(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertyData(\(propertyName(inAddress.pointee.mSelector))) - Size requested: \(inDataSize)")
226226

227227
let data = ({ () -> EQMObjectProperty? in
228228
if let obj = EQMDriver.getEQMObject(from: inObjectID) {
@@ -231,7 +231,7 @@ func EQM_GetPropertyData (inDriver: AudioServerPlugInDriverRef, inObjectID: Audi
231231
return nil
232232
}
233233
})()
234-
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertyData(\(inAddress.pointee.mSelector.code)) = \(String(describing: data))")
234+
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).getPropertyData(\(propertyName(inAddress.pointee.mSelector))) = \(String(describing: data))")
235235
if data != nil {
236236
data!.write(to: outData, size: outDataSize, requestedSize: inDataSize)
237237
return noErr
@@ -245,7 +245,7 @@ func EQM_SetPropertyData (inDriver: AudioServerPlugInDriverRef, inObjectID: Audi
245245
// Tells an object to change the value of the given property.
246246
guard EQMDriver.validateDriver(inDriver) else { return kAudioHardwareBadObjectError }
247247

248-
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).setPropertyData(\(inAddress.pointee.mSelector.code)) = \(String(describing: inData))")
248+
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).setPropertyData(\(propertyName(inAddress.pointee.mSelector))) = \(String(describing: inData))")
249249

250250
if let obj = EQMDriver.getEQMObject(from: inObjectID) {
251251
var changedProperties: [AudioObjectPropertyAddress] = []
@@ -254,7 +254,9 @@ func EQM_SetPropertyData (inDriver: AudioServerPlugInDriverRef, inObjectID: Audi
254254
if changedProperties.count > 0 {
255255
_ = EQMDriver.host!.pointee.PropertiesChanged(EQMDriver.host!, inObjectID, UInt32(changedProperties.count), changedProperties)
256256
}
257-
257+
258+
log("\(EQMDriver.getEQMObjectClassName(from: inObjectID)).setPropertyData(\(propertyName(inAddress.pointee.mSelector))) - Status: \(status) - Changed Properties: \(changedProperties)")
259+
258260
return status
259261
} else {
260262
return kAudioHardwareBadObjectError
@@ -269,16 +271,26 @@ func EQM_StartIO (inDriver: AudioServerPlugInDriverRef, inDeviceObjectID: AudioO
269271
// So, work only needs to be done when the first client starts. All subsequent starts simply
270272
// increment the counter.
271273
guard EQMDriver.validateDriver(inDriver) else { return kAudioHardwareBadObjectError }
272-
273-
return EQMDevice.startIO()
274+
log("EQM_StartIO() - Invoked")
275+
276+
let status = EQMDevice.startIO()
277+
278+
log("EQM_StartIO() - Finished")
279+
280+
return status
274281
}
275282

276283
func EQM_StopIO (inDriver: AudioServerPlugInDriverRef, inDeviceObjectID: AudioObjectID, inClientID: UInt32) -> OSStatus {
277284
// This call tells the device that the client has stopped IO. The driver can stop the hardware
278285
// once all clients have stopped.
279286
guard EQMDriver.validateDriver(inDriver) else { return kAudioHardwareBadObjectError }
280-
281-
return EQMDevice.stopIO()
287+
log("EQM_StopIO() - Invoked")
288+
289+
let status = EQMDevice.stopIO()
290+
291+
log("EQM_StopIO() - Finished")
292+
293+
return status
282294
}
283295

284296
func EQM_GetZeroTimeStamp (inDriver: AudioServerPlugInDriverRef, inDeviceObjectID: AudioObjectID, inClientID: UInt32, outSampleTime: UnsafeMutablePointer<Float64>, outHostTime: UnsafeMutablePointer<UInt64>, outSeed: UnsafeMutablePointer<UInt64>) -> OSStatus {
@@ -291,20 +303,26 @@ func EQM_GetZeroTimeStamp (inDriver: AudioServerPlugInDriverRef, inDeviceObjectI
291303
// For this device, the zero time stamps' sample time increments every kDevice_RingBufferSize
292304
// frames and the host time increments by kDevice_RingBufferSize * gDevice_HostTicksPerFrame.
293305
guard EQMDriver.validateDriver(inDriver) else { return kAudioHardwareBadObjectError }
294-
295-
return EQMDevice.getZeroTimeStamp(
306+
log("EQM_GetZeroTimeStamp() - Invoked")
307+
308+
let status = EQMDevice.getZeroTimeStamp(
296309
outSampleTime: outSampleTime,
297310
outHostTime: outHostTime,
298311
outSeed: outSeed
299312
)
313+
log("EQM_GetZeroTimeStamp() - Finished: Status = \(status) Sample TIme = \(outSampleTime.pointee) hostTime = \(outHostTime.pointee) Seed = \(outSeed.pointee)")
314+
315+
return status
300316
}
301317

302318
func EQM_WillDoIOOperation (inDriver: AudioServerPlugInDriverRef, inDeviceObjectID: AudioObjectID, inClientID: UInt32, inOperationID: UInt32, outWillDo: UnsafeMutablePointer<DarwinBoolean>, outWillDoInPlace: UnsafeMutablePointer<DarwinBoolean>) -> OSStatus {
303319
// Asks the plug-in whether or not the device will perform the given phase of the IO cycle for a particular device.
304320
// This method returns whether or not the device will do a given IO operation. For this device,
305321
// we only support reading input data and writing output data.
306322
guard EQMDriver.validateDriver(inDriver) else { return kAudioHardwareBadObjectError }
307-
323+
324+
log("EQM_WillDoIOOperation() - Invoked")
325+
308326
var willDo = false
309327
var willDoInPlace = true
310328

@@ -322,7 +340,9 @@ func EQM_WillDoIOOperation (inDriver: AudioServerPlugInDriverRef, inDeviceObject
322340

323341
outWillDo.pointee = DarwinBoolean(willDo)
324342
outWillDoInPlace.pointee = DarwinBoolean(willDoInPlace)
325-
343+
344+
log("EQM_WillDoIOOperation() - Finished: willDo: \(willDo) willDoInPlace: \(willDoInPlace)")
345+
326346
return noErr
327347
}
328348

@@ -331,6 +351,7 @@ func EQM_BeginIOOperation (inDriver: AudioServerPlugInDriverRef, inDeviceObjectI
331351
// This is called at the beginning of an IO operation. This device doesn't do anything, so just
332352
// check the arguments and return.
333353
guard EQMDriver.validateDriver(inDriver) else { return kAudioHardwareBadObjectError }
354+
log("EQM_BeginIOOperation()")
334355
return noErr
335356
}
336357

@@ -341,19 +362,26 @@ func EQM_DoIOOperation (inDriver: AudioServerPlugInDriverRef, inDeviceObjectID:
341362
guard let sample = ioMainBuffer?.assumingMemoryBound(to: Float32.self) else {
342363
return noErr
343364
}
344-
345-
return EQMDevice.doIO(
365+
366+
log("EQM_DoIOOperation() - Started")
367+
368+
let status = EQMDevice.doIO(
346369
clientID: inClientID,
347370
operationID: inOperationID,
348371
sample: sample,
349372
sampleTime: Int(inIOCycleInfo.pointee.mInputTime.mSampleTime),
350373
frameSize: inIOBufferFrameSize
351374
)
375+
376+
log("EQM_DoIOOperation() - Ended - Status: \(status)")
377+
378+
return status
352379
}
353380

354381
func EQM_EndIOOperation (inDriver: AudioServerPlugInDriverRef, inDeviceObjectID: AudioObjectID, inClientID: UInt32, inOperationID: UInt32, inIOBufferFrameSize: UInt32, inIOCycleInfo: UnsafePointer<AudioServerPlugInIOCycleInfo>) -> OSStatus {
355382
// This is called at the end of an IO operation. This device doesn't do anything, so just check
356383
// the arguments and return.
357384
guard EQMDriver.validateDriver(inDriver) else { return kAudioHardwareBadObjectError }
385+
log("EQM_EndIOOperation()")
358386
return noErr
359387
}

native/driver/Source/EQMPlugIn.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,8 @@ class EQMPlugIn: EQMObject {
6262
// This is the human readable name of the maker of the plug-in.
6363
return .string(kDeviceManufacturer as CFString)
6464

65-
case kAudioObjectPropertyOwnedObjects:
66-
return .objectIDList([kObjectID_Device])
67-
case kAudioPlugInPropertyDeviceList:
65+
case kAudioObjectPropertyOwnedObjects,
66+
kAudioPlugInPropertyDeviceList:
6867
return .objectIDList([kObjectID_Device])
6968

7069
case kAudioPlugInPropertyTranslateUIDToDevice:

native/driver/Source/EQMStream.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class EQMStream: EQMObject {
132132
AudioStreamBasicDescription(
133133
mSampleRate: EQMDevice.sampleRate,
134134
mFormatID: kAudioFormatLinearPCM,
135-
mFormatFlags: kAudioFormatFlagIsFloat & kAudioFormatFlagsNativeEndian & kAudioFormatFlagIsPacked,
135+
mFormatFlags: kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked,
136136
mBytesPerPacket: kBytesPerFrame,
137137
mFramesPerPacket: 1,
138138
mBytesPerFrame: kBytesPerFrame,
@@ -157,7 +157,7 @@ class EQMStream: EQMObject {
157157
mFormat: AudioStreamBasicDescription(
158158
mSampleRate: sampleRate,
159159
mFormatID: kAudioFormatLinearPCM,
160-
mFormatFlags: kAudioFormatFlagIsFloat & kAudioFormatFlagsNativeEndian & kAudioFormatFlagIsPacked,
160+
mFormatFlags: kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked,
161161
mBytesPerPacket: kBytesPerFrame,
162162
mFramesPerPacket: 1,
163163
mBytesPerFrame: kBytesPerFrame,

0 commit comments

Comments
 (0)