![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Звуковой движок [Delphi, Windows]
П7 © (2004-10-05 16:06:00)Дорогие товарищи, не могли бы вы мне посоветовать какой-нибудь крайне бесплатный и крайне функциональный звуковой движок. Чтобы он как минимум мог воспроизвести mp3 или ogg. Естественно не сильно напрягая проц и в многопоточном режиме...
Так же очень желательно, чтобы он не был в отдельной DLL'ке. Ибо нефиг... (:
Наверняка многих интересует этот вопрос, поэтому выписываю требования в таблицу:
- Поддержка mp3 или ogg
- Бесплатность (полная)
- Исходники или DLL
- Многопоточность
- Маленький размер
- Высокая скорость работы
Вот, кто какие движки может предложить?
П7 (2004-11-16 16:43:00) [1]Блин, написал большой постинг, где много и сильно восхищался Шквалом, но грёбаный сервак его не пропустил и как на зло продублированный в бефер обмена текст постинга умер по неосторожности... Так что вот: http://tzlab.amillo.net/delphi/sound/p7snd.htm
П7 (2004-11-16 09:21:00) [2]Хорошая новость. Компания "Антитанк", опубликовавшая звуковой двиг "Шквал" (я писал об этом в одном из постов) подготовила хидеры для подключения двигла из Delphi. Сайт их, правда, сейчас в ауте и не знаю как долго он там проваляется. Первая публичная версия порта у меня, так что можете обращаться мылом - вышлю. (:
Сегодня буду извращаться... (:
П7 (2004-10-14 18:12:00) [3]ок, завтра потестЮ! (: Может действительно - "ну его на пол", этот "собственно_ручный_декодер". Геморой, это, конечно, занятие интересное, но конечный результат мне немного дороже... (:
А на счёт хидеров, так JEDI давно уже портировала их. (: Ну прямо-таки халява валится в руки. Если всё выгорит, то можно будет со спокойной совестью заняться разработкой P7-Track-OGG формата... (:
wicked (2004-10-14 18:01:00) [4]опция компилятора {$L}...
а поскольку на паскале уже полтора года не писал ничего, то - подробности в справке...
П7 (2004-10-14 17:55:00) [5]
> wicked © (14.10.04 17:03) [33]
Блин, если бы ты внимательно прочитал все посты, то не говорил бы про линковку в dll. На счёт obj - это нужно подумать. Точнее поподробнее узнать, как? Тогда можно будет поиграться и написать свою DLL'ку на Delphi.
Так что, если можно - поподробнее про obj. (:
Ну да, попахивает. Даже больше скажу - разит за три версты... (: А чё делать? (: "Не я такой, жизнь такая!" (с)БоКонь (:
А левые dll'ки "на пол", не нужны они мне, мне нужно, чтобы у меня была одна DLL'ина для работы со всем звуковым барахлом, которое я придумаю. Например для собственного не_до_трекерного формата. (:
Так что про OBJ, плз, поподробнее. И желательно с примерами... (:
wicked (2004-10-14 17:03:00) [6]а зачем порт?.... можно линковаться с дллками (это кстати, поощряется LGPL, под которой OGG и выпущен)...
или, если уж так влом, то с obj-файлами - почти тот же порт, но работы в 10 раз меньше - перевести тока заголовочные файлы....
ничего личного, но намерение однозначно (1 к 1)перевести на паскаль больше чем 100-150 кб кода попахивают "Полесовщиной"... :)
П7 (2004-10-14 13:44:00) [7]
> wicked © (14.10.04 13:16) [31]
Может я такой тупой, но как-то я там не замечал порта на Delphi всех исходных кодов OGG.DLL и VORBIS.DLL. Если вы их там заметили, не поделитесь ли ссылочкой?
WondeRu (2004-10-14 13:16:00) [8]П7 (14.10.04 13:02) [29]
хочу свою библиотеку написать.
а потом детям рассказывать, мол Ваш батька был куллл, и звуковой движок сам написал и Лениным бревна таскал на субботниках))))))
wicked (2004-10-14 13:16:00) [9]кулибины блин.... чем не устраивают исходники от xiph.org?... завра что то поменяется и "опять в бой с мельницами"?....
П7 (2004-10-14 13:02:00) [10]Блин, нафиг сюда постишь исходники??? Скинул бы мне на мыло, я бы выложил в сети.
Самая трабла в том, что если бы я хотел поиметь на Delphi какую-нибудь звуковую библиотеку, то проблем бы не возникало. Вон их куча какая с доками со всеми. Да к томуже почти ко всем написаны заголовочники на Delphi. Только вот не хочу я этого, хочу свою библиотеку написать.
Чем выводить - это одно, а вот декодировать формат - это другое.
tsalBSM (2004-10-14 05:21:00) [11]FLTfuncInfo = record
DLLInstance : THandle;
pQueryCoolFilter :BOOLEAN;
pFilterUnderstandsFormat :BOOLEAN;
pGetSuggestedSampleType :BOOLEAN;
pOpenFilterOutput :BOOLEAN;
pCloseFilterOutput :BOOLEAN;
pWriteFilterOutput :BOOLEAN;
pOpenFilterInput :BOOLEAN;
pFilterGetFileSize :BOOLEAN;
pReadFilterInput :BOOLEAN;
pCloseFilterInput :BOOLEAN;
pFilterGetOptions :BOOLEAN;
pFilterOptions :BOOLEAN;
pFilterOptionsString :BOOLEAN;
pFilterSetOptions :BOOLEAN;
pFilterWriteSpecialData :BOOLEAN;
pFilterGetFirstSpecialData :BOOLEAN;
pFilterGetNextSpecialData :BOOLEAN;
end;
var
QueryCoolFilter :TQueryCoolFilter ;
FilterUnderstandsFormat :TFilterUnderstandsFormat;
GetSuggestedSampleType :TGetSuggestedSampleType;
OpenFilterOutput :TOpenFilterOutput;
CloseFilterOutput :TCloseFilterOutput;
WriteFilterOutput :TWriteFilterOutput;
OpenFilterInput :TOpenFilterInput;
FilterGetFileSize :TFilterGetFileSize;
ReadFilterInput :TReadFilterInput;
CloseFilterInput :TCloseFilterInput;
FilterGetOptions :TFilterGetOptions;
FilterOptions :TFilterOptions;
FilterOptionsString :TFilterOptionsString;
FilterSetOptions :TFilterSetOptions;
FilterWriteSpecialData :TFilterWriteSpecialData;
FilterGetFirstSpecialData :TFilterGetFirstSpecialData;
FilterGetNextSpecialData :TFilterGetNextSpecialData;
Function LoadFLT(LibFilename:String):FLTFuncInfo;
Procedure FreeFLT(DLLHandle:Thandle);
implementation
Procedure FreeFLT(DLLHandle:Thandle);
begin
FreeLibrary(DLLHandle);
end;
Function LoadFLT(LibFilename:String):FLTFuncInfo;
begin
Result.pQueryCoolFilter := False;
Result.pFilterUnderstandsFormat := False;
Result.pGetSuggestedSampleType := False;
Result.pOpenFilterOutput := False;
Result.pCloseFilterOutput := False;
Result.pWriteFilterOutput := False;
Result.pOpenFilterInput := False;
Result.pFilterGetFileSize := False;
Result.pReadFilterInput := False;
Result.pCloseFilterInput := False;
Result.pFilterGetOptions := False;
Result.pFilterOptions := False;
Result.pFilterOptionsString := False;
Result.pFilterSetOptions := False;
Result.pFilterWriteSpecialData := False;
Result.pFilterGetFirstSpecialData := False;
Result.pFilterGetNextSpecialData := False;
Result.DLLInstance := 0;
Result.DLLInstance := LoadLibrary(Pchar(LibFilename));
if Result.DLLInstance = 0 then exit;
@QueryCoolFilter := getProcAddress(Result.DLLInstance,'QueryCoolFilter');
@FilterUnderstandsFormat := getProcAddress(Result.DLLInstance,'FilterUnderstandsFormat');
@GetSuggestedSampleType := getProcAddress(Result.DLLInstance,'GetSuggestedSampleType');
@OpenFilterOutput := getProcAddress(Result.DLLInstance,'OpenFilterOutput');
@CloseFilterOutput := getProcAddress(Result.DLLInstance,'CloseFilterOutput');
@WriteFilterOutput := getProcAddress(Result.DLLInstance,'WriteFilterOutput');
@OpenFilterInput := getProcAddress(Result.DLLInstance,'OpenFilterInput');
@FilterGetFileSize := getProcAddress(Result.DLLInstance,'FilterGetFileSize');
@ReadFilterInput := getProcAddress(Result.DLLInstance,'ReadFilterInput');
@CloseFilterInput := getProcAddress(Result.DLLInstance,'CloseFilterInput');
@FilterGetOptions := getProcAddress(Result.DLLInstance,'FilterGetOptions');
@FilterOptions := getProcAddress(Result.DLLInstance,'FilterOptions');
@FilterOptionsString := getProcAddress(Result.DLLInstance,'FilterOptionsString');
@FilterSetOptions := getProcAddress(Result.DLLInstance,'FilterSetOptions');
@FilterWriteSpecialData := getProcAddress(Result.DLLInstance,'FilterWriteSpecialData');
@FilterGetFirstSpecialData := getProcAddress(Result.DLLInstance,'FilterGetFirstSpecialData');
@FilterGetNextSpecialData := getProcAddress(Result.DLLInstance,'FilterGetNextSpecialData');
if addr(QueryCoolFilter) <> NIL then Result.pQueryCoolFilter := True;
if addr(FilterUnderstandsFormat) <> NIL then Result.pFilterUnderstandsFormat := True;
if addr(GetSuggestedSampleType) <> NIL then Result.pGetSuggestedSampleType := True;
if addr(OpenFilterOutput) <> NIL then Result.pOpenFilterOutput := True;
if addr(CloseFilterOutput) <> NIL then Result.pCloseFilterOutput := True;
if addr(WriteFilterOutput) <> NIL then Result.pWriteFilterOutput := True;
if addr(OpenFilterInput) <> NIL then Result.pOpenFilterInput := True;
if addr(FilterGetFileSize) <> NIL then Result.pFilterGetFileSize := True;
if addr(ReadFilterInput) <> NIL then Result.pReadFilterInput := True;
if addr(CloseFilterInput) <> NIL then Result.pCloseFilterInput := True;
if addr(FilterGetOptions) <> NIL then Result.pFilterGetOptions := True;
if addr(FilterOptions) <> NIL then Result.pFilterOptions := True;
if addr(FilterOptionsString) <> NIL then Result.pFilterOptionsString := True;
if addr(FilterSetOptions) <> NIL then Result.pFilterSetOptions := True;
if addr(FilterWriteSpecialData) <> NIL then Result.pFilterWriteSpecialData := True;
if addr(FilterGetFirstSpecialData) <> NIL then Result.pFilterGetFirstSpecialData := True;
if addr(FilterGetNextSpecialData) <> NIL then Result.pFilterGetNextSpecialData := True;
end;
end.
tsalBSM (2004-10-14 05:21:00) [12]unit AuditionFLT;
interface
uses Windows,Sysutils,Classes;
const
R_5500 = 1;
R_11025 = 2;
R_22050 = 4;
R_32075 = 8;
R_44100 = 16;
R_48000 = 32;
R_88200 = 64;
R_96000 = 128;
R_132300 = 256;
R_176400 = 512;
C_VALIDLIBRARY = 1154;
QF_RATEADJUSTABLE = $001; // if can handle non-standard sample rates
// if not, only rates in bit rate table understood
QF_CANSAVE = $002;
QF_CANLOAD = $004;
QF_UNDERSTANDSALL = $008; // will read ANYTHING, so it is the last resort if no other
// formats match
QF_READSPECIALFIRST = $010; // read special info before trying to read data
QF_READSPECIALLAST = $020; // read special info after reading data
QF_WRITESPECIALFIRST = $040; // when writing a file, special info is sent to DLL before data
QF_WRITESPECIALLAST = $080; // when writing, special info is sent to DLL after data
QF_HASOPTIONSBOX = $100; // set if options box implemented
QF_NOASKFORCONVERT = $200; // set to bypass asking for conversion if original in different rate, auto convert
QF_NOHEADER = $400; // set if this is a raw data format with no header
QF_CANDO32BITFLOATS = $800; // set if file format can handle 32-bit sample data for input
QF_CANOPENVIRTUAL = $1000; // Set if data is in Intel 8-bit or 16-bit sample format, or floats
// special types are read from and written to DLL in the order below
// special types (particular to Windows waveforms)
SP_IART = 20;
SP_ICMT = 21;
SP_ICOP = 22;
SP_ICRD = 23;
SP_IENG = 24;
SP_IGNR = 25;
SP_IKEY = 26;
SP_IMED = 27;
SP_INAM = 28;
SP_ISFT = 29;
SP_ISRC = 30;
SP_ITCH = 31;
SP_ISBJ = 32;
SP_ISRF = 33;
SP_DISP = 34;
SP_CUE = 40; // returns number of cues of size cue_type
SP_LTXT = 41; // returns number of adtl texts of size 8 (4,id and 4,len)
SP_NOTE = 42; // returns LO=size, HI=number of strings (sz sz sz...)
SP_LABL = 43; // returns LO=size, HI=number of strings (sz sz sz...)
SP_PLST = 44; // returns number of playlist entries size play_type
Type
FOURCC = DWORD;
riffspecialdata_t = record
hSpecialData:DWORD;
hData :DWORD;
dwSize :DWORD;
dwExtra :DWORD;
szListType :array[0..7] of Char;
szType :array[0..7] of Char;
end;
cue_type = record
dwName :DWORD;
fccChunk :FOURCC;
dwChunkStrart:DWORD;
dwBlockStart :DWORD;
dwSampeOffset:DWORD;
end;
play_type = record
dwName :DWORD;
dwLength :DWORD;
dwLoops :DWORD;
end;
coolquery_tag = record
szName :array[0..23] of Char;
szCopyright:array[0..79] of Char;
Quad32 :WORD; // Quads are 3-D encoded
Quad16 :WORD;
Quad8 :WORD;
Stereo8 :WORD; // rates are from lowest bit:
Stereo12 :WORD; // bit 0 set: 5500 (5512.5)
Stereo16 :WORD; // bit 1 set: 11025 (11K)
Stereo24 :WORD; // bit 2 set: 22050 (22K)
Stereo32 :WORD; // bit 3 set: 32075 (32K, or 32000)
Mono8 :WORD; // bit 4 set: 44100 (44K)
Mono12 :WORD; // bit 5 set: 48000 (48K)
Mono16 :WORD; // bit 6 set: 88200 (88K) (future ultra-sonic rates?)
Mono24 :WORD; // bit 7 set: 96000 (96K)
Mono32 :WORD;
dwFlags :DWORD;
szExt :array[0..3] of Char;
lChunkSize :LongInt;
szExt2 :array[0..3] of Char;
szExt3 :array[0..3] of Char;
szExt4 :array[0..3] of Char;
end;
TQueryCoolFilter = Function(COOLQUERY:coolquery_tag):ShortInt;pascal;
TFilterUnderstandsFormat = Function(lpszFilename:string):Boolean;pascal;
TGetSuggestedSampleType = Procedure(lplSamprate:Pinteger; lplwBitsPerSample:PWORD; lpwChannels:PWORD);pascal;
TOpenFilterOutput = Function( lpszFilename:String; lSamprate:Integer; wBitsPerSample:WORD;wChannels:WORD; lSize:Integer; lplChunkSize:Pinteger; dwOptions:DWORD ):DWORD;pascal;
TCloseFilterOutput = Procedure( hOutput:Dword);pascal;
TWriteFilterOutput = Function( hOutput:DWORD; lpbData:PByte; lBytes:integer):Dword;pascal;
TOpenFilterInput = Function( lpszFilename:string; lplSamprate:PInteger; lpwBitsPerSample:PWORD;pwChannels:PWORD; Wnd:Hwnd; lplChunkSize:Pinteger ):DWORD;pascal;
TFilterGetFileSize = Function( hInput:Dword ):DWORD;pascal;
TReadFilterInput = Function( hInput:DWord; lpbData:PByte; lBytes:integer):Dword;pascal;
TCloseFilterInput = Procedure( hInput:Dword );pascal;
TFilterGetOptions = Function( Wnd:HWND; hInst:DWORD; lSamprate:integer; wChannels:WORD;wBitsPerSample:WORD; dwDefaultOptions:DWORD ):Dword;pascal;
TFilterOptions = Function( hInput:Dword ):Dword;pascal;
TFilterOptionsString = Function( hInput:Dword; lpszString:String ):Dword;pascal;
TFilterSetOptions = Function( hInput:DWORD; dwOptions:DWORD; lSamprate:integer; wChannels:WORD; wBPS:WORD ):DWORD;pascal;
TFilterWriteSpecialData = Function(hOutput:DWORD; szListType:STRING; szType:STRING; pData:PChar; dwSize:Dword):DWORD;pascal;
TFilterGetFirstSpecialData = Function( hInput:DWORD; psp:Pointer ):DWORD;pascal;
TFilterGetNextSpecialData = Function( hInput:DWORD; psp:Pointer ):DWORD;pascal;
tsalBSM (2004-10-14 05:20:00) [13]А вообще я ползуюсь Прямым-Звуком от дядюшки Билла, а файлы разных форматов открываю с помощю FLT библиотек Adobe Audition aka CoolEdit.
вот передрал и доплнил заголовки с С++, может кому понадобятся
tsalBSM (2004-10-14 05:06:00) [14]У меня появилась идея сделать на основе OGG свой простенький трекерный формат. Без наворотов, но с пожатыми семплами. Но в начале нужно декодер OGG написать. Уже есть кое какие исходники. Сегодня вот разгребу, может чего даже выложу.
Уже есть такой формат называется MO3
П7 (2004-10-13 15:47:00) [15]Надыбал много-много исходников на С. Разбираться откровенно не хочется, поэтому пока продолжаю искать. Если не найду придётся, видимо, транслировать с С на Delphi. ):
А транслировать там около метра Сишного кода - ЖУТЬ!!! ):
Всем молиться за меня, в бой!!! (:
Micah'GF (2004-10-13 15:39:00) [16][22] П7
хм, интересные замыслы...
..добавляем в закладки, будем наблюдать..
П7 (2004-10-13 10:50:00) [17]У меня появилась идея сделать на основе OGG свой простенький трекерный формат. Без наворотов, но с пожатыми семплами. Но в начале нужно декодер OGG написать. Уже есть кое какие исходники. Сегодня вот разгребу, может чего даже выложу.
NailMan (2004-10-13 09:32:00) [18]трекерные форматы это какие? Есть же старые форматы(S3m, XM, MOD) и новые на основе старых, но с mp3-семплами.
Лучше имхо нормальный OGG, просто воспроизводить и никаких подвдных камней, а с трекерными форматами(сужу по геморру моего друга, который пытался сделать качественную поддержку XM у себя в плеере) очень много ньюансов, как-то реализация всевозможных паттерных эффектов, всяческих мультиканальностей и некоторых особенностей общего принципа построения звукового ряда.
Тем более особенного качества ты не получишь на этих форматах - для веса надо юзать слабенькие по качеству сэмплы, а если с нормальным(44100), то смысла нет особого. OGG нивелирует разницу между потоковым форматом и сэмплово-паттерным, так как последний не подразумевает сжатие сэмплов(не будем о форматах с mp3-сэмплами).
Вобщем про трекерки тоже забудь и не трать свои силы и задор впустую.
---
WBR, NailMan aka 2:5020/3337.13
П7 (2004-10-12 18:21:00) [19]Хм. Ну, видимо так тому и быть. А то, что уже есть воплощю в простенький mp3'плеер. Исключительно для гнутия пальцОв. (: Мол у меня весь софт свой... (:
Значит решено, курс на OGG и трекерные форматы. ВотЪ! (:
Ждите обновлений! (:
NailMan (2004-10-12 17:54:00) [20]П7
насколько я в курсе IT-новостей, ДА, именно такая ситуация с MP3. Именно поэтому все настоящие(в смысле выходящие с недавних пор) игры пользуют OGG для хранения ВСЕГО саунда(и музыки и SFX). Doom3 не исключение. Также как и мелкомягкие игрушки(от MS).
Так что забудь о MP3 и делай декодер OGG.
---
WBR, NailMan aka 2:5020/3337.13