Сайт о телевидении

Сайт о телевидении

» » Внутренняя ошибка устройства mme. Ошибки iTunes (причины и решения). Open - открывание устройства

Внутренняя ошибка устройства mme. Ошибки iTunes (причины и решения). Open - открывание устройства

Изменить > Установки > Аудиооборудование (Edit > Preferences > Audio Hardware). Закладка: Аудиооборудование / Audio Hardware предназначена для управления аппаратными звуковыми устройствами. Когда подключается аудиооборудование, в этом диалоговом окне загружаются настройки оборудования для данного типа устройства, такие как вход по умолчанию, выход по умолчанию, основной тактовый генератор, задержка и частота дискретизации.
Класс устройства (Device Class) : выбираем драйвер для звуковой платы, которую планируем использовать. В Windows ASIO драйвера поддерживающиеся профессиональными картами и MME драйвера обычно поддерживающиеся стандартными картами. В Mac OS CoreAudio драйвера поддерживающиеся как профессиональными, так и стандартными картами.
Предпочтительно использовать драйверы ASIO и CoreAudio, так как они обеспечивают более высокую эффективность и меньшую задержку. Можно также вести мониторинг аудио в процессе записи и мгновенно отслеживать громкость, панорамирование и изменение эффектов во время воспроизведения.
*Эта опция важна, так как если мы используем обычный звуковой кодек, и если в данном пункте будет выбран ASIO драйвер, вместо MME. То на таймлайне при нажатии кнопки воспроизведения, не запустится плейбек.
Ввод по умолчанию (Default Input) : Нет входного сигнала (No Input).
*Если у вас воспроизведение на таймлайне идет с повышенной скоростью (или воспроизведение и движение плейхэда происходит скачками, заикается звук и т.д.), а также появляется ошибка: Audio hardware I/O overloaded at 00:00:00:001 in "Adobe Player".

Или получаем сообщение: Внутренняя ошибка устройства MME. Открыть настройки аудиооборудования?
То при выставленном Класс устройства: MME (а не ASIO), выбираем из выпадающего списка, Вход по умолчанию: Нет входного сигнала (Default Input: No Input), вместо Цифровое аудио (S/PDIF) (Sound Blaster X-Fi Xtreme Audio), или Microphone (Realtek High Definition Audio) (Not working) / Микрофон (Realtek High Definition Audio) (Не работает), или FrontMic (Realtek High Definition Audio) (Not working).


Вывод по умолчанию (Default Output) :

Основной тактовый генератор (Master Clock) . Для параметра «Основной тактовый генератор» выберите вход или выход, с которым требуется синхронизировать другое цифровое аудиооборудование (для точного сопоставления сэмплов).
Задержка (Latency) . Для параметров «Размер буфера ввода-вывода» (ASIO и CoreAudio) или «Задержка» (MME) укажите минимально возможное значение, при котором не возникает пропусков аудио. Идеальное значение зависит от быстродействия системы, поэтому его необходимо найти экспериментальным путем.

Выбираем частоту дискретизации для аудиооборудования.
*Если у вас выставлена частота отличная от 48кГц, или при выборе Ввод по умолчанию: Микрофон (Realtek High Definition Audio), будут два значения: ввод 44100Гц/вывод 96000Гц то могут быть проблемы с вопроизведением на таймлайне программы Adobe Premiere Pro CC 2015.
Нажимаем на кнопку: Настройки... (Settings) . Появится окно: Звук с закладкой - Воспроизведение. Здесь можно выбрать устройство воспроизведения, параметры которого нужно изменить.

Закладка: Запись.

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

Закладка: Связь. Windows может уменьшить громкость различных звуков при использовании компьютера для разговора по телефону.

Отображение выхода (Output Mapping) - здесь можно указать целевой динамик в аудиосистеме компьютера для каждого поддерживаемого аудиоканала.


*Установки для устройств CoreAudio с малой задержкой, поддерживают следующие режимы: только вход, только выход или полный дуплекс / Master Clock. Можно изменить такие свойства, как основной тактовый генератор / Clock Source (MOTU, SPDIF и ADAT) и размер буфера ввода-вывода / I/O Buffer Size (малая задержка, 32 сэмпла).
*В этом выпуске Adobe Premiere Pro встроено высокоэффективное ядро работы со звуком из Adobe Audition, которое обеспечивает более удобное и функциональное редактирование звука. Также реализованы и другие новые функции: более быстрая настройка записи закадрового голоса, улучшенный экспорт многоканального аудио и более интуитивный пользовательский интерфейс для маршрутизации аудио. Новый интерфейс маршрутизации аудио позволяет лучше контролировать процесс визуального назначения каналов вывода для стандартных, монофонических, адаптивных дорожек и дорожек 5.1. В рабочем процессе «Изменить клип» реализована матрица для сопоставления доступных аудиоканалов в исходном файле с каналами и объектами дорожки в клипе. Кроме того, теперь Premiere Pro поддерживает широкий ряд звукового оборудования в режиме Plug-and-play, в том числе ASIO и MME (Windows) и CoreAudio (Mac), и имеет заранее загруженные конфигурации для устройств такого типа.

