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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2010, 14:36   #1
xakero4ek
 
Регистрация: 06.10.2010
Сообщений: 4
Печаль Не проигрывается аудио-файл.

Здравствуйте. Решил в программе встроить муз.файлы в ехешник, заархивировал как надо файлы в *.res

подключил к программе {$R music2.res}
В uses подрубил мод (библиотеку, как угодно) MMSystem

Далее пишу код вызова архива и извлечения оттуда музыки.
Код:
 var
hResource: THandle; 
pData: Pointer;//music2.res
begin
hResource:=LoadResource( hInstance, FindResource(hInstance, SND1, RT_RCDATA));
pData := LockResource(hResource);
SndPlaySound(pData, SND_MEMORY);
FreeResource(hResource);
end;
где SND1 название аудио файла в формате WAV.

Далее, собственно, создаю Button1 (кнопочку) для начала воспроизведения:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
PlayWAVfromRES('SND1');
end;
При открытии программы и нажатии на кнопку - воспроизведения нету.
Я думаю, что-то напутал с переменной Pointer,
либо файл врубается и сразу останавливается, ну или попросту не хватает какой-либо библиотеки.

Помогите, есть ли предложения?

Последний раз редактировалось Stilet; 06.10.2010 в 15:03.
xakero4ek вне форума Ответить с цитированием
Старый 06.10.2010, 16:25   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Пример, который работает (только что проверено).
строка в файле snd.rc:
WAVE1 RCDATA LOADONCALL 001.wav
Запуск в программе:
Код:
{$R snd.res}
...
procedure PlayMyWave;
var
  hResource: THandle;
  pData: Pointer;
begin
  hResource:=LoadResource(hInstance, FindResource(hInstance, 'WAVE1', RT_RCDATA));
  try
    pData := LockResource(hResource);
    if pData = nil then Exit;
    sndPlaySound(pData, snd_Memory or SND_ASYNC);
  finally
    FreeResource(hResource);
  end;
end;
Прик вне форума Ответить с цитированием
Старый 06.10.2010, 20:38   #3
xakero4ek
 
Регистрация: 06.10.2010
Сообщений: 4
По умолчанию

Ух. Благодарю. Даже в высшем учебном заведении мне не смогли помочь. Следовательно для запуска файла нужно использовать PlayMyWave; и дальше от этой команды отталкиваться...
xakero4ek вне форума Ответить с цитированием
Старый 06.10.2010, 21:14   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Не знаю что подразумевается под словами "от этой команды отталкиваться..", но PlayMyWave это не команда, а просто процедура, в которой извлекается звук из ресурса в память и запускается на проигрывание.
Если заметили, что процедура вами приведенная ничем не отличается от той, которая приведена в моем посте. Отсюда можно привести массу версий от чего звук не слышен ("не проигрывается"):
- не работает звуковая плата;
- не установлен драйвер этой платы;
- не подключены колонки;
- колонки подключены, но не включены в сеть;
- регулятор громкости выведен на "нуль";
- заложены уши после бодуна (ну, тут скорее, по собственному опыту);
и, наконец, неправильно скомпилирован ресурс (не зря приведена строка для компиляции).
Впрочем, могут найтись еще масса причин.
Прик вне форума Ответить с цитированием
Старый 06.10.2010, 23:09   #5
xakero4ek
 
Регистрация: 06.10.2010
Сообщений: 4
По умолчанию

Ну в принципе все работает Еще раз спасибо за пояснение)
Сейчас там разбираюсь в некоторых ньюансах.

Кстати, не могли бы вы пояснить, почему мой код не работал? Ведь они почти идентичны)

Тему можно будет закрыть.
xakero4ek вне форума Ответить с цитированием
Старый 07.10.2010, 07:46   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Кстати, если интересно, есть более простая конструкция проигрывания файлов формата WAV из ресурсов.
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  PLaySound('WAVE1', hInstance, SND_RESOURCE or SND_ASYNC);
end;
Строка в файле для компиляции ресурса:
WAVE1 SOUND 003.wav
Первый параметр - свое имя ресурса
Второй - ключевое слово (одно из зарезервированных)
Третий - имя компилируемого файла.

Применять нужно более "продвинутую" функцию PlaySound, а функция API sndPlaySound - это ее подмножество и оставлена для совместимости.
Прик вне форума Ответить с цитированием
Старый 07.10.2010, 12:50   #7
xakero4ek
 
Регистрация: 06.10.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Строка в файле для компиляции ресурса:
WAVE1 SOUND 003.wav
Первый параметр - свое имя ресурса
Второй - ключевое слово (одно из зарезервированных)
Третий - имя компилируемого файла.

Применять нужно более "продвинутую" функцию PlaySound, а функция API sndPlaySound - это ее подмножество и оставлена для совместимости.
Благодарю, буду знать на будущее. Комплимировал сначала я так же, как описанно выше.

В случае проблем каких-либо буду апать темку.

Последний раз редактировалось xakero4ek; 07.10.2010 в 12:53.
xakero4ek вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аудио конвертер Tirendus Софт 13 19.05.2012 19:11
C++ 2008 аудио ? denes Общие вопросы C/C++ 0 09.06.2010 21:45
не проигрывается .swf в IE 4e4en HTML и CSS 2 18.02.2010 08:47
WinAPI - системное время+аудио файл (wav) Olejik Общие вопросы C/C++ 17 07.11.2009 11:32
Можно ли встроить субтитры в видео которое проигрывается онлайн? _Имя_ Помощь студентам 1 01.06.2009 13:58