Как добавить звук в windows forms

Обновлено: 05.07.2024

Для начала создадим проект.

Откроем Visual Studio, далее жмем Файл→Создать→Проект, далее выбираем пункт CLR и отмечаем Приложение Windows Forms, даем имя проекта, к примеру factr и жмем Ok.

После того как мы создали проект, должна появиться пустая форма, которая должна выглядеть примерно так:

Справа должна появиться панель элементов, если ее нет, то можно включить ее в меню Вид→Панель Элементов или нажатием горячих клавиш — Ctrl + Alt + X.

На ней расположены различные элементы для вставки в форму, нам понадобятся только элементы Button (Кнопка), Label (Надпись) и TextBox (Текстовое поле). Перетащите на форму три элемента Label, Два элемента TextBox, и одну кнопку (Button), расставьте элементы примерно так:

Теперь нам нужно будет изменить текст надписей для элементов Label и Button и Задать подходящие имена классов для элементов TextBox. Для этого Выделите элемент label1, перейдите в Панель свойств, (обычно она находится под Панелью элементов, если панель выключена, включите ее в меню Вид -> Диспетчер свойств.) и задайте для данного элемента значение атрибута Text как показано на рисунке.

Задайте атрибут Text для всех элементов Label и Кнопки Button аналогичным образом. Наша форма должна принять примерно следующий вид:

Я сделал кнопку развернуть неактивной, так как изменение размеров данной формы испортит ее внешний вид, Вы также можете это сделать, щелкнув левой кнопкой мыши на пустом месте формы и в Панели свойств задать для атрибута MaximizeBox параметр False.

Теперь задайте для текстовых полей (TextBox) Атрибуты Name в Панели Свойств – для первого поля это будет num1, а для второго, соответственно num2. Тем самым мы изменили имена классов для полей TextBox, чуть позднее Вы поймете зачем.

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

Первым делом нужно добавить заголовочный файл fact.h в проект, для этого щелкаем правой кнопкой мыши в Обозревателе решений на папке Заголовочные файлы, далее меню Добавить -> Создать Элемент, вписываем название файла – fact.h и нажимаем Добавить. В данном файле будет содержаться прототип функции для вычисления факториала. Добавляем туда следующий исходный код.

Теперь наш заголовочный файл подключен к проекту, далее аналогичным образом создаем файл исходного кода fact.cpp в проект.

В него добавляем саму функцию вычисления факториала целого числа.

Теперь наш проект содержит функцию вычисления факториала, откомпилируйте его, если ошибок нет, то можно приступить к написанию обработчика событий для кнопки Button.

Открываем файл Form.h, в нем мы видим визуальное представление нашей формы. Щелкаем двойным щелчком на кнопке Button и переходим к исходному коду.

После фигурной скобки ставим абзац и приступаем к кодированию. Любой набор символов, которые мы вводим с клавиатуры в текстовое поле программы является строкой, поэтому нам нужно вытащить значение из текстового поля и привести его к целочисленному типу. Это довольно сложная процедура, но, к счастью в языке C++ уже есть множество функций, выполняющих конвертирование типов данных. Сначала нам необходимо описать и инициализировать переменную, в которой будет храниться значение числа, для которого должен быть вычислен факториал. Добавим в том место, где Вы поставили абзац следующий код:

Эта строка инициализирует переменную, которая хранит в себе число для вычисления его факториала. Далее нам нужно будет произвести вызов нашей функции fact с переменной number в качестве единственного аргумента и занести результат работы функции в новую переменную factor.

И затем преобразовать полученное значение обратно в строку и присвоить его второму текстовому полю.

Таким образом, наш простой обработчик событий будет выглядеть вот так:

Теперь можно скомпилировать и запустить готовую программу и проверить ее. Помните, что тип double в С++ может хранить число не превышающее !170.

Результат работы программы можно проверить в инженерном калькуляторе Windows.

Громкость звукового устройства определяет, насколько громко воспроизводятся звуки, как для текущего приложения, так и для всей операционной системы. Эту громкость можно регулировать для левого и правого каналов независимо с помощью функций Windows API.