Ошибка компиляции в программе Adobe Premiere Pro является одной из самых популярных среди пользователей. Отображается она при попытке экспортировать созданный проект на компьютер. Процесс может прерваться сразу или через определенное время. Давайте разберемся в чем же дело.

Почему возникает ошибка компиляции в программе Adobe Premiere Pro

Ошибка кодека

Довольно часто эта ошибка возникает из-за несоответствия формата для экспорта и установленного в системе пакета кодеков. Для начала попробуйте сохранить видео в другом формате. Если нет, удалите предыдущий пакет кодеков и установите новый. Например QuickTime , который хорошо сочетается с продуктами из линейки Adobe.

Заходим в «Панель управления-Установка и удаление программ» , находим ненужный пакет кодеков и удаляем стандартным способом.

Затем идем на официальный сайт QuickTime , скачиваем и запускаем установочный файл. После завершения инсталляции перегружаем компьютер и запускаем Adobe Premiere Pro.

Недостаточно свободного места на диске

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

Или экспортируем проект в другое место.

Кстати этим методом можно воспользоваться даже если места на диске достаточно. Иногда помогает в решении данной проблемы.

Изменить свойства памяти

Иногда причиной данной ошибки может послужить нехватка памяти. В программе Adobe Premiere Pro есть возможность немного увеличить ее значение, однако следует отталкиваться от объема общей памяти и оставить какой-то запас для работы других приложений.

Заходим в «Edit-Preferences-Memory-RAM available for» и выставляем нужное значение для Premiere.

Нет прав для сохранения файлов в этом месте

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

Имя файла не является уникальным

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

Бегунки в разделах Sourse и Output

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

Решение проблемы сохраняя файл частями

Довольно часто при возникновении данной проблемы пользователи сохраняют видео файл частями. Для начала его нужно разрезать на несколько частей используя инструмент «Лезвие» .

Затем с помощью инструмента «Выделение» отмечаем первый отрывок и экспортируем его. И так со всеми частями. После чего части видео опять загружаются в программу Adobe Premiere Pro и соединяются. Зачастую проблема исчезает.

Неизвестные ошибки

Если ничего не помогло, необходимо обратиться в службу поддержки. Так как в Adobe Premiere Pro часто случаются ошибки, причина которых относится к ряду неизвестных. Решить их обычному пользователю не всегда представляется возможным.

Сервисы USSD являются давно принятыми стандартами для общения абонентов сотовых сетей с сервисными серверами. Отправка сообщений USSD напоминает общение с ботами в Telegram и других сервисах, где они получили широкое распространение. Отправляя команду, пользователь получает ответ – это могут быть определенные данные или информация об исполнении запрошенной услуги.

Многие пользователи смартфонов и телефонов даже не предполагают, что такое USSD-сервис взаимодействия, при этом регулярно им пользуясь. Проверка баланса, смена тарифного плана, подключение услуг – это все можно выполнить у большинства операторов мобильной связи через USSD-команды, такие как: *100#, *135#, *105*5# и тысячи других.

При обращении к сервису USSD, пользователь может столкнуться с ошибкой следующего содержания: «Неполадки подключения или неверный код MMI». В такой ситуации необходимо попробовать отправить запрос снова, убедившись в его правильности. Если вновь запросить данные или выполнение команды не получилось, необходимо устранить неполадки подключения.

Увидеть ошибку о неверном коде MMI можно на Андроиде, при этом нет разницы, какой сотовый оператор используется: Билайн, МТС, Мегафон или любой другой. Избавиться от ошибки должен помочь один из способов, описанных ниже.

Неверный код MMI из-за бага в Android

Компания Google активно доводит Андроид до совершенства, но это не спасает от появления различных багов, особенно после внедрения разработчиками смартфонов своих собственных сервисов, оболочек и установки пользователем сторонних приложений. В результате, может появиться ошибка MMI из-за багов в системе, в такой ситуации исправить ее легко:

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

Неполадки подключения MMI по вине сотовой связи

Часто ошибка «Неполадки подключения или неверный код MMI» возникает из-за проблемы с сим-картой или сотовой связью. Вытащите карточку из смартфона и осмотрите ее на наличие повреждений, а также на предмет загрязнения контактов, при необходимости протрите их. Также обратите внимание на контактную площадку в самом смартфоне, и при необходимости почистите ее. Далее установите сим-карту на место и вновь попробуйте отправить USSD-запрос.

