Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Воспроизведение музыки из БД, Воспроизведение музыки из БД 
V
    Опции темы
CrazyPiggy
Дата 7.8.2013, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 4.6.2008

Репутация: нет
Всего: нет



Добрый день. Помогите пожалуйста решить проблему.
У меня в программе на Delphi из базы данных выбираются записи содержащие mp3 по определенному условию. 
Мне необходимо сделать так чтобы программа воспроизвела одну запись mp3, пока идет воспроизведение программа должна выполнить какието действия, 
после окончания воспроизведения одной записи происходит воспроизведение другой и программа опять выполняет уже другие действия. И так до конца списка.
Я делал так 
Код

var
 MS:TMemoryStream;
begin
  MS:=TMemoryStream.Create;

 try
 for i:=1 to FIBSprBell.Count do
 begin
    MS.Clear;
    FIBSprBellBELL.SaveToStream(MS);
    PlaySound(MS.Memory,0,SND_MEMORY or SND_SYNC);

   /*Что то выполняется*/

 end;
MS.Free;
end; 

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

PlaySound(MS.Memory,0,SND_MEMORY or SND_ASYNC);

Получалось если дальнейшие действия происходят быстрее чем воспроизводится звук, то он воспроизводится не до конца и начинается воспроизведение следующего звук.
Подскажите пожалуйста что мне делать. как узнать воспроизвелся ли звук до конца и лишь после этого воспроизвести следующий.
PM MAIL   Вверх
Poseidon
Дата 7.8.2013, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: нет
Всего: 133



Используй SND_SYNC, но цикл воспроизведения засунь в отдельный поток. Вообще SND_SYNC замораживает выполнение кода пока не будет достигнут конец файла. Для пользователя это похоже на зависание программы. Использование SND_ASYNC позволяет коду выполняться дальше. Поэтому у тебя и получается, что при SND_ASYNC музыка начинает играть и пошло выполнятся твое  /*Что то выполняется*/. Как только оно выполнилось, цикл пошел на следующую итерацию, а следовательно пошел новый вызов PlaySound с уже другим звуком.

Цитата

SND_SYNC    Музыка играется синхронно, и функция не возвращает указатель
  пока не будет конца файла.
SND_ASYNC    Музыка играется асинхронно, и функция возвращает указатель
  сразу после начала проигрывания файла. Чтобы остановить проигрывание, 
  надо вызвать функцию SndPlaySound с параметром lpszSoundName 
  установленным в NULL.


Цитата(CrazyPiggy @  7.8.2013,  09:52 Найти цитируемый пост)
как узнать воспроизвелся ли звук до конца и лишь после этого воспроизвести следующий
Для этого можно использовать флаг SND_NOSTOP. При его использовании функция PlaySound вернет False, если музыка уже проигрывается. Но для твоей задачи, скорее всего, не подойдет, т.к. у тебя идет проход по базе в цикле и на каждую запись есть свой звук и свое  /*Что то выполняется*/.


Я бы посоветовал использовать отдельный поток для PlaySound с флагом SND_SYNC.  /*Что то выполняется*/ можно делать в основном потоке, если это выполняется быстро.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
CrazyPiggy
Дата 7.8.2013, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 4.6.2008

Репутация: нет
Всего: нет



Дело в том что в Чтото выполняется smile происходит отрисовка определленного рисунка на форме. И я не знаю как его закинуть в поток. А может это все можно решить через Bass? Может там все это както проще? Прекратить воспроизведение можно, вызвав функцию BASS_ChannelStop, а проверить, играет ли еще канал или нет - функцией BASS_ChannelIsActive. Только я не пойму как воспроизвести звук из базы в bass.

Это сообщение отредактировал(а) CrazyPiggy - 7.8.2013, 12:14
PM MAIL   Вверх
Poseidon
Дата 7.8.2013, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: нет
Всего: 133



Цитата(CrazyPiggy @  7.8.2013,  11:53 Найти цитируемый пост)
Дело в том что в Чтото выполняется  происходит отрисовка определленного рисунка на форме. 
Давай уточним. Если у нас рисунок отрисовался быстрее, чем проиграл звук, что должно быть? Отрисовка следующего рисунка должна ждать окончания проигрывания? Или следующий (второй) рисунок должен начать отрисовываться под проигрывание первого звука? Уточни более подробно как должно работать.

Цитата(CrazyPiggy @  7.8.2013,  11:53 Найти цитируемый пост)
И я не знаю как его закинуть в поток.
По слову "TThread" ты найдешь кучу сообщений и примеров кода. 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
CrazyPiggy
Дата 8.8.2013, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 4.6.2008

Репутация: нет
Всего: нет



Цитата

 Уточни более подробно как должно работать

При воспроизведении звука (а это число, которое я складываю из цифр хранящихся в базе в виде mp3) на экране рисуется это самое число которое мигает пока он произносится. При окончании воспроизведения числа, воспроизводится следующее число, которое также отображается графически на экране мигающим. И так далее Чтото типа 153 (сто пятьдесят три идет выборка этих озвучек из БД) и на экране мигает число 153
PM MAIL   Вверх
Poseidon
Дата 8.8.2013, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: нет
Всего: 133



Не знаю как реализовано мигание. Если через цикл, то может не получится. Но в общем, если боишься потоков, то можно сделать так:
Код

var
  MS:TMemoryStream;
begin
  MS:=TMemoryStream.Create;
  try
    for i:=1 to FIBSprBell.Count do
    begin
      MS.Clear;
      FIBSprBellBELL.SaveToStream(MS);

      /*Что то выполняется*/

      while not PlaySound(MS.Memory,0,SND_MEMORY or SND_ASYNC or SND_NOSTOP) do
        Application.ProcessMessages;
    end;
  finally
    MS.Free;
  end;
end;

Я скопировал твой код и немного его подправил. Мне не совсем ясно как мы этим циклом переходим на другую запись в БД. Т.е. нет ни Next, ни i не используется. Тебе это виднее. Я лишь показал как можно сделать. Добавить в PlaySound SND_NOSTOP и крутить его в цикле, пока музыка не закончилась. Как только замолчало, так идем на следующую итерацию цикла. Корявенько и я бы у себя так не сделал бы, но как один из вариантов без потоков... Если в /*Что то выполняется*/ свой внутренний цикл, то не получится. Нужно будет этот цикл пихать в наш while...do. Если моргание сделано через какой-нибудь таймер или тому подобное, то пройдет.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
CrazyPiggy
Дата 10.8.2013, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 4.6.2008

Репутация: нет
Всего: нет



Спасибо за помощь. Разобрался в своей проблеме
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1231 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.