2012-05-14 1 views
3

В настоящее время я могу воспроизводить только свой фоновый звук из-за наличия моего волнового файла рядом с моим скомпилированным exe. Но я действительно хочу иметь один статический исполняемый файл с волновым файлом внутри. Возможно ли это в Delphi XE2?Использовать волновой файл из проекта

Это мой код:

SndPlaySound('.\Raw.wav', SND_ASYNC or SND_LOOP); 
#This will play the Raw.wav that is next to my program. 

ответ

5

Если вы используйте PlaySound() вместо sndPlaySound(), вы можете использовать флаг SND_RESOURCE, чтобы воспроизводить волновой звук прямо из своего ресурса, не загружая его сначала в память.

+0

Вау, спасибо за самый короткий и самый чистый метод! _принято_ ;) – HitomiTenshi

9

Вы можете добавить SND_MEMORY флаг, и передать TResourceStream.Memory указатель в качестве первого параметра.

Прежде всего, используйте пункт меню XE2 Project->Resources and Images, чтобы добавить новый ресурс. Дайте ему путь и имя файла .wav, тип ресурса RC_DATA (его нет в выпадающем списке, но вы можете вручную ввести его) и имя ресурса, которое вы можете использовать во время выполнения, чтобы ссылаться на него. (В моем примере я использую C:\Microsoft Office\Office12\MEDIA\APPLAUSE.WAV, и дает ему имя ресурса в APPLAUSE.)

procedure TForm2.Button1Click(Sender: TObject); 
var 
    Res: TResourceStream; 
begin 
    Res := TResourceStream.Create(HInstance, 'APPLAUSE', 'RC_DATA'); 
    try 
    Res.Position := 0; 
    SndPlaySound(Res.Memory, SND_MEMORY or SND_ASYNC or SND_LOOP); 
    finally 
    Res.Free; 
    end; 
end; 
+0

Как только я запускаю свою программу, отображается сообщение об ошибке, сообщая мне, что ресурс «Raw» отсутствует. Я сделал все, что вы сказали. – HitomiTenshi

+1

Вы внесли изменения в 'RC_DATA', которые я описал? Он не будет работать с редактором ресурсов RCDATA; вы должны вручную изменить его на «RC_DATA» (обратите внимание на подчеркивание), а затем выполните «Project-> Build». Код, который я опубликовал, работает; Я запустил его на своей машине. (Вот как я обнаружил, что вам нужно было изменить 'RCDATA' на' RC_DATA', чтобы он работал правильно.) Также убедитесь, что вы используете 'RAW' вместо' Raw'; имена ресурсов должны быть в UPPERCASE. –

+0

Теперь это работает, извините за хлопот. ^^ 'Мне пришлось использовать UPPERCASE и подчеркивание, которое я не заметил вначале. Ты мой герой! : D – HitomiTenshi

1

Просто протестирована и работает на шахте:

var 
    hFind, hRes: THandle; 
    Song  : PChar; 
begin 
    hFind := FindResource(HInstance, 'BATTERY', 'WAV'); 
    if (hFind <> 0) then 
    begin 
    hRes := LoadResource(HInstance, hFind); 
    if (hRes <> 0) then 
    begin 
     Song := LockResource(hRes); 
     if Assigned(Song) then 
     begin 
     SndPlaySound(Song, snd_ASync or snd_Memory); 
     end; 
     UnlockResource(hRes); 
    end; 
    FreeResource(hFind); 
    end; 

enter image description here

+0

Вы все еще можете добавить цикл (* SND_LOOP *) .. но я не уверен, что это действительно то, что вы хотите ... – Whiler

+0

Delphi имеет встроенный класс для доступа к ресурсам ('TResourceStream'), как я уже писал. Зачем переходить через обручи вызова функций API (включая необходимость блокировки и разблокировки), когда Delphi выполняет всю работу за вас? –

+0

Спасибо за помощь, ребята, но мой герой Кен Уайт уже отлично справился с этой задачей. – HitomiTenshi

0

типа «ВОЛНА» как тип ресурсов при импорте файла WAV в редакторе ресурсов (Delphi 10 проектов, ресурсов и изображений) и просто использовать

PlaySound(resourceIndentifierName, 0, SND_RESOURCE or SND_ASYNC); 

P.S. в верхнем регистре больше не требуется