Если очистка контактов сим-карты не помогла решить проблему, можно попробовать установить фиксированный тип сети. Не исключено, что проблема наблюдается из-за плохой связи и постоянной потери сигнала сотовой связи. В такой ситуации в смартфоне на Android необходимо зайти в:

«Настройки» - «Еще» - «Беспроводные сети» - «Мобильные сети» - «Тип сети»

Выберите один из доступных типов сети, вместо установленного по умолчанию. Например, если смартфон взаимодействует с оператором через LTE, поставьте 2G или 3G.

Важно: Попробуйте обратиться к USSD сервису со всех типов сети.

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

Дополнительные способы устранения ошибки MMI на Андроид

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

Еще один способ, который часто помогает избавиться от ошибки с неверным кодом MMI – это отправка потенциально ошибочного запроса. Рекомендуется направить вместо запроса «*100#» команду «*100#,», то есть с запятой в конце. Чтобы поставить запятую на клавиатуре смартфона при наборе номера, необходимо зажать «звездочку».

Если ошибка не пропадает после попытки ее исправить всеми способами, описанными выше, можно попробовать сбросить телефон до заводских настроек или полностью его обнулить. Обратите внимание, что в таком случае некоторые данные могут быть безвозвратно утеряны.

Бывает, что при попытке позвонить, отослать смс или сделать запрос оператору ваш телефон выдаёт сообщение «Проблема подключения или недействительный код mmi » . Данное сообщение может появиться в самый неподходящий момент, и вызвать кучу неудобств, особенно когда ваше дело не терпит отлагательств. В этом материале я расскажу, что это за проблема неверного кода mmi, а также поделюсь лучшими методами того, как устранить неполадки подключения или неверный код MMI, сделав так, чтобы ваш Андроид телефон работал долго и надёжно.

Код MMI (Man-Machine Interface – «Интерфейс Человек-Машина») используется для формулировки USSD запросов, позволяющих организовывать интерактивное взаимодействие между абонентами сети и сервисными приложениями оператора. Пользователь использует MMI чтобы узнать баланс, пополнить счёт, подключить или отключить какую-либо услугу, перейти на другой тарифный план и так далее.

Обычно код MMI начинается со звёздочки и заканчивается решёткой, при сложных запросах в качестве разделителя также используется звёздочка.

Проблема подключения или недействительный код mmi – причины и решения

Данная ошибка может встретиться у разных мобильных операторов и у разных мобильных устройств, проявляя себя в виде сообщения «Неполадки подключения или неверный код MMI», «Недействительный код MMI», «Connection problem or invalid MMI» и других.

Часто проблема с кодом mmi возникает внезапно, и так же внезапно может пропасть, оставляя пользователя в недоумении насчёт реальных источников её появления. Ниже я перечислю список существующих причин возникновения проблемы, а также расскажу о способах устранения неисправности.

Нестабильная работа 3G-сетей оператора

Работа сегодняшних 3G-сетей России, Украины и других постсоветских стран ещё далека от идеальной. Бывают сбои, потери сигнала, ненадёжная работа оборудования и прочие неприятности, которые проявляют себя на вашем устройстве в виде переключения значка сети с 3G на 2G и обратно.

Чтобы решить проблему неполадок подключения или неверного кода MMI, достаточно отключить на время 3G-подключение, дав вашему оператору время на исправление неполадок.

Физический износ сим-карты вызывает неполадки подключения или неверный код MMI

Одна из наиболее распространённых проблем. Если сим-карта у вас работает много лет, или часто вынимается и вставляется, тогда она может утратить свою работоспособность вследствие износа. Попробуйте подключить её к другому телефону и проверить её работоспособность. Если на другом телефоне наблюдается похожая проблема с неверным кодом MMI, тогда можно попробовать протереть её контакты, а в случае продолжения проблемы – обратиться в офис своего мобильного оператора за заменой (специалисты рекомендуют менять симку каждые 2 года).

Неполадки с настройками устройства

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

  1. Попробуйте перезагрузить устройство, а если проблема остаётся – попробуйте выполнить полный сброс данных.
  2. Зайдите в «Настройки» — «Архивация и сброс» — «Сброс данных» — «Сброс устройства» (иначе «Настройки» — «Резервное копирование» — «Сброс данных»).

Временные неполадки у мобильного оператора

В этом случае остаётся только подождать. Можно позвонить к оператору и узнать, насколько долго будет наблюдаться ошибка с MMI.

Работа некоторых приложений

