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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2010, 16:35   #1
romlo
Пользователь
 
Аватар для romlo
 
Регистрация: 21.06.2010
Сообщений: 49
Вопрос повторное воспроизведение wav

Имеется две кнопки, по нажатию одной файл воспроизводится,
по нажатию другой - останавливается.
Однако при повторном нажатии первой кнопки после второй файл не воспроизводится!
Почему? Может я ресурс какой не освободил?
Или есть какой-либо другой способ воспроизведения wav с указанной скоростью?

Код:
var
  Form1: TForm1;
  format:TWaveFormatEx;
  hzv:HWaveOut;        // идентификатор устройства
  hider:WaveHdr;
  buf:PChar;
  fl:TMemoryStream; 
 
implementation
 
 
procedure TForm1.Button1Click(Sender: TObject);//Кнопка Пуск
begin
//If opendialog1.Execute then
//begin
 fl:=TMemoryStream.Create;     //Создаем новый стрим
 fl.LoadFromFile('sou.wav');  //грузим
 buf:=StrAlloc(fl.Size);     //выделяем память под длинную строку
 fl.Read(buf^, fl.Size);     //читаем в буфер файл
 format.wFormatTag:=WAVE_FORMAT_PCM;  //задаем формат
 format.nChannels:=2;                 //Двухканальный звук
 format.nSamplesPerSec:=StrToInt(edit1.Text);//указанная скорость
 format.nAvgBytesPerSec:=fl.Size; //скорость: по порции в секунду
 format.nBlockAlign:=4;           //ширина блка выравнивания
 format.wBitsPerSample:=16;       //размер сэмпла
 format.cbSize:=0;                //размер этой структуры
 
 waveOutOpen(@hzv, // указатель на идентификатор устройства, его заполнит ф-ция
  WAVE_MAPPER,// -1
  @format,   // указатель на структуру WAVEFORMAT
   0, 0, CALLBACK_NULL);
 hider.lpData:=@buf^;    // адрес блока данных
 hider.dwBufferLength:=fl.Size;  // размер блока данных
 fl.Free;
 waveOutPrepareHeader(hzv,   // идентификатор устройства
  @hider,              // указатель на структуру WAVEHDR
  SizeOf(hider));
 waveOutWrite(hzv, @hider, SizeOf(hider));
//end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);//Кнопка Стоп
begin
 waveOutPause(hzv);  //остановка воспроизведения
 waveOutUnPrepareHeader(hzv, @hider, SizeOf(hider)); //подготовка
 waveOutClose(hzv);//закрываем
 StrDispose(buf);//освобождаем память
end;

Последний раз редактировалось romlo; 25.12.2010 в 16:37. Причина: добавление некоторых комментариев
romlo вне форума Ответить с цитированием
Старый 03.01.2011, 03:41   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Вместо waveOutPause() попробуй waveOutReset().


> format.nAvgBytesPerSec:=fl.Size; //скорость: по порции в секунду

круто. По хорошему должно быть:

Код:
format.nAvgBytesPerSec := format.nSamplesPerSec * 4;// для 16 бит стерео
> format.cbSize:=0; //размер этой структуры

Это не "размер этой структуры", это размер данных, следующих за этой структурой.

> hider.dwBufferLength:=fl.Size; // размер блока данных

Ага, а если у нас файло на 50 метров, пусть драйвер подавится

Можно глянуть на этот пример, исходники они недавно открыли.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 03.01.2011, 03:44   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
пусть драйвер подавится
он не подавится
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.01.2011, 04:00   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

в принципе да, но память тоже не резиновая ) Проще, кстати, тогда уже файло отмапить через OpenFileMapping(), чем гонять байты туда-сюда. И быть готовым к тому, что все рухнет, если размер файла превысит размер доступной памяти.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 03.01.2011, 04:02   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

про память уже согласен.
порцировать данные надо
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
играть сначала 1.wav потом 2.wav mma Мультимедиа в Delphi 9 23.12.2010 20:04
Повторное открытие сообщений segail Microsoft Office Excel 8 02.07.2010 20:22
Повторное выполнение макроса Jaroslav Microsoft Office Excel 3 26.07.2009 10:12
Конвертация аудиофайлов WAV -> WAV namestnik Помощь студентам 2 27.05.2009 23:05
Воспроизведение WAV файла komp324 Общие вопросы Delphi 1 24.06.2008 12:43