Воспроизведение звука средствами Windows

Публикация № 177763

Разработка - Практика программирования

Еще один способ воспроизводить звуки из 1С, средствами Windows без использования внешних программ.

Всем привет! Давно ничего не писал. Хочу поделиться найденным, на просторах интернета, способом воспроизведения звука. Но обо всем по порядку.

Я часто делаю воспроизведение звука в 1С, когда стоит вопрос о сканировании штрих-кодов, чтобы подтвердить факт добавления товара в документ, или сообщить об ошибке. Эта необходимость возникла при большом потоке товаров и работе в терминальном режиме со сканерами через эмуляцию клавиатуры. Дело в том, что из-за проблем с задержками, например WiFi, сканированный код может доходить с задержками до двух секунд, и драйвер некорректно распознает код. Если никак не сообщать об этом менеджеру, то в потоке товаров они не замечают, что товар не был добавлен в документ.

Собственно никогда проблем, с воспроизведением звуков, у меня не возникало. Я использовал встроенный в Windows плеер mplay32.exe и скрипты WScript. Однако в новых версиях Windows этого плеера нет, копирование его ни к чему хорошему не приводит, приходится полностью отключать защиту на уровне пользователей и другие сложности с ошибкой 0x80070002 при работе в терминале на Windows Server 2008 R2.
Были опробованы варианты с проигрыванием через ActiveX или в поле HTML документа. С ними проблема в том, что звук не воспроизводится, если форма с полем не видна. А мне надо звук воспроизводить фоном. Вставлять ActiveX на каждую форму работающую с штрих-кодом не вариант.

Наконец, решение было найдено, простое и 100% работающее. Проверено на Windows 7/2008R2:

oVoice = Новый COMObject("SAPI.SpVoice");

oSpFileStream = Новый COMObject("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();

Для 1С 7-ки:

oVoice = СоздатьОбъект("SAPI.SpVoice");
oSpFileStream = СоздатьОбъект("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();

Visual Basic (Excel, Word и т.п.)

Dim oVoice As Object
Dim oSpFileStream As Object
Set oVoice = CreateObject("SAPI.SpVoice")
Set oSpFileStream = CreateObject("SAPI.SpFileStream")
oSpFileStream.Open ПутьДоФайла
oVoice.SpeakStream oSpFileStream
oSpFileStream.Close

Проверял на WAV файлах, на счет mp3 сказать не могу, не тестировал.

Сам интерфейс используется для проговаривания строк, поэтому можно пользоваться и основной его функцией:

oVoice.Speak("Hello!");

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Рейтинг 1-го уровня
26. websamson 303 12.05.17 08:32 Сейчас в теме
Столкнулся с тем, что при выполнении кода выходила ошибка 0x80045003
Решение: формат звукового файла .wav обязательно должен быть mono, а не stereo.
Конвертировали с помощью плагина AIMP.
bashhhh; TrbVLAD; +2 Ответить 2
3. orefkov 2081 14.03.13 12:21 Сейчас в теме
Все таки "Новый COMObject" и "без ActiveX" - взаимоисключающие параграфы.
Я бы "без ActiveX" убрал из названия публикации.
А то такое чувство, что повелся на "без голоданий и диет", но понял, что чудес не бывает.
cool.vlad4; +1 Ответить 2
23. androidT1C 73 25.10.13 09:50 Сейчас в теме
Отлично!

Хоть и выдает ошибку

Ошибка при вызове метода контекста (SpeakStream): Произошла исключительная ситуация (0x80070057)
oVoice.SpeakStream(oSpFileStream);
по причине:
Произошла исключительная ситуация (0x80070057)

но звук воспроизводит!

Но есть одно "но". Как сделать, чтобы 1С не ждала окончания воспроизведения звука, а продолжала работать?

Как, например, через WshShell.Run(,0,0) это замутить?
SITR-utyos; +1 Ответить 1
15. Кошки рулят 25.03.13 11:45 Сейчас в теме
Так чисто для прикола, наверное можно поюзать, но в реальных базах врядли.
Говорилку пользователи отключают или сразу или максимум через день - мешает работать.
Звуковые файлы можно проигрывать
ЗапуститьПриложение(ПутьДоФайла)
и не надо думать какой виндовс, какой формат файла ...
А вот подать сигнал (не работающая почему-то нигде и никогда Сигнал()) я предпочитаю баяном. Например:
Баян=CreateObject("DynamicWrapper");
Баян.Register("KERNEL32.DLL", "Beep", "i=ll", "f=s", "r=l");
Баян.Beep(330*4,300);
Баян.Beep(494*4,200);

Работает тоже в любом виндовсе, звучать будет через все, что сможет, даже через динамик системного блока ...
Не полифония, конечно, но можно довольно затейливые рулады воспроизвести ...
14. zsrg 321 21.03.13 07:37 Сейчас в теме
Не удивительно. WAV родной форматы винды, а mp3 уже расширение кодека для мультимедиа плеера.
13. Dnki 4 20.03.13 20:51 Сейчас в теме
Проверил. WAV воспроизводит. MP3 - нет. Что-то смешное говорит.
4. yuraos 977 14.03.13 12:26 Сейчас в теме
Клево!!!

Сам интерфейс используется для проговаривания строк, поэтому можно пользоваться и основной его функцией:
oVoice.Speak("Hello!");

Что напишешь - то комп и скажет????
1. andrewks 1304 14.03.13 10:22 Сейчас в теме
уже есть публикация по SAPI.SpVoice, и, по-моему, даже не одна
2. zsrg 321 14.03.13 10:38 Сейчас в теме
1, Все верно. Но в этих публикациях ничего не сказано про воспроизведение WAV файлов, только про говорилку...
19. Vovus 4 12.09.13 17:25 Сейчас в теме
На сервере Управляемые Формы не воспроизводить звук Выдает ошибку что oSpFileStream.Open не определено
25. Serge_ASB 29.10.14 12:01 Сейчас в теме
внёс
oVoice = Новый COMObject("SAPI.SpVoice");

oSpFileStream = Новый COMObject("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();

в процедуру.
Вызов ее, как написано выше, производится только &НаКлиенте
Почему-то вызов этой процедуры (&НаКлиенте Посигналить();) не производится: программа не находит ее. А из других клиентских - пожалуйста.
22. zsrg 321 15.09.13 17:59 Сейчас в теме
Если я правильно понял:

|oSpFileStream.Open """+ПутьДоФайла+"""
28. sertak 256 05.10.17 09:02 Сейчас в теме
Благодарю, чувак! Сэкономил кучу нервов и времени коллеге. Плюс 1 в карму.
20. zsrg 321 12.09.13 20:32 Сейчас в теме
Все правильно и не должно воспроизводить. Звук должен воспроизводиться на клиенте, а не на сервере!
Оставьте свое сообщение

См. также

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    4285    comol    22    

Развитие 1С программиста

Практика программирования Личная эффективность Бесплатно (free)

Делюсь своим опытом и видением развития 1С программиста.

17.10.2018    22587    pashamak    64    

Вспомогательные инструкции в коде 1С

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    32011    tormozit    104    

Алгоритм “хвост змеи для заполнения прямоугольной области”.

Практика программирования Бесплатно (free)

При разработке http://infostart.ru/public/275582/ столкнулся с необходимостью распределить выделенные задания на прямоугольную область календаря. В результате родился алгоритм, который может пригодиться не только мне и не только в этой задаче.

20.06.2014    27213    milkers    16    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    38419    unichkin    74