Uwp 在C+中实现iba效果+;

Uwp 在C+中实现iba效果+;,uwp,c++-cx,Uwp,C++ Cx,我想实现一个UWP听力图自定义效果 我在C#中成功地实现了它。我跟着。 但这种C#实现很难优化 我想用C++代替C语言来实现这个效果。 但是我找不到好的教程。我把我的解决方案添加到C++ Windows运行时组件项目中。我添加了一个实现IBasicAudioEffect的类 以下是我的ProcessFrame方法实现: void PanningCustomEffect::ProcessFrame(ProcessAudioFrameContext^ context) { if (_fram

我想实现一个UWP听力图自定义效果

我在C#中成功地实现了它。我跟着。 但这种C#实现很难优化

<>我想用C++代替C语言来实现这个效果。 但是我找不到好的教程。我把我的解决方案添加到C++ Windows运行时组件项目中。我添加了一个实现IBasicAudioEffect的类

以下是我的ProcessFrame方法实现:

void PanningCustomEffect::ProcessFrame(ProcessAudioFrameContext^ context)
{
    if (_frame == nullptr)
    {
        if (context == nullptr)
        {
            throw ref new InvalidArgumentException("context");
        }
        _frame = context->InputFrame;
    }

    AudioBuffer^ inputBuffer = _frame->LockBuffer(AudioBufferAccessMode::ReadWrite);
    IMemoryBufferReference^ inputReference = inputBuffer->CreateReference();

    // TODO: here
}
我有3个问题:

  • 我如何获得IMemoryBufferByteAccess的引用

  • 那么我如何访问样本的浮点值呢

  • 如何在我的方法结束时正确清理内存/销毁对象,以避免内存泄漏


我最终实现了ProcessFrame方法:

AudioBuffer^ buffer = _frame->LockBuffer(AudioBufferAccessMode::ReadWrite);
IMemoryBufferReference^ bufferReference = buffer->CreateReference();

ComPtr<IMemoryBufferByteAccess> memoryBufferByteAccess;
if (reinterpret_cast<IUnknown*>(bufferReference)->QueryInterface(IID_PPV_ARGS(&memoryBufferByteAccess)) != S_OK)
{
    throw ref new Platform::InvalidCastException("Unable to get the IMemoryBufferByteAccess interface.");
}

BYTE* data;
UINT32 capacity;
memoryBufferByteAccess->GetBuffer(&data, &capacity);

float* floatData = (float*)data;
const int floatCapacity = capacity / sizeof(float);
for (int i = 0; i < floatCapacity; i++)
{
    float sample = floatData[i];

    // ...

    floatData[i] = sample;
}

delete bufferReference;
delete buffer;
AudioBuffer^buffer=\u frame->LockBuffer(AudioBufferAccessMode::ReadWrite);
IMemoryBufferReference^bufferReference=buffer->CreateReference();
ComPtr memoryBufferByteAccess;
if(reinterpret_cast(bufferReference)->查询接口(IID_PPV_ARGS(&memoryBufferByteAccess))!=S_OK)
{
throw ref new Platform::InvalidCastException(“无法获取IMemoryBufferByteAccess接口”);
}
字节*数据;
UINT32容量;
memoryBufferByteAccess->GetBuffer(&data,&capacity);
浮点*浮点数据=(浮点*)数据;
常量int floatCapacity=容量/sizeof(float);
对于(int i=0;i
与您的问题无关,但为什么要将此类API用于音频效果?请使用。自动引用计数应该负责清理。我无法使用safe_cast。我使用了reinterpret_cast和QueryInterface()来代替。我是否应该使用Release()?@MichaelChourdakis我正在UWP平台上用C#开发一个音频创建应用程序。它大量使用音频图API。我试图重写C++中的一些性能关键组件…我在Windows GiTuub中发布了这个请求: