音效相关的跟其他3A的处理有点差异,需要prepare的过程,内部进行一些buffer的申请。
a. 创建handle
samiCore = new SAMICore(); // 创建句柄 SAMICoreBinaryContextCreateParameter parameter = new SAMICoreBinaryContextCreateParameter(); parameter.resourceBuffer = FunctionHelper.readBinaryFile(presetFileName,context); parameter.resourceLen = parameter.resourceBuffer.length; int ret = samiCore.SAMICoreCreateHandleByIdentify(SAMICoreIdentify.SAMICoreIdentify_Processor_ContextWithBinaryRes,parameter); if (ret != SAMICoreCode.SAMI_OK) { System.out.println("SAMICoreCreateHandleByIdentify failed, ret " + ret); return ret; }else{ createHandleDone = true; }
b. prepare
SAMICoreProcessorPrepareParameter prepareParameter = new SAMICoreProcessorPrepareParameter(); prepareParameter.blockSize = max_block_size; prepareParameter.sampleRate = sampleRate; prepareParameter.numChannel = numChannel; SAMICoreProperty property = new SAMICoreProperty(); property.id = SAMICorePropertyId.SAMICorePropertyID_Processor_ContextPrepare; property.type = SAMICoreDataType.SAMICoreDataType_ContextPrepareParameter; property.dataObjectArray = new Object[1]; property.dataObjectArray[0] = prepareParameter; property.dataArrayLen = 1; ret = samiCore.SAMICoreSetProperty(SAMICorePropertyId.SAMICorePropertyID_Processor_ContextPrepare, property); if (ret != SAMICoreCode.SAMI_OK) { System.out.println("SAMICorePropertyID_Processor_ContextPrepare failed, ret " + ret); return ret; }
//初始化处理buffer inBlock = new SAMICoreBlock(); outBlock = new SAMICoreBlock(); inBlock.dataType = SAMICoreDataType.SAMICoreDataType_AudioBuffer; inAudioBuffer = new SAMICoreAudioBuffer(); inAudioBuffer.numberChannels = numChannel; inAudioBuffer.numberSamples = max_block_size; inAudioBuffer.data = new float[inAudioBuffer.numberChannels][inAudioBuffer.numberSamples]; inBlock.audioData = new SAMICoreAudioBuffer[1]; inBlock.audioData[0] = inAudioBuffer; outBlock.dataType = SAMICoreDataType.SAMICoreDataType_AudioBuffer; outAudioBuffer = new SAMICoreAudioBuffer(); outAudioBuffer.numberChannels = numChannel; outAudioBuffer.numberSamples = max_block_size; outAudioBuffer.data = new float[outAudioBuffer.numberChannels][outAudioBuffer.numberSamples]; outBlock.audioData = new SAMICoreAudioBuffer[1]; outBlock.audioData[0] = outAudioBuffer;
for (int numSamples = 0; numSamples < totalNumSamples;) { if((numSamples + inAudioBuffer.numberSamples) > totalNumSamples) { inAudioBuffer.numberSamples = totalNumSamples - numSamples; outAudioBuffer.numberSamples = totalNumSamples - numSamples; } for (int i = 0; i < inAudioBuffer.numberChannels; i++) { for (int j = 0; j < inAudioBuffer.numberSamples; j++) { inAudioBuffer.data[i][j] = in_planar_float_data[i][numSamples + j]; } } int ret = samiCore.SAMICoreProcess(inBlock, outBlock); if (ret != SAMICoreCode.SAMI_OK) { System.out.println("DenoiseV2 process audio data failed, ret " + ret); return ret; } for (int i = 0; i < inAudioBuffer.numberChannels; i++) { for (int j = 0; j < inAudioBuffer.numberSamples; j++) { out_planar_float_data[i][j+numSamples] = outAudioBuffer.data[i][j]; } } // update index numSamples = numSamples + inAudioBuffer.numberSamples;
预置音效的使用场景一般是在k歌场景,需要实时更新配置,sdk提供了动态更新的接口,接口保证了线程安全,可在不同于process的线程更新,并且内部做了平滑处理。
SAMICoreBinaryContextCreateParameter updateParameter = new SAMICoreBinaryContextCreateParameter(); updateParameter.resourceBuffer = FunctionHelper.readBinaryFile(updatePresetFileName,context); updateParameter.resourceLen = updateParameter.resourceBuffer.length; SAMICoreProperty update_property = new SAMICoreProperty(); update_property.dataObjectArray = new Object[1]; update_property.dataObjectArray[0] = updateParameter; update_property.dataArrayLen = 1; update_property.type = SAMICoreDataType.SAMICoreDataType_ResourceParameter; update_property.id = SAMICorePropertyId.SAMICorePropertyID_Processor_ContextUpdateFromBinaryRes; int ret = samiCore.SAMICoreSetProperty(SAMICorePropertyId.SAMICorePropertyID_Processor_ContextUpdateFromBinaryRes, update_property); if(ret != SAMICoreCode.SAMI_OK) { System.out.println("SAMICorePropertyID_Processor_ContextUpdateFromBinaryRes failed, ret " + ret); return ret; }
if (createHandleDone){ samiCore.SAMICoreDestroyHandle(); }