Многие компьютеры оснащены звуковой картой или встроенным чипсетом, который позволяет воспроизводить цифровое аудио, например, в формате аудиофайла wav (WAV). Некоторые аппаратные средства обеспечивают одноканальный или моноканальный выход. Другое оборудование обеспечивает стереозвук с отдельными аудиоканалами для левого и правого динамиков. Для некоторых программных приложений вы можете захотеть управлять громкостью этих каналов независимо или вместе.

Более старые версии Microsoft Windows позволяют изменять громкость для всех приложений с помощью функций Windows API, которые вы можете вызывать с помощью служб вызова платформы (P/Invoke). Более современные версии операционной системы позволяют независимо изменять громкость звукового устройства для приложений, позволяя пользователю уменьшать громкость для некоторых программ и увеличивать ее для других программ.

В этой статье мы создадим проект Windows Forms, который позволит изменять звук. Мы включим возможность синхронизации левого и правого каналов или их изменения независимо. Мы также добавим кнопку отключения звука и кнопку, которая воспроизводит звук.

Функции Windows API

Мы будем использовать две функции Windows API для работы. Первый - это waveOutGetVolume. Он дает вам 32-разрядное целое значение, представляющее объемы двух каналов. Нижние шестнадцать битов содержат значение от нуля до 65 535. Ноль указывает на тишину, а 65 535 - максимально возможная громкость. Более высокие шестнадцать битов содержат аналогичное значение для правого канала. Для моно девайсов эти два значения совпадают.

Функция waveOutSetVolume позволяет изменять громкость. Опять же, вы используете 32-разрядное целое число с громкостью левого канала в битах нижнего порядка и громкостью правого канала в битах верхнего порядка.

Теперь вы можете добавить два объявления функций Windows API. Каждый из них использует целочисленный параметр без знака для громкости. Для прлучения громкости это выходной параметр.

Хотя это не имеет прямого отношения к функциям громкости устройства wave, мы также добавим кнопку отключения звука в пример программы. Я описал использование этой функции в предыдущей заметке Базовый регулятор громкости, поэтому не буду повторять информацию здесь. Чтобы добавить функцию отключения звука, добавьте следующее:

Дизайн формы Windows

Теперь мы можем добавить некоторые элементы управления в форму Windows, которые позволят пользователю изменять громкость и прослушивать эффект. Нам нужно пять элементов управления. Две панели треков позволят изменять громкость левого и правого каналов. Мы установим флажок, чтобы указать, хотим ли мы, чтобы два канала были синхронизированы автоматически. Наконец, нам нужны две кнопки. Одна включает и выключает звук. Другая воспроизводит тестовый звук, чтобы вы могли услышать изменение громкости.

На рисунке ниже показана возможная компоновка элементов управления.

Получение текущего уровня громкости

При первой загрузке формы мы хотим, чтобы на панелях треков отображалась текущая громкость для левого и правого каналов. Мы будем использовать функцию wavOutGetVolume для извлечения этой объединенной информации. Чтобы получить громкость левого канала, мы можем использовать логический побитовый оператор AND для удаления битов более высокого порядка. Для правильного канала нам нужно сдвинуть биты вправо перед использованием оператора AND. Это дает нам два шестнадцатибитных значения, которые мы можем применить к свойствам значения трекбара.

Код для этого показан ниже. Добавьте вызов ShowCurrentVolume в конструктор и создайте новый метод следующим образом:

Автобалансировка

Для флажка Автобалансировки требуется небольшой код для события CheckChanged. Если флажок снят, никаких действий не требуется, так как громкость не изменяется. Когда флажок установлен, нам нужно убедиться, что оба канала имеют одинаковую громкость. Мы могли бы сделать это, изменив нижний из двух каналов, чтобы он соответствовал верхнему, изменив больший объем, чтобы он соответствовал нижнему, или переместив оба в среднее из двух. В примере приложения я решил усреднить две громкости.

Добавьте событие CheckChanged в флажок Автобалансировки и включите код, показанный ниже.

Метод setVolume использует waveOutSetVolume для установки громкости для каждого канала в соответствии со значениями на дорожках. 32-разрядное целое число вычисляется путем сдвига значения правого канала на шестнадцать мест влево, чтобы занять биты более высокого порядка, и добавления значения левого канала в биты более низкого порядка.

Управление левым и правым каналами

