Как сохранить cfdictionaryref в NSDictionary - PullRequest
2 голосов
/ 10 мая 2011

Я пытаюсь сохранить параметры аудиоустройства в NSDictionary, используя следующий метод.

OSStatus AudioEngineModel::getParameterStateOfEffect(NSInteger nEffectID, CFDictionaryRef * pcfDictRef_ParameterData, UInt32* pun32DataSize)
{
    Boolean outWritable;
    OSStatus err= AudioUnitGetPropertyInfo(m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, &*pun32DataSize, &outWritable);
    if(err != noErr)
    {
        NSLog(@"ERROR AudioEngineModel::getParameterStateOfEffect:: AudioUnitGetPropertyInfo\n");
        return err;
    }

    *pcfDictRef_ParameterData= (CFDictionaryRef)malloc(*pun32DataSize);

    err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)*pcfDictRef_ParameterData, &*pun32DataSize);
    if(err != noErr)
    {
        NSLog(@"ERROR AudioEngineModel::getParameterStateOfEffect:: AudioUnitGetProperty\n");
        return err;
    }    


    m_cfDictRef_ParameterData= *pcfDictRef_ParameterData; 
    m_pdParameterData= [NSDictionary dictionaryWithDictionary:(NSDictionary*)m_cfDictRef_ParameterData];

    return noErr;                               
}

Все прекрасно работает до вызова NSDictionary dictionaryWithDictionary:, где я последовательно получаю exc_bad_access.

Я называю этот метод так.

CFDictionaryRef cfDictRef_ParameterData;
UInt32 un32DataSize;    
OSStatus err= [[[NSApp delegate] getMainController] getParameterStateOfEffect:m_nEffectTypeID parameterData:&cfDictRef_ParameterData dataSize:&un32DataSize];

1 Ответ

3 голосов
/ 10 мая 2011

Ваша проблема в следующих строках:

*pcfDictRef_ParameterData= (CFDictionaryRef)malloc(*pun32DataSize);

err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)*pcfDictRef_ParameterData, &*pun32DataSize);

В malloc нет необходимости.AudioUnitGetProperty будет возвращать CFDictionaryRef для kAudioUnitProperty_ClassInfo.Поскольку pcfDictRef_ParameterData уже является CFDictionaryRef *, вам не нужно ничего выделять.

Вам нужно передать указатель на CFDictionaryRef (не разыменованный) в AudioUnitGetProperty.Поэтому вторая строка должна быть:

err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)pcfDictRef_ParameterData, pun32DataSize);

вместо.

...