Некоторые из скачанных извне приложений могут являться причиной возникновения ошибки с неполадками подключения или неверного кода MMI. Чтобы подтвердить или опровергнут данное подозрение, загрузите своё устройство в безопасном режиме и попробуйте осуществить запрос к оператору. Если он пройдёт нормально – значит виновато какое-то свежее приложение из установленных на телефоне, которое необходимо будет удалить.

Как на вашем устройстве узнайте на сайте производителя вашего гаджета. На моём, Samsung это делается так.

  • Сначала необходимо выключить устройство, затем нажать кнопку его включения, а после того, как устройство включится, необходимо зажать кнопку «Громкость вниз» на несколько секунд (пока происходит показ логотипов разработчика).
  • После таких действий ваш смартфон (планшет) загрузится в безопасном режиме (вы увидите внизу экрана надпись об этом), и вы сможете протестировать его работу.

Заключение

Как мы можем видеть, неполадки подключения и неверный код MMI обычно обусловлены нестабильностью сетей мобильного оператора, а также физическим износом sim-карты. Причинами проблемы могут выступать и неверные настройки телефона, а также сторонние приложения, способные вызывать сбои в работе мобильного устройства. Если наблюдается подобная ошибка, то, прежде всего, попробуйте связаться с вашим мобильным оператором – вполне возможно, что причина не у вас, а у него.

Вконтакте

По желанию программы звуковая подсистема может использовать три варианта уведомлений: установку объекта программного события (event), вызов заданной программной функции (callback) либо посылку сообщения заданному окну или задаче (thread). В первом варианте программа получает информацию лишь о самом факте некоторого события в звуковой подсистеме и сама должна выяснить, что именно произошло; во втором и третьем вариантах передаются код события и уточняющая информация.

Звуковая подсистема передает программе уведомления о событиях трех видов: успешное открытие устройства, успешное его закрытие и завершение обработки очередного буфера из очереди драйвера. Строго говоря, полностью асинхронным является только последнее событие; первые два возникают сразу же после успешного открытия и закрытия устройства и передаются в программу еще до возврата из соответствующих интерфейсных функций.

Уведомление посылкой сообщения окну или задаче

Звуковая подсистема посылает заданному окну или задаче сообщение Windows, код которого отражает наступившее событие, передавая в параметрах сообщения ключ открытого звукового устройства и дополнительную информацию о событии. Сообщение посылается асинхронно при помощи функций PostMessage или PostThreadMessage и выбирается из очереди окна или задачи наравне с прочими сообщениями Windows.

Имена констант для кодов сообщений имеют вид MM_WxM_event , где x - тип устройства (буква I - для устройства ввода или O - для устройства вывода), а event - тип события:

Сообщения MM_WxM_OPEN и MM_WxM_CLOSE посылаются устройствам обоих типов, а MM_WIM_DATA и MM_WOM_DONE - только устройствам ввода или вывода соответственно.

Во всех сообщениях параметр wParam передает ключ устройства, породившего событие. В сообщениях DATA /DONE параметр lParam передает указатель заголовка возвращаемого звукового буфера.

Сообщения звуковой подсистемы не требуют возврата значения обрабатывающей их функцией.

Уведомление вызовом программной функции

Звуковая подсистема вызывает заданную программную функцию, передавая в ее аргументах код и параметры события. Прототип вызываемой функции имеет следующий вид:

void CALLBACK CallbackProc (HWAVEx Handle, UINT Msg, DWORD Instance, DWORD Param1, DWORD Param2);

Handle - ключ звукового устройства. Имеет тип HWAVEIN или HWAVEOUT ; допустимо использование универсального типа HWAVE .

Msg - код события. Константы для кодов событий имеют те же имена, что и константы кодов сообщений для окон/задач, но без префикса MM_ (WIM_OPEN , WOM_DONE и т.п.). Фактически сейчас они определяются в MMSYSTEM.H как эквивалентные константам с префиксом MM_ , однако в будущем на это рассчитывать не стоит.

Instance - 32-разрядное информационное слово, указанное программой при открытии устройства. Звуковая подсистема никак не использует это значение, а лишь передает его при каждом вызове функции.

Param1 , Param2 - параметры события. Для событий OPEN и CLOSE значение Param1 равно нулю; для событий DATA и DONE этот параметр передает указатель заголовка возвращаемого звукового буфера. Значение Param2 в текущей реализации всегда равно нулю.

Функция может вызываться в контексте обработчика прерывания, поэтому безопасно может использовать лишь ограниченный набор функций Windows: EnterCriticalSection , LeaveCriticalSection , midiOutLongMsg , midiOutShortMsg , OutputDebugString , PostMessage , PostThreadMessage , SetEvent , timeGetSystemTime , timeGetTime , timeKillEvent , timeSetEvent . Обращение к другим системным функциям, как и к функциям звуковой подсистемы, может вызвать непредсказуемые последствия.