Когда значение в любой из трекбаров изменится, мы немедленно обновим громкость. Если флажок Автобалансировка установлен, мы изменим другую панель треков так, чтобы эти два значения совпадали. Чтобы включить эту функцию, добавьте события прокрутки на обе панели треков и включите приведенный ниже код:

Кнопка отключения звука

Давайте быстро добавим код для кнопки отключения звука. Добавьте обработчик события нажатия, как показано ниже.

Кнопка воспроизведения

Наконец, нам нужно добавить код события щелчка для кнопки воспроизведения. Эта кнопка воспроизводит WAV-файл, чтобы можно было протестировать. Перед добавлением кода вам необходимо добавить WAV-файл в проект с помощью обозревателя решений. Достаточно любого файла, предоставленного Windows. После добавления используйте Обозреватель решений, чтобы переименовать файл в "Test.wav" и изменить свойство файла "Копировать в выходную папку" на "Копировать всегда".

Если файл теста доступен, добавьте следующий код в событие щелчка для кнопки.

Теперь вы можете выполнить программу и опробовать элементы управления. Если вы откроете утилиту микшера громкости Windows, вы увидите, что она отражает изменения громкости. В зависимости от используемой версии Windows изменения затронут либо основной уровень громкости для операционной системы, либо конкретный уровень для текущей программы. Обратите внимание, что микшер громкости показывает громкость более громкого из двух каналов для стереоустройств.

1. Установите NAudio с NuGet


Перейдите на вкладку Обзор и найдите NAudio :

NAudio Установить пакет NuGet

Из списка выберите пакет NAudio от Mark Heath и установите его, просто нажав кнопку Install. После завершения установки вы сможете импортировать пространство имен Wave NAudio в класс, где вы хотите использовать его следующим образом:

Если у вас уже установлена ​​программа NAudio, вы можете перейти к следующему шагу.

2. Понять логику записи звука

Логика, которую вам нужно будет обработать для записи аудио, минимальна, изначально вам необходимо создать экземпляр классов WaveFileWriter и WasapiLoopBackCapture. WaveFileWriter ожидает в качестве первого аргумента путь, куда должен быть записан файл wav (тот, с записанным аудио из динамиков / звуковой карты) и в качестве второго аргумента свойство WaveFormat экземпляра устройства захвата. Делая это, вы готовы записать звук, исходящий от звуковой карты, однако это не делается автоматически, так как вам нужно подключить слушателя к экземпляру устройства захвата, а именно к DataAvailable. Это событие вызывается при получении некоторого аудио, в этом обратном вызове вам нужно использовать устройство записи звука, предоставляя в качестве первого аргумента метода записи буфер и остаток от записанных байтов и сами записанные байты. Вам также необходимо утилизировать устройство записи звука, как только устройство захвата остановится, чтобы файл был доступен. Наконец, вы можете просто запустить рекордер, используя метод StartRecording.

Стоит сказать, что код асинхронный, поэтому вам не нужно заботиться в основном о многопоточности или других сложных вещах (возможно, изначально):

Чтобы остановить запись звука, вы просто запустите StopRecording метод захвата:

Запись в буфер в нужном файле прекратится, и будет создан файл wav со звуком, созданным вашей системой во время выполнения процесса. Очевидно, не забудьте воспроизвести звук во время тестирования, иначе вы ничего не услышите!

Полный пример

В этом примере мы просто создадим форму с 2 кнопками: одна для запуска рекордера (кнопка 1) и другая для ее остановки (кнопка 2). Кнопка «Стоп» изначально отключена, и она будет активирована после запуска рекордера и наоборот с помощью кнопки «Пуск». Графически форма выглядит так:

Пример записи аудио формы

Логика, которую мы реализуем, очень проста, но функциональна. Когда пользователь нажимает кнопку «Пуск», звук системы записывается, а когда пользователь нажимает кнопку «Стоп», рекордер останавливается и завершает буфер записи желаемого выходного аудиофайла. Случаи WaveFileWriter и WasapiLoopbackCapture предназначены для того, чтобы быть доступными на уровне класса, поэтому наши кнопки «Пуск» и «Стоп» имеют к ним доступ, поскольку из-за этого поведения изначально установлено нулевое значение.

