Реализация IBasicAudioEffect в C ++ - PullRequest
0 голосов
/ 09 мая 2019

Я хотел бы реализовать пользовательский эффект UWP AudioGraph.

Я успешно реализовал его в C #.Я следовал за этим документом .Но эту реализацию C # очень трудно оптимизировать.

Я бы хотел реализовать эффект в C ++ вместо C #.Но я не могу найти хороший учебник.Я добавил к своему решению проект C ++ Windows Runtime Component.И я добавил класс, который реализует 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?

  • Тогда как мне получить доступ к значениям с плавающей запятой образцов?

  • Как правильно очистить память /уничтожить объекты в конце моего метода, чтобы не было утечки памяти?

1 Ответ

1 голос
/ 15 мая 2019

Я закончил с этой реализацией метода 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...