Для вызова функции звуковая подсистема создает отдельную задачу (thread) с повышенным (ABOVE_NORMAL) приоритетом. В отличие от передачи сообщений, которые обрабатываются в порядке очереди, вызов функции происходит параллельно с работой остальных задач процесса, поэтому необходимо позаботиться о синхронизации доступа функции и других задач к общим переменным и структурам данных.

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

Набор интерфейсных функций звуковых устройств

В дальнейшем мы будем придерживаться универсальной системы именования функций, указывая лишь смысловую часть имени и опуская префикс, содержащий тип и «ориентацию» устройства. Например, говоря о функции GetDevCaps, мы будем подразумевать две функции - waveInGetDevCaps и waveOutGetDevCaps , объясняя только их различия для устройств ввода и вывода. Это потребует от читателя «конструирования» полного имени функции в каждом конкретном случае, однако позволит сделать описание более широким и систематическим. В прототипе функции префикс будет обозначаться последовательностью «xxx ».

Первым параметром большинства функций указывается ключ (handle) открытого звукового устройства, имеющий тип HWAVEIN или HWAVEOUT ; в прототипе его тип обозначается HWAVEx . Как уже говорилось, ключи звуковых устройств можно хранить в переменных совместимого типа HWAVE .

Перечень интерфейсных функций

Запрос количества устройств

Запрос параметров и возможностей устройства

Открытие устройства

Закрытие устройства

Подготовка (фиксация в памяти) звукового буфера

Освобождение (снятие фиксации) звукового буфера

AddBuffer / Write

Передача очередного буфера драйверу устройства

Остановка записи/воспроизведения

Запуск записи/воспроизведения

Сброс потока

SetVolume / GetVolume

Установка/запрос громкости воспроизведения

SetPitch / GetPitch

Установка/запрос высоты тона при воспроизведении

SetPlaybackRate / GetPlaybackRate

Установка/запрос скорости воспроизведения

Запрос номера устройства по ключу

Запрос текста сообщения об ошибке по коду

Передача драйверу нестандартного сообщения

Значения, возвращаемые интерфейсными функциями

За редким исключением, все функции звукового интерфейса возвращают результат типа MMRESULT , эквивалентный типу UINT . Значение MMSYSERR_NOERROR , в текущей реализации равное нулю, означает успешное выполнение функции, любое другое значение указывает на ошибку. Константы для кодов ошибок имеют префиксы MMSYSERR_ (общая ошибка мультимедийной подсистемы) и WAVERR_ (ошибка драйвера Wave-устройства):

MMSYSERR_BADDEVICEID

Недопустимый номер устройства

MMSYSERR_NOTENABLED

Драйвер не активизирован

MMSYSERR_ALLOCATED

Устройство занято другим приложением

MMSYSERR_INVALHANDLE

Недопустимый ключ открытого устройства

MMSYSERR_NODRIVER

Драйвер отсутствует

Недостаточно памяти

MMSYSERR_NOTSUPPORTED

Запрошенная функция не поддерживается

MMSYSERR_BADERRNUM

Код ошибки вне допустимого диапазона

MMSYSERR_INVALFLAG

Недопустимый флаг

MMSYSERR_INVALPARAM

Недопустимый параметр

MMSYSERR_HANDLEBUSY

Над ключом выполняется операция от другой задачи

Неопределенная ошибка

MMSYSERR_NODRIVERCB

Драйвер не выполнил уведомления (callback)

WAVERR_BADFORMAT

Неверный или неподдерживаемый формат потока

WAVERR_STILLPLAYING

Идет запись или воспроизведение

WAVERR_UNPREPARED

Буфер не подготовлен

Устройство работает только в синхронном режиме

GetDevCaps - запрос параметров и возможностей устройств

MMRESULT xxxGetDevCaps (UINT DevId, LPWAVExCAPS Caps, UINT CapsSize);

Служит для определения параметров и возможностей устройства.

DevId - номер устройства начиная с нуля, либо ключ ранее открытого устройства, либо константа WAVE_MAPPER . В последнем случае возвращаются параметры стандартного системного устройства.

Caps - указатель структуры типа WAVEINCAPS или WAVEOUTCAPS (имеются специальные типы LPWAVEINCAPS и LPWAVEOUTCAPS ).

CapsSize - размер структуры в байтах.

При успешном завершении функция заполняет поля переданной указателем структуры параметрами устройства. Если были запрошены параметры Wave Mapper, то в качестве имени устройства возвращается название службы переназначения.

Open - открывание устройства

