Bor

Members
  • Content count

    236
  • Joined

  • Last visited

Community Reputation

1 Нейтральная

About Bor

  • Rank
    Продвинутый

Contact Methods

  • ICQ
    0

Дополнительная информация

  • Место в рейтинге
    5189
  1. Я немного почитал сообщения выше - по поводу нескольких проигрываемых одновременно звуков: могут проигрываться одновременно несколько звуков, но они должны быть на разных каналах! На каждом канале свой звук.
  2. Приборы на ХМЛ это не мое, мое это приборы на Си. Мне кажется, что это очень трудно реализовать достойно авиационные системы только при помощи ХМЛ. А вам могу посоветовать вычислять логическое условие при котором возможен запуск ВСУ, с учетом всего, и выставлять в 1 признак того, что оно работает и этот же признак кидать в звуковую переменную. Кстати, код ХМЛ, для работы со стеком сильно напоминает Forth http://ru.wikipedia.org/wiki/Forth.
  3. Минимальный xss.cfg файл для вашего случая с одним звуком тумблера: [Options] [sounds] // Тумблер TOGGLE_SOUND { soundFile = "switch.wav"; Volume = -50; Reset = true; } Звуки прописываются в секции [sound] Прописан один звук находящийся в файле switch.wav, имя XML переменной, за которой будет следить сервер - TOGGLE_SOUND. Громкость: '-50', для справки '0' - самый громкий, '-10000' - самый тихий. Опция Reset = true говорит о том, что звук проиграется один раз после того, как вы установите переменную TOGGLE_SOUND в '1', в момент проигрывания эта переменная автоматически установится в '0'. Далее привожу XML файл прибора использующий тумблер со звуком, самый небольшой accu1_sw.xml, в Panel.cfg он прописан так: gauge13=An-24!accu1_sw, 24,41,8,50 Текст прибора: <Gauge Name="ACCU1_SW" Version="1.0"> <Element> <Select> <Value>(L:ACCU1_SW,bool)</Value> <Case Value="0"> <Image Name="sw_nd.bmp"/> </Case> <Case Value="1"> <Image Name="sw_nu.bmp"/> </Case> </Select> </Element> <Mouse> <Cursor Type="Hand"/> <Click> (L:ACCU1_SW,bool) ! (>L:ACCU1_SW,bool) 1 (>L:TOGGLE_SOUND,bool) </Click> </Mouse> </Gauge> XML переменная, которая не относится к звуку, а хранит положение выключателя аккумулятора (всего два положения) имеет имя 'ACCU1_SW' Картинки, которые опять же не имеют к xss серверу никакого отношения, имеют имя 'sw_nd.bm' для изображения тумблера в нижнем положении и 'sw_nu.bmp' для изображения тумблера в верхнем положении. Реакция на мышь описана в между тегами <Mouse> и </Mouse> <Mouse> <Cursor Type="Hand"/> <Click> (L:ACCU1_SW,bool) ! (>L:ACCU1_SW,bool) 1 (>L:TOGGLE_SOUND,bool) </Click> </Mouse> если бы нам не был нужен звук, то реакция описывалась бы еще проще, вот так: <Mouse> <Cursor Type="Hand"/> <Click> (L:ACCU1_SW,bool) ! (>L:ACCU1_SW,bool) </Click> </Mouse> то есть, кладем на стек переменную 'ACCU1_SW' (L:ACCU1_SW,bool) инвертируем ее: ! снимаем значение со стека обратно в переменную 'ACCU1_SW': (>L:ACCU1_SW,bool) но так как нам еще нужно при любом переключении тумблера установить звуковую переменную в '1', то код слегка дополняется: 1 (>L:TOGGLE_SOUND,bool) то есть, мы кладем на стек '1' и записываем это значение в переменную 'TOGGLE_SOUND' После чего в соответствии с тегами <Element>, <Case>, <Image> перерисовывается тумблер, а звуковой сервер проиграет файл 'switch.wav' с которым ассоциирована переменная 'TOGGLE_SOUND'.
  4. Многие используют, в частности проект Ту-144. Некоторые разрабатываемые проекты. Тумблеры, инверторы, ВСУ, озвучивают вроде бы без особых проблем. Вы поконкретнее, что именно не получается, в каком месте? Я так понимаю, основная проблема это использование скриптов ХМЛ в симе.
  5. Да отследить мимо сервера нельзя, он пока не выдает наружу служебную информацию. Над расширением надо подумать, хорошо бы в ХМЛ оставить только одну переменную, но на чтение выдавать значение одной внутренней переменной (играет не играет и может еще ченить) , а при установке изменять значение другой внутренней переменной.
  6. Вообще первоначальная идея была дать сишным программерам библиотеку для работы с амбиент звуками, там разумеется предусмотрена возможность полного контроля за состоянием звука, но потом как-то более общий метод через ХМЛ переменные одержал победу. Переменной - флага, проигрывается звук или нет, действительно не хватает, не вводил по простой причине - оптимизация производительности. К сожалению оч. мало времени на толковое обдумывание и кодирование.
  7. Ну в моей терминологии - если звук имеет семплы (зациклен), то он становится управляемым то есть его можно остановить, запустить. Если звук не имеет семплов (незацикленный), то управлять им нельзя, он проигрывается один раз и все. Ну вернуть то опцию можно, это не проблема, главное логически обосновать это решение. Вот вы записали звук, в нем пара фраз, если его остановить посередине, то получится, что тому кто их произносил как-бы "заткнули рот" на полуслове. Хотя конечно можно плавное этот звук фейдить. Я подумаю. Принимаю разумную аргументацию.
  8. Так, почитал я свои комментарии к этой версии. Скажите пожалуйста, Lavrik, в этом звуковом файле "sound_1" есть семплы? Если нет семплов, то, звук автоматически считается однократно проигрываемым. Вот что у меня в коде, я наверное забыл указать это в сопроводиловке: // определяется режим автосброса XML переменной (Reset=true/false;), // если семплов нет, то переменная должна сбрасываться, // так-как она не проигрывается циклически // теперь в конфигурационном файле нет необходимости // определять опцию Reset=... , но для совместимости // она оставлена как незначащая. Я исходил из того, что зацикленный звук имеет семплы и им нужно управлять, если звук семплов не имеет, то он не управляется и проигрывается только один раз и все, опция Reset в версии 1.2.0 не имеет смысла. Решение: зациклите звук семплами и он станет управляемым
  9. Ну наверное так... Опять делаем или берем незацикленный звук. А потом просто получившийся результат загоняете в звуковую переменную и все: (>L:ALARM_SOUND, bool)
  10. Ну сделайте гудок, или возьмите где нибудь гудок 400 Гц и нужной длительности. Не зацикливайте его. Там где у вас озвучка тумблера при включении высотомера поставьте его включение: <Click>(L:RV power, bool) ! (>L:RV power, bool) 1 (>L:TOGGLE_SOUND,bool) (L:RV power, bool) if{ 1 (>L:RV_SOUND,bool) } </Click> Ну тут можно оптимизировать, чтобы дважды на стек не класть RV_POWER можно или сразу это условие обрабатывать, или дублировать его значение на стеке, я просто в симовском ХМЛ не силен. Далее, в файле который вы привели, необходимо выполнять обработку некоторых условий, я сильно не вникал в тот код, предлагаю алгоритм: завести флаг взведенного высотомера L:RV_ARMED, bool сперва он false. И такой код: -если высотомер включен и флаг не взведен и высота больше Decision height + еще метров 10-15, взвести флаг (10-15 метров или футов обеспечивают петлю гистерезиса); -если высотомер включен и флаг взведен и высота меньше Decision height, выставить сигнал RV_SOUND, сбросить флаг, выставить сигнал лампы Ну это так приблизительно. Код по идее должен быть такой: <Value> (L:RV power, bool) (A:Radio height, meters) (A:Decision height, meters) 10 + > (L:RV_ARMED, bool) ! && && if{1 (>L:RV_ARMED,bool)} </Value> это первый шаг, ну тут я мог перепутать местами (надо СДК смотреть) (A:Radio height, meters) (A:Decision height, meters), что там со стеком и как проверяется. <Value> (L:RV power, bool) (A:Radio height, meters) (A:Decision height, meters) < (L:RV_ARMED, bool) ! && && if{1 (>L:RV_SOUND,bool) 0 (>L:RV_ARMED,bool)} </Value> Где то так, код не проверял.
  11. А, что вы конкретно хотите? Чтобы зачитывалась высота? Дайте ваш кусок кода для затравки.
  12. Если про XML Sound Server, то новая версия знает. Она тут http://www.avsim.su/f/fs2002-pribori-8/xml-sound-server-1-2-0-pribor-dlya-kastomnoy-ozvuchki-vnturikabinnikh-zvukov-fs2004-30004.html?action=download&hl= Только для автоматического отключения звуков при внешних видах надо добавить опцию: [Options] // выключать все звуки, если режим // просмотра не кокпит MuteIfExternalViewMode = true;
  13. DT-75, попробую проверить. Правда я никогда не работал с Panel Studo. Какая у вас версия и в какой момент происходит выброс исключения?
  14. Да, так и читаю строку дополнительных параметров: void FSAPI cbf_sound_engine( PGAUGEHDR pgauge, SINT32 service_id, UINT32 extra_data) { switch( service_id ) { case PANEL_SERVICE_PRE_INSTALL: break; case PANEL_SERVICE_CONNECT_TO_WINDOW: break; case PANEL_SERVICE_POST_INSTALL: InitSoundEngine(pgauge->parameters); break; case PANEL_SERVICE_PRE_KILL: UninitSoundEngine(); break; case PANEL_SERVICE_PRE_UPDATE: if( g_pXMLSoundServer ) g_pXMLSoundServer->Process(); break; case PANEL_SERVICE_POST_UPDATE: break; case PANEL_SERVICE_PRE_DRAW: break; case PANEL_SERVICE_POST_DRAW: break; } } а еще согласно SDK ее можно тут взять: typedef struct GAUGEHDR { UINT32 gauge_header_version; char *gauge_name; PPELEMENT_HEADER elements_list; PQUERY_ROUTINE query_routine; PINSTALL_ROUTINE install_routine; PINITIALIZE_ROUTINE initialize_routine; PUPDATE_ROUTINE update_routine; PGENERATE_ROUTINE generate_routine; PDRAW_ROUTINE draw_routine; PKILL_ROUTINE kill_routine; char reserved_1[4]; UINT32 size_x_mm; char reserved_2[40]; PMOUSERECT mouse_rect; PGAUGE_CALLBACK gauge_callback; UINT32 user_data; PVOID parameters; char* usage; char reserved_3[16]; } GAUGEHDR, *PGAUGEHDR, **PPGAUGEHDR;