Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2024, 14:52   #1
gkc
 
Регистрация: 16.01.2020
Сообщений: 7
По умолчанию Как вызвать функцию?

Подскажите, плиз, как зациклить аудио файл этой функцией? Как ее правильно вызвать?
(Это компоненты библиотеки LMDTools)


Код:
function TLMDWave.{$IFDEF CPPBUILDER}PlaySoundExt{$ELSE}PlaySound{$ENDIF}(aValue:TLMDSndPlayMode):Boolean;
var
  uFlags:Word;
begin
  result:=false;
  If Empty or not LMDMMWavePossible then Exit;
  uflags:=SND_MEMORY OR SND_NODEFAULT;
  case aValue of
    sdSync :uflags:=uflags or SND_SYNC;
    sdASync:uflags:=uflags or SND_ASYNC;
    sdLoop :uflags:=uflags or SND_ASYNC OR SND_LOOP;
  end;
  result:=SndPlaySound(FMemoryWave.Memory, uflags);
end;
Пример:
WaveList_Logo.Items[0].Wave.Play; // вызов одиночного звука из wav-листа
WaveList_Logo.Items[1].Wave.PlaySound(?); // думаю как-то так надо зациклить, но какие флаги писать?

Последний раз редактировалось gkc; 14.05.2024 в 17:20.
gkc вне форума Ответить с цитированием
Старый 14.05.2024, 17:23   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,351
По умолчанию

Библиотекой не пользовался, но по приведенному коду предположу "WaveList_Logo.Items[1].Wave.PlaySound(sdLoop);".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.05.2024, 18:58   #3
gkc
 
Регистрация: 16.01.2020
Сообщений: 7
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Библиотекой не пользовался, но по приведенному коду предположу "WaveList_Logo.Items[1].Wave.PlaySound(sdLoop);".
Нет(
[Error] Logo.pas(5749): Undeclared identifier: 'sdLoop'

*У меня был этот код, пару лет назад в каком то проекте, но он затерялся(
Насколько помню, там в скобках были 2 флага, типа: "SND_ASYNC OR SND_LOOP"
Но я все счас перепробовал - нифига (-

Последний раз редактировалось gkc; 14.05.2024 в 19:00.
gkc вне форума Ответить с цитированием
Старый 14.05.2024, 21:00   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,531
По умолчанию

Цитата:
[Error] Logo.pas(5749): Undeclared identifier: 'sdLoop'
в модуль где вызывается данная функция (где ошибка) надо добавить к uses
какой-то из модулей перечисленных в uses описания данной функции
(тот где описан тип TLMDSndPlayMode)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 15.05.2024, 00:53   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,896
По умолчанию

Цитата:
Сообщение от gkc Посмотреть сообщение
Но я все счас перепробовал - нифига (-
Что значит нифига?
northener вне форума Ответить с цитированием
Старый 15.05.2024, 06:09   #6
gkc
 
Регистрация: 16.01.2020
Сообщений: 7
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
в модуль где вызывается данная функция (где ошибка) надо добавить к uses
какой-то из модулей перечисленных в uses описания данной функции
(тот где описан тип TLMDSndPlayMode)
Так и есть! Спасибо! Как все просто когда носом ткнут)
добавил unit lmdwave и ошибка ушла!
Сбило с толку что
функ. Wave.Play; работала (она в том же модуле описана)
а Wave.PlaySound(sdLoop); не работала...
gkc вне форума Ответить с цитированием
Старый 15.05.2024, 06:10   #7
gkc
 
Регистрация: 16.01.2020
Сообщений: 7
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Что значит нифига?
Это значит - ничего не вышло...
gkc вне форума Ответить с цитированием
Старый 19.05.2024, 09:17   #8
gkc
 
Регистрация: 16.01.2020
Сообщений: 7
По умолчанию

А как корректно сменить музыку при вызове через Loop?

Допустим я вызвал второй файл из своего листа:
WaveList_Logo.Items[2].Wave.PlaySound(sdLoop);
Ок, все работает, Loop отрабатывает как надо,
Я хочу сменить файл, запустить третий файл:
да, если я вызову так:
WaveList_Logo.Items[3].Wave.PlaySound(sdLoop);
Функция корректно и моментально сменит файл, при этом есстно сразу оборвет предыдущую.
Это слушается не очень хорошо...
Какие варианты тут есть?
*Все рабочие файлы с в редакторе подготовил под Loop!
1.Я могу плавно уменьшить громкость (например через SetWaveVolume())
Сменить принулевой громкости файл и снова поднять громкость до старого значения.
Но будет провал звука на несколько секунд, что тоже не айс.
2. я могу ввести в константы длительность всех своих аудио треков
и отслеживать длительность текущей фонограммы в нормальном таймере.
и, при окончании фонограммы (если это нужно) выбирать новую и перевызывать
WaveList_Logo.Items[3].Wave.PlaySound(sdLoop);
Возможно это будет работать, но смущает асинхронность и костыльность решения.

Вопрос:
Есть ли какие-то еще решения как отследить длину трека и "вовремя" сменить его?
Возможно, можно получить какие-то данные об окончании файла от SndPlaySound? (MMSystem)
какие то ей запросы в таймере посылать?
Насколько я вижу она воспроизводит звук, то...
gkc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызвать функцию(с++) Sterben Помощь студентам 13 29.09.2015 09:01
Как вызвать функцию.. Аделинкка Общие вопросы Delphi 10 21.12.2012 10:47
Як вызвать функцию из dll в C# ? Dr.Pauliss Помощь студентам 5 26.09.2011 12:42
Вызвать функцию ассемблера из С++ Dima88 Помощь студентам 3 11.12.2009 00:54
Как вызвать функцию? blackstersl Общие вопросы Delphi 10 07.06.2009 19:22