MMRESULT xxxOpen (LPHWAVEx ForHandle, UINT DevId, LPCWAVEFORMATEX Format, DWORD Callback, DWORD Instance, DWORD OpenFlags);

ForHandle - указатель переменной типа HWAVEIN или HWAVEOUT (тип указателя - LPHWAVEIN или LPHWAVEOUT ), в которую при успешном завершении операции записывается ключ открытого устройства.

DevId - номер устройства начиная с нуля, либо ключ ранее открытого устройства, либо значение WAVE_MAPPER . В последнем случае службой переназначения выбирается устройство, поддерживающее заданный формат, причем поиск начинается со стандартного системного устройства.

Format - указатель структуры типа WAVEFORMATEX, описывающей требуемый формат потока.

Callback - объект, которому будут передаваться уведомления драйвера о выполнении запрошенных операций. Задается ключом (handle) окна или события, указателем функции либо идентификатором задачи (thread id).

Instance - 32-разрядное информационное слово, которое будет передаваться драйвером в параметрах вызова функции уведомления. Например, при разработке универсального интерфейса со звуковыми устройствами это может быть указатель описателя устройства (структуры или объекта класса).

OpenFlags - флаги режимов открывания и работы устройства:

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

Параметр Callback является ключом объекта события (event handle)

Параметр Callback является идентификатором задачи (thread id)

Параметр Callback является ключом окна (window handle)

CALLBACK_FUNCTION

Параметр Callback является указателем функции

WAVE_FORMAT_QUERY

Режим опроса формата. Драйвер только проверяет, может ли указанное устройство быть открыто с запрошенным форматом и в заданных режимах, и возвращает соответствующий код результата. В этом режиме параметр ForHandle может быть нулевым (NULL )

WAVE_FORMAT_DIRECT

Запрещает Wave Mapper и ACM принимать участие в преобразовании формата потока. Весь обмен данными производится только между драйвером и приложением

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

Разрешает Wave Mapper и ACM вмешиваться в обмен звуковыми данными между программой и драйвером устройства

В случае успешного открытия устройства (если не был задан флаг опроса формата) звуковая подсистема возвращает в переменную, на которую ссылается указатель ForHandle , ключ (handle) открытого устройства.

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

При завершении работы с устройством его необходимо закрыть функцией Close, в противном случае открытое устройство может «зависнуть». В отличие от файловой, звуковая подсистема в Windows гораздо более чувствительна к ошибкам и не всегда в состоянии отследить завершение программы, чтобы аварийно закрыть звуковые устройства.

PrepareHeader - подготовка буфера и его заголовка к передаче драйверу

MMRESULT xxxPrepareHeader (HWAVEx Handle, LPWAVEHDR Hdr, UINT HSize);

Hdr

HSize

Подготавливает звуковой буфер к передаче драйверу. Обычно подготовка заключается в фиксации буфера в памяти, чтобы во время внепроцессорной передачи (DMA) он не оказался вытесненным (откачанным) на диск. В заголовке подготовленного буфера звуковой подсистемой устанавливается флаг WHDR_PREPARED .

Перед вызовом функции в заголовке буфера должны быть заполнены поля lpData , dwBufferLength , dwFlags .

Для уже подготовленного буфера функция не выполняет никаких действий и завершается успешно.

Write/AddBuffer - передача звукового буфера драйверу

MMRESULT waveOutWrite (HWAVEx Handle, LPWAVEHDR Hdr, UINT HSize); MMRESULT waveInAddBuffer (HWAVEx Handle, LPWAVEHDR Hdr, UINT HSize);

Hdr - указатель заголовка звукового буфера.

HSize - размер структуры заголовка.

Передает звуковой буфер драйверу для воспроизведения (Write ) или для записи (AddBuffer ). Буфер должен быть подготовлен функцией Prepare, иначе драйвер откажется его принять.

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

Завершив обработку очередного буфера, драйвер изымает его из очереди, сбрасывает флаг WHDR_INQUEUE, затем устанавливает флаг WHDR_DONE, после чего выполняет уведомление приложения, если это было запрошено при открытии устройства. Затем драйвер продолжает обработку следующего буфера из очереди.

Приложение не имеет права изменять какие-либо поля заголовка до тех пор, пока обработка буфера драйвером не будет завершена.

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

Start/Restart - запуск записи/воспроизведения

MMRESULT waveInStart (HWAVEx Handle); MMRESULT waveOutRestart (HWAVEx Handle); Запускает запись/воспроизведение с текущей позиции потока.

При активном потоке функция не выполняет никаких действий и завершается успешно.

BreakLoop - прерывание текущего цикла

MMRESULT waveOutBreakLoop (HWAVEx Handle);