Далее прикрепите слушатель щелчка к обеим кнопкам и назначьте логику соответственно. Для кнопки запуска определите переменную, которая содержит путь к выходному аудиофайлу, и переопределите WaveFileWriter и WasapiLoopbackCapture экземпляры с новым. Затем присоедините обратные вызовы onDataAvailable и onRecordingStopped к экземпляру устройства захвата и, соответственно, запишите логику. В этом случае, когда данные доступны, запишите выходной буфер в объявленный файл, используемый средством записи волн. Когда запись останавливается, она, очевидно, должна удалить экземпляр захвата. Наконец, когда пользователь нажимает кнопку остановки, экземпляр устройства записи должен просто остановить устройство записи, отключив также кнопку остановки и снова включив кнопку запуска, чтобы снова можно было записать новый файл:

1. Установите NAudio с NuGet


Перейдите на вкладку Обзор и найдите NAudio :

NAudio Установить пакет NuGet

Из списка выберите пакет NAudio от Mark Heath и установите его, просто нажав кнопку Install. После завершения установки вы сможете импортировать пространство имен Wave NAudio в класс, где вы хотите использовать его следующим образом:

Если у вас уже установлена ​​программа NAudio, вы можете перейти к следующему шагу.

2. Понять логику записи звука

Логика, которую вам нужно будет обработать для записи аудио, минимальна, изначально вам необходимо создать экземпляр классов WaveFileWriter и WasapiLoopBackCapture. WaveFileWriter ожидает в качестве первого аргумента путь, куда должен быть записан файл wav (тот, с записанным аудио из динамиков / звуковой карты) и в качестве второго аргумента свойство WaveFormat экземпляра устройства захвата. Делая это, вы готовы записать звук, исходящий от звуковой карты, однако это не делается автоматически, так как вам нужно подключить слушателя к экземпляру устройства захвата, а именно к DataAvailable. Это событие вызывается при получении некоторого аудио, в этом обратном вызове вам нужно использовать устройство записи звука, предоставляя в качестве первого аргумента метода записи буфер и остаток от записанных байтов и сами записанные байты. Вам также необходимо утилизировать устройство записи звука, как только устройство захвата остановится, чтобы файл был доступен. Наконец, вы можете просто запустить рекордер, используя метод StartRecording.

Стоит сказать, что код асинхронный, поэтому вам не нужно заботиться в основном о многопоточности или других сложных вещах (возможно, изначально):

Чтобы остановить запись звука, вы просто запустите StopRecording метод захвата:

Запись в буфер в нужном файле прекратится, и будет создан файл wav со звуком, созданным вашей системой во время выполнения процесса. Очевидно, не забудьте воспроизвести звук во время тестирования, иначе вы ничего не услышите!

Полный пример

В этом примере мы просто создадим форму с 2 кнопками: одна для запуска рекордера (кнопка 1) и другая для ее остановки (кнопка 2). Кнопка «Стоп» изначально отключена, и она будет активирована после запуска рекордера и наоборот с помощью кнопки «Пуск». Графически форма выглядит так:

Пример записи аудио формы

Логика, которую мы реализуем, очень проста, но функциональна. Когда пользователь нажимает кнопку «Пуск», звук системы записывается, а когда пользователь нажимает кнопку «Стоп», рекордер останавливается и завершает буфер записи желаемого выходного аудиофайла. Случаи WaveFileWriter и WasapiLoopbackCapture предназначены для того, чтобы быть доступными на уровне класса, поэтому наши кнопки «Пуск» и «Стоп» имеют к ним доступ, поскольку из-за этого поведения изначально установлено нулевое значение.

Далее прикрепите слушатель щелчка к обеим кнопкам и назначьте логику соответственно. Для кнопки запуска определите переменную, которая содержит путь к выходному аудиофайлу, и переопределите WaveFileWriter и WasapiLoopbackCapture экземпляры с новым. Затем присоедините обратные вызовы onDataAvailable и onRecordingStopped к экземпляру устройства захвата и, соответственно, запишите логику. В этом случае, когда данные доступны, запишите выходной буфер в объявленный файл, используемый средством записи волн. Когда запись останавливается, она, очевидно, должна удалить экземпляр захвата. Наконец, когда пользователь нажимает кнопку остановки, экземпляр устройства записи должен просто остановить устройство записи, отключив также кнопку остановки и снова включив кнопку запуска, чтобы снова можно было записать новый файл:

Читайте также: