2013-08-14 4 views
2

Я хочу играть звук «по требованию». Я хочу программировать простую драм-машину.Сделайте DirectShow воспроизведением звука из буфера памяти

Можно ли сделать DirectShow чтения из буфера памяти (объект, созданный с ++)

Я имею в виду:

Создать буфер, позволяет сказать, 40000 позиций, тип double (я не Не знаю, какой тип данных использовать в качестве звука, поэтому я могу ошибаться в double).

40000 позиций может составлять 1 секунду воспроизведения.

Объект DirectShow должен читать эту позицию буфера по положению снова и снова. и буфер будет содержать фактическое значение выхода звука. Например, (синусоидальный выход):

{0, 0.4, 0.7, 0.9, 0.99, 0.9, 0.7, 0.4, 0, -0,4, -0.7, -0.9, -0.99, -0.9, -0.7, -0.4, 0}

Разрешение этой звуковой последовательности, вероятно, не очень хорошо, но это только для отображения того, что я имею в виду.

Возможно ли это? Я не могу найти никаких примеров или информации об этом в Google.

Редактировать: При работе с DirectShow и потоковым видео (камера UBS) я использовал что-то под названием Sample Grabber. Это называется методом для каждого кадра с камеры. Я ищу что-то подобное, но для музыки, и что-то, что вызывается до того, как музыка будет воспроизведена. Thanks

+0

меня Буфер Источник фильтра (только 32-разрядный). Это исходный фильтр, который содержит COM-интерфейс, который вы можете вызвать для ввода данных в него. Если хотите, дайте мне знать. –

ответ

1

Вы хотите передать свои данные и впрыскивать данные в конвейер DirectShow.

По дизайну внешний интерфейс DirectShow не обеспечивает доступ к потоковым данным. Управляющий код создает топологию, подключает фильтры, настраивает их и контролирует состояние конвейера. Все данные транслируются за кулисами, фильтры передают части данных друг другу, и это сводится к потоку данных.

Образец Grabber - это вспомогательный фильтр, который позволяет захватывать копию данных, проходящих через определенную точку графика. Поскольку в противном случае данные полезной нагрузки недоступны для управления кодом, Sample Grabber получил популярность, особенно. для захвата видеофрагментов из «недоступного» потока, воспроизведения в реальном времени или файла.

Теперь, когда вы хотите сделать наоборот, поместите свои собственные данные в конвейер, концепция Sample Grabber не работает. Одной вещью является копирование данных, а проактивное размещение ваших собственных данных в потоке - другое.

Для ввода собственных данных вы обычно помещаете свой собственный фильтр в конвейер, который генерирует данные. Вы хотите генерировать аудио данные PCM. Вы выбираете, где вы берете его из поколения, читаете из файла, памяти, сети, зацикливаете. Вы заполняете буферы, добавляете отметки времени, и вы доставляете звуковые буферы к фильтрам нисходящего потока. Типичной отправной точкой является PushSource Filters Sample, которая представляет концепцию фильтра, производящего видеоданные. Аналогичным образом вы хотите создать аудиоданные PCM.

Смежный вопрос:

Смежные вопросы