Сбрасывает режим цикла воспроизведения, если он установлен. Текущий проход цикла проигрывается до конца, далее воспроизведение продолжается линейно, без возврата к первому буферу цикла. Группа буферов цикла возвращается программе по мере завершения воспроизведения каждого из них.

При остановленном потоке или отсутствии цикла функция не выполняет никаких действий и завершается успешно.

SetVolume - установка громкости воспроизведения

MMRESULT waveOutSetVolume (HWAVEx Handle, DWORD Volume);

Volume - громкость по левому и правому каналу. Младшее слово задает громкость левого канала, старшее - правого. Значение 0xFFFF задает максимальную громкость, 0 - минимальную. Для адаптеров, не поддерживающих независимую регулировку громкости по каналам, младшее слово задает громкость в обоих каналах тракта.

Функция устанавливает выходной уровень воспроизводимого сигнала. Несмотря на то, что функцией допускается 65 536 уровней громкости, большинство адаптеров поддерживает лишь от 8 до 256 уровней. В таких случаях значимыми являются только от трех до восьми старших разрядов значения громкости, младшие разряды игнорируются. Такая трактовка позволяет использовать одну и ту же шкалу громкости, изменяя лишь степень ступенчатости регулировки.

Функция поддерживается только адаптерами, в свойствах которых установлен флаг WAVECAPS_VOLUME. Раздельная регулировка по каналам поддерживается только при наличии флага WAVECAPC_LRVOLUME.

SetPitch / SetPlaybackRate - установка высоты тона / скорости воспроизведения

MMRESULT waveOutSetPitch (HWAVEx Handle, DWORD Multiplier); MMRESULT waveOutSetPlaybackRate (HWAVEx Handle, DWORD Multiplier); Multiplier - множитель высоты тона / скорости воспроизведения. Старшее слово задает целую часть множителя, младшее - дробную. Если имеется значение множителя f типа double , то преобразовать его в тип DWORD можно по формуле:

Multiplier = (DWORD)(f * 0x10000)

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

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

Эту пару функций поддерживают далеко не все звуковые адаптеры; как правило, она реализуется на специализированных сигнальных процессорах (DSP). Технически проще всего реализуется изменение скорости, для чего в точках между имеющимися отсчетами путем интерполяции вычисляются промежуточные отсчеты, следующие друг за другом чаще или реже, которые и поступают на схему ЦАП. Изменение высоты требует гораздо более сложных вычислений: фрагменты потока разлагаются в ряд Фурье, образуя спектр звука, затем спектр сдвигается в сторону высоких или низких частот, после чего из измененного спектра снова формируется фрагмент нового звукового потока.

Для адаптеров, поддерживающих изменение высоты и/или скорости, функция GetDevCaps устанавливает флаги WAVECAPS_PITCH и WAVECAPS_PLAYBACKRATE соответственно.

GetID - запрос номера устройства по ключу

MMRESULT xxxGetID (HWAVEx Handle, LPUINT ForID);

ForID - указатель переменной типа UINT , в которую заносится номер устройства.

Функция определяет номер устройства, при открытии которого системой был возвращен заданный ключ. В том случае, если при открывании была использована служба переназначения (значение WAVE_MAPPER вместо номера или флаг WAVE_MAPPED), функция возвращает значение WAVE_MAPPER .

Документация Microsoft утверждает, будто эта функция поддерживается только для совместимости, и что для получения номера достаточно привести ключ к нужному типу, однако это совсем не так. Ключ открытого устройства является адресом описателя, принадлежащего звуковой подсистеме, и в Win32 размещается в общей области памяти. Единственный способ получить номер устройства по ключу - использование функции GetID .

GetErrorText - запрос текстового сообщения об ошибке по коду

MMRESULT xxxGetErrorText (MMRESULT Error, LPSTR Text, UINT TextSize);

Error - код ошибки, возвращенный одной из интерфейсных функций;

Text - указатель текстового буфера (массива типа char );

TextSize - размер текстового буфера в байтах.

Функция заносит в заданный буфер текстовое описание ошибки с заданным кодом. Записанный текст завершается нулевым байтом. Если буфер недостаточно велик, то конец текста обрезается; нулевой байт записывается в буфер в любом случае. Размер буфера, способного вместить любое сообщение об ошибке, определяется константой MAXERRORLENGTH .

Сообщения об ошибках не имеют разделения по типам устройств, поэтому для запроса текста любой ошибки достаточно любой из возможных функций, например waveOutGetErrorText .

Message - передача сообщения драйверу

MMRESULT xxxMessage (HWAVEx Handle, UINT Msg, DWORD P1, DWORD P2);

Msg - код передаваемого сообщения.

P1 , P2 - параметры сообщения.

