How do you convert an iPhone OSStatus code to something useful?

前端 未结 19 1456
执念已碎
执念已碎 2020-12-05 01:45

I am getting more than a little sick of this iPhone SDK and its documentation...

I am calling AudioConverterNew

in the documentation under Returns: it says \

相关标签:
19条回答
  • 2020-12-05 02:02

    Here is the code I wrote, hope it save you some typing... er, don't know how to make it show up correctly.

    - (NSString *)OSStatusToStr:(OSStatus)st
    {
        switch (st) {
            case kAudioFileUnspecifiedError:
                return @"kAudioFileUnspecifiedError";
    
            case kAudioFileUnsupportedFileTypeError:
                return @"kAudioFileUnsupportedFileTypeError";
    
            case kAudioFileUnsupportedDataFormatError:
                return @"kAudioFileUnsupportedDataFormatError";
    
            case kAudioFileUnsupportedPropertyError:
                return @"kAudioFileUnsupportedPropertyError";
    
            case kAudioFileBadPropertySizeError:
                return @"kAudioFileBadPropertySizeError";
    
            case kAudioFilePermissionsError:
                return @"kAudioFilePermissionsError";
    
            case kAudioFileNotOptimizedError:
                return @"kAudioFileNotOptimizedError";
    
            case kAudioFileInvalidChunkError:
                return @"kAudioFileInvalidChunkError";
    
            case kAudioFileDoesNotAllow64BitDataSizeError:
                return @"kAudioFileDoesNotAllow64BitDataSizeError";
    
            case kAudioFileInvalidPacketOffsetError:
                return @"kAudioFileInvalidPacketOffsetError";
    
            case kAudioFileInvalidFileError:
                return @"kAudioFileInvalidFileError";
    
            case kAudioFileOperationNotSupportedError:
                return @"kAudioFileOperationNotSupportedError";
    
            case kAudioFileNotOpenError:
                return @"kAudioFileNotOpenError";
    
            case kAudioFileEndOfFileError:
                return @"kAudioFileEndOfFileError";
    
            case kAudioFilePositionError:
                return @"kAudioFilePositionError";
    
            case kAudioFileFileNotFoundError:
                return @"kAudioFileFileNotFoundError";
    
            default:
                return @"unknown error";
        }
    }
    
    0 讨论(0)
  • 2020-12-05 02:02

    I created an OSStatus extension that you may find useful. It logs a full error message for audio related errors, otherwise when possible the four-character-code, otherwise the OSStatus number that you could look-up in https://www.osstatus.com

    It furthers adds useful information like the file, the function and the line where the error occurred.

    Here is the code:

    let isDebug = true
    
    //**************************
    // OSStatus extensions for logging
    //**************************
    extension OSStatus {
        //**************************
        func asString() -> String? {
            let n = UInt32(bitPattern: self.littleEndian)
            guard let n1 = UnicodeScalar((n >> 24) & 255), n1.isASCII else { return nil }
            guard let n2 = UnicodeScalar((n >> 16) & 255), n2.isASCII else { return nil }
            guard let n3 = UnicodeScalar((n >>  8) & 255), n3.isASCII else { return nil }
            guard let n4 = UnicodeScalar( n        & 255), n4.isASCII else { return nil }
            return String(n1) + String(n2) + String(n3) + String(n4)
        } // asString
    
        //**************************
        func detailedErrorMessage() -> String? {
            switch(self) {
            //***** AUGraph errors
            case kAUGraphErr_NodeNotFound:             return "AUGraph Node Not Found"
            case kAUGraphErr_InvalidConnection:        return "AUGraph Invalid Connection"
            case kAUGraphErr_OutputNodeErr:            return "AUGraph Output Node Error"
            case kAUGraphErr_CannotDoInCurrentContext: return "AUGraph Cannot Do In Current Context"
            case kAUGraphErr_InvalidAudioUnit:         return "AUGraph Invalid Audio Unit"
    
            //***** MIDI errors
            case kMIDIInvalidClient:     return "MIDI Invalid Client"
            case kMIDIInvalidPort:       return "MIDI Invalid Port"
            case kMIDIWrongEndpointType: return "MIDI Wrong Endpoint Type"
            case kMIDINoConnection:      return "MIDI No Connection"
            case kMIDIUnknownEndpoint:   return "MIDI Unknown Endpoint"
            case kMIDIUnknownProperty:   return "MIDI Unknown Property"
            case kMIDIWrongPropertyType: return "MIDI Wrong Property Type"
            case kMIDINoCurrentSetup:    return "MIDI No Current Setup"
            case kMIDIMessageSendErr:    return "MIDI Message Send Error"
            case kMIDIServerStartErr:    return "MIDI Server Start Error"
            case kMIDISetupFormatErr:    return "MIDI Setup Format Error"
            case kMIDIWrongThread:       return "MIDI Wrong Thread"
            case kMIDIObjectNotFound:    return "MIDI Object Not Found"
            case kMIDIIDNotUnique:       return "MIDI ID Not Unique"
            case kMIDINotPermitted:      return "MIDI Not Permitted"
    
            //***** AudioToolbox errors
            case kAudioToolboxErr_CannotDoInCurrentContext: return "AudioToolbox Cannot Do In Current Context"
            case kAudioToolboxErr_EndOfTrack:               return "AudioToolbox End Of Track"
            case kAudioToolboxErr_IllegalTrackDestination:  return "AudioToolbox Illegal Track Destination"
            case kAudioToolboxErr_InvalidEventType:         return "AudioToolbox Invalid Event Type"
            case kAudioToolboxErr_InvalidPlayerState:       return "AudioToolbox Invalid Player State"
            case kAudioToolboxErr_InvalidSequenceType:      return "AudioToolbox Invalid Sequence Type"
            case kAudioToolboxErr_NoSequence:               return "AudioToolbox No Sequence"
            case kAudioToolboxErr_StartOfTrack:             return "AudioToolbox Start Of Track"
            case kAudioToolboxErr_TrackIndexError:          return "AudioToolbox Track Index Error"
            case kAudioToolboxErr_TrackNotFound:            return "AudioToolbox Track Not Found"
            case kAudioToolboxError_NoTrackDestination:     return "AudioToolbox No Track Destination"
    
            //***** AudioUnit errors
            case kAudioUnitErr_CannotDoInCurrentContext: return "AudioUnit Cannot Do In Current Context"
            case kAudioUnitErr_FailedInitialization:     return "AudioUnit Failed Initialization"
            case kAudioUnitErr_FileNotSpecified:         return "AudioUnit File Not Specified"
            case kAudioUnitErr_FormatNotSupported:       return "AudioUnit Format Not Supported"
            case kAudioUnitErr_IllegalInstrument:        return "AudioUnit Illegal Instrument"
            case kAudioUnitErr_Initialized:              return "AudioUnit Initialized"
            case kAudioUnitErr_InvalidElement:           return "AudioUnit Invalid Element"
            case kAudioUnitErr_InvalidFile:              return "AudioUnit Invalid File"
            case kAudioUnitErr_InvalidOfflineRender:     return "AudioUnit Invalid Offline Render"
            case kAudioUnitErr_InvalidParameter:         return "AudioUnit Invalid Parameter"
            case kAudioUnitErr_InvalidProperty:          return "AudioUnit Invalid Property"
            case kAudioUnitErr_InvalidPropertyValue:     return "AudioUnit Invalid Property Value"
            case kAudioUnitErr_InvalidScope:             return "AudioUnit InvalidScope"
            case kAudioUnitErr_InstrumentTypeNotFound:   return "AudioUnit Instrument Type Not Found"
            case kAudioUnitErr_NoConnection:             return "AudioUnit No Connection"
            case kAudioUnitErr_PropertyNotInUse:         return "AudioUnit Property Not In Use"
            case kAudioUnitErr_PropertyNotWritable:      return "AudioUnit Property Not Writable"
            case kAudioUnitErr_TooManyFramesToProcess:   return "AudioUnit Too Many Frames To Process"
            case kAudioUnitErr_Unauthorized:             return "AudioUnit Unauthorized"
            case kAudioUnitErr_Uninitialized:            return "AudioUnit Uninitialized"
            case kAudioUnitErr_UnknownFileType:          return "AudioUnit Unknown File Type"
            case kAudioUnitErr_RenderTimeout:             return "AudioUnit Rendre Timeout"
    
            //***** AudioComponent errors
            case kAudioComponentErr_DuplicateDescription:   return "AudioComponent Duplicate Description"
            case kAudioComponentErr_InitializationTimedOut: return "AudioComponent Initialization Timed Out"
            case kAudioComponentErr_InstanceInvalidated:    return "AudioComponent Instance Invalidated"
            case kAudioComponentErr_InvalidFormat:          return "AudioComponent Invalid Format"
            case kAudioComponentErr_NotPermitted:           return "AudioComponent Not Permitted "
            case kAudioComponentErr_TooManyInstances:       return "AudioComponent Too Many Instances"
            case kAudioComponentErr_UnsupportedType:        return "AudioComponent Unsupported Type"
    
            //***** Audio errors
            case kAudio_BadFilePathError:      return "Audio Bad File Path Error"
            case kAudio_FileNotFoundError:     return "Audio File Not Found Error"
            case kAudio_FilePermissionError:   return "Audio File Permission Error"
            case kAudio_MemFullError:          return "Audio Mem Full Error"
            case kAudio_ParamError:            return "Audio Param Error"
            case kAudio_TooManyFilesOpenError: return "Audio Too Many Files Open Error"
            case kAudio_UnimplementedError:    return "Audio Unimplemented Error"
    
            default: return nil
            } // switch(self)
        } // detailedErrorMessage
    
        //**************************
        func debugLog(filePath: String = #file, line: Int = #line, funcName: String = #function) {
            guard isDebug, self != noErr else { return }
            let fileComponents = filePath.components(separatedBy: "/")
            let fileName = fileComponents.last ?? "???"
    
            var logString = "OSStatus = \(self) in \(fileName) - \(funcName), line \(line)"
    
            if let errorMessage = self.detailedErrorMessage() { logString = errorMessage + ", " + logString }
            else if let errorCode = self.asString()           { logString = errorCode    + ", " + logString }
    
            NSLog(logString)
        } // debugLog
    } // extension OSStatus
    

    And usage would be:

    //***** Create audioGraph
    NewAUGraph(&audioGraph).debugLog()
    
    //***** Testing .debugLog() OSStatus extension
    kAUGraphErr_InvalidAudioUnit.debugLog()
    OSStatus(560226676).debugLog()
    OSStatus(-125).debugLog()
    

    The resulting logs for the three tests:

    2018-11-12 19:41:48.427606+0100 HexaSynth[5875:102611] AUGraph Invalid Audio Unit, OSStatus = -10864 in SoftSynthesizer.swift - init(soundFontFileName:), line 40

    2018-11-12 19:41:48.428403+0100 HexaSynth[5875:102611] !dat, OSStatus = 560226676 in SoftSynthesizer.swift - init(soundFontFileName:), line 41

    2018-11-12 19:41:48.428638+0100 HexaSynth[5875:102611] OSStatus = -125 in SoftSynthesizer.swift - init(soundFontFileName:), line 42

    0 讨论(0)
  • 2020-12-05 02:05

    for Security framework on IOS given that SecCopyErrorMessageString is missing on the platform it's DYI

    add error codes at the bottom of

    https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices

    to your very own switch.

    for example

            let status : OSStatus = SecItemAdd(query as CFDictionaryRef, nil)
            switch status {
            case errSecSuccess:
                return nil
            case errSecAuthFailed:
                // that's the result of dumping kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly into the query
                return "changing app lock type on a device without fingerprint and/or passcode setup is not allowed".localized
            default:
                return "unhandled case: implement this"
            }
    
    0 讨论(0)
  • 2020-12-05 02:06

    This might be help.

    static NSString *stringForOSStatus(OSStatus status)
    {
        NSBundle *bundle = [NSBundle bundleWithIdentifier:@"com.apple.security"];
        NSString *key = [NSString stringWithFormat:@"%d", status];
        return [bundle localizedStringForKey:key value:key table:@"SecErrorMessages"];
    }
    
    0 讨论(0)
  • 2020-12-05 02:06

    This is what you need https://www.osstatus.com/. Just search for given OSStatus.

    0 讨论(0)
  • 2020-12-05 02:07

    OSStatus is a signed integer value. You cannot convert or "cast" it to a string. You can convert it to a NSError like this:

    NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:osStatus userInfo:nil];

    0 讨论(0)
提交回复
热议问题