/* ** compile with: ** ** gcc -o ComponentsExample ComponentsExample.m -framework Foundation -framework CoreServices -lobjc */ #import #import #import NSMutableArray *FindComponentsWithType(ComponentDescription *fcd) { NSMutableArray *res; ComponentDescription ccd; Component cmp = NULL; Handle pName; char *cName; int len; res = [NSMutableArray arrayWithCapacity: 10]; pName = NewHandle(0); while((cmp = FindNextComponent(cmp, fcd)) != 0) { GetComponentInfo(cmp, &ccd, pName, NULL, NULL); HLock(pName); cName = *pName; len = *cName++; cName[len] = 0; [res addObject: [NSString stringWithCString: cName]]; HUnlock(pName); } DisposeHandle(pName); return(res); } Boolean FindComponentWithName(ComponentDescription *cd, NSString *Name) { Boolean res = FALSE; char *name; ComponentDescription ccd, fcd; Component cmp = NULL; Handle pName; char *cName; int len; name = (char *)[Name cString]; bzero(&fcd, sizeof(fcd)); pName = NewHandle(0); while((cmp = FindNextComponent(cmp, &fcd)) != 0) { GetComponentInfo(cmp, &ccd, pName, NULL, NULL); HLock(pName); cName = *pName; len = *cName++; cName[len] = 0; if(strcmp(name, cName) == 0) { HUnlock(pName); DisposeHandle(pName); cd->componentManufacturer = ccd.componentManufacturer; cd->componentType = ccd.componentType; cd->componentSubType = ccd.componentSubType; cd->componentFlags = 0; cd->componentFlagsMask = 0; return(TRUE); } HUnlock(pName); } DisposeHandle(pName); return(res); } int main(int argc, char *argv[]) { NSMutableArray *List; ComponentDescription cd; char *name; NSString *str; int i, n; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; bzero(&cd, sizeof(ComponentDescription)); cd.componentType = kAudioUnitType_MusicDevice; List = FindComponentsWithType(&cd); n = [List count]; printf("---> %d objects found\n", n); for(i = 0; i < n; i++) { str = [List objectAtIndex: i]; name = (char *)[str cString]; printf("%d: >%s<\n", i, name); } printf("\n"); str = [NSString stringWithCString: "Apple: DLSMusicDevice"]; printf("The >%s< unit was ", [str cString]); if(FindComponentWithName(&cd, str)) printf("found!\n"); else printf("NOT FOUND!\n"); [pool release]; return(0); }