Функция используется для прямой передачи сообщения драйверу. Все интерфейсные функции, кроме GetID и GetErrorText, транслируются звуковой подсистемой в сообщения, передаваемые драйверу; при этом каждое сообщение имеет два параметра типа DWORD , в которые преобразуются параметры интерфейсных функций. Если драйвер устройства поддерживает нестандартные сообщения, они могут быть переданы ему при помощи функций Message . Возвращаемое значение при этом определяется самим драйвером.

Недостатки звуковой подсистемы MME

В Windows 95/98 подсистема MME и ее драйверы так и остались 16-разрядными, как и в Windows 3.x. Из-за этого каждое обращение к звуковому драйверу из Win32–приложения сопровождается двойной сменой режима исполнения (thunking), что, увы, приводит к дополнительным накладным расходам, доходящим до единиц миллисекунд на процессорах Celeron-366. Кроме того, многие драйверы ограничивают частоту обновления кольцевого буфера, через который идет обмен между компьютером и адаптером, до нескольких десятков раз в секунду, отчего в процессе передачи звука возникает отставание (latency). У драйверов для адаптеров ISA это отставание может достигать десятков миллисекунд, у драйверов для адаптеров PCI оно обычно ограничивается единицами миллисекунд.

Для более оперативного вывода звука, особенно с модификацией его в реальном времени, Microsoft разработан более новый интерфейс - DirectSound . Этот интерфейс призван «приблизить» аппаратуру адаптера к прикладной программе и позволяет ей практически напрямую записывать звук в системный кольцевой буфер, сводя максимальные задержки к единицам миллисекунд для любого адаптера. При работе с DirectSound программа обращается непосредственно к 32-разрядному системному драйверу адаптера (VxD), минуя переключения между 32- и 16-разрядным режимом исполнения.

В целях эффективной работы интерфейс DirectSound должен поддерживаться системным драйвером адаптера. Для устройств, драйверы которых не поддерживают DirectSound , Windows эмулирует новый интерфейс «поверх» обычного MME–драйвера, но в этом случае все задержки даже возрастают из-за накладных расходов на эмуляцию.

К сожалению, Microsoft разработала спецификацию расширения DirectSound для звуковых VxD только в части воспроизведения звука, действуя прежде всего в интересах производителей игр. Запись звука через DirectSound до сих пор ведется путем эмуляции поверх MME.

Надо сказать, что звуковая подсистема Windows 3.x и 95/98, равно как и подсистема удаленного доступа к сети (RAS), обладает низкой устойчивостью к ошибкам. Это чаще всего проявляется в том, что при аварийном завершении программы, открывшей звуковые устройства и работающей с ними, система не выполняет корректного закрытия (cleanup) используемых устройств. В результате этого в ряде случаев после такого аварийного завершения может потребоваться перезагрузка, а до тех пор незакрытые устройства будут недоступны другим приложениям. Кроме того, 16-разрядные подсистемы защищены от ошибок гораздо меньше 32-разрядных, так что серьезные ошибки в звуковых программах могут приводить к сбоям и «зависаниям» всей системы Windows.

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

Пример программы, использующей интерфейс MME

В качестве иллюстрации приводится программа, реализующая в реальном времени эффект задержки (delay). Суть эффекта состоит в сложении исходного звукового сигнала с его копией, задержанной во времени на небольшую величину (единицы-сотни миллисекунд). Задержка на величину до 15-20 мс воспринимается на слух, как «дробление» источника звука; на этом принципе основано создание хорового эффекта. Задержка на величину 20-50 мс воспринимается как реверберация (ощущение объема), а большие величины задержки - как обычное эхо.

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

Программа реализована на языке C++. Фактически от C++ в ней использованы лишь общие расширения (определение переменных в заголовках циклов, использование имен структур в качестве имен типов и т.п.), в остальном же можно считать, что в ней использовался обычный язык ANSI C.

Разработка программы выполнялась в среде MS VC++ 4.2. Использован только стандартный интерфейс Windows, без каких-либо расширений из среды разработки.

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

Для управления циркуляцией буферов создается отдельная рабочая задача (worker thread), которой присваивается максимальное приращение приоритета. Звуковые устройства открываются в режиме уведомления рабочей задачи.

Вследствие буферизации выводимый программой звук несколько отстает от исходного. Общее время буферизации и количество звуковых буферов задается в секции параметров программы. Для непрерывного переноса звука количество буферов не должно быть меньше двух; приемлемая стабильность достигается уже при использовании трех-четырех буферов.

Для работы программы необходим полнодуплексный звуковой адаптер, допускающий одновременную работу своего АЦП и ЦАП. Большинство современных адаптеров удовлетворяет этому условию.

Пример

КомпьютерПресс 6"2000