Простите за нубский вопрос, но не могу разобраться как сделать так, чтобы с клавиатуры или с пульта фубар все же управлялся? Остальные плееры в большинстве своем вроде работают правильно.
Имеется в виду - когда он в свернутом состоянии.
Список разделов › foobar2000 › Общая информация
Может стоит попробовать Replaygain?Как поднять громкость в эквалайзере если композиция тихая, и обычного регулятора громкости уже мало ?
В режиме Random? Так и должно быть. В остальных будет работать.stas_on:неработает, хотя наврятле, кнопка "previous"
да в рандоме... ладно переживу=), вот ешо проблему с медиа клавами решить... было бы ништяк, ато я от хоткеев отвык, спасибо винапуВ режиме Random? Так и должно быть. В остальных будет работать.
Как это ни странно, но открыть его можно самим фубаром :)Nothing:чем открыть фубаровский database.fpl для прямого доступа?
нет, мне нужно иметь прямой доступ к таблицам, как в foo_custom_db, например_DRON_:Как это ни странно, но открыть его можно самим фубаром :)Nothing:чем открыть фубаровский database.fpl для прямого доступа?
а Павловски его знает. вот и спрашиваю, может повезет. но, имхо, логичнее было бы держать записи все-таки в формате БДMishail:2Nothing
А в database.fpl есть таблицы?
Как вы себе представляете этот самый "формат БД"? Как базу MS Access чтоли :)Nothing:но, имхо, логичнее было бы держать записи все-таки в формате БД
type
TFileHeader=packed record
GUID:TGUID;
DataOffset:DWORD;
end;
TItemHeader=packed record
ItemType:DWORD;
FileName:DWORD;
SubSongIndex:DWORD;
end;
TStdItemInfo=packed record
FileSize:Int64;
FileTime:TFileTime;
Duration:Double;
AlbumGain:Single;
TrackGain:Single;
AlbumPeak:Single;
TrackPeak:Single;
end;
TNameValue=record
Name:UTF8String;
Value:UTF8String;
end;
TNameValueList=array of TNameValue;
TItem=record
ItemType:DWORD;
FileName:UTF8String;
SubSongIndex:DWORD;
StdInfo:TStdItemInfo;
MetaInfo:TNameValueList;
FileInfo:TNameValueList;
end;
TPlaylistVersion=(fb8,fb9);
TPlayList=array of TItem;
const
V8Sign:TGUID='{E3D06882-874B-43E3-9825-4E42020AF543}';
V9Sign:TGUID='{919CA0E1-3CF8-4277-852C-3BCC1401D3F2}';
V8StdInfoSize=6*4;
V9StdInfoSize=6*4+4*4;
function LoadPlayList(const FileName:string;out PlayList:TPlayList):TPlaylistVersion;
var
Stream:TMemoryStream;
Version:TPlaylistVersion;
function ReadDWORD:DWORD;
begin
Stream.ReadBuffer(Result,SizeOf(Result));
end;
function GetString(Offset:DWORD):UTF8String;
begin
Result:=PChar(@PChar(Stream.Memory)[20+Offset]);
end;
function ReadString:UTF8String;
var
N:Integer;
begin
Stream.ReadBuffer(N,SizeOf(N));
case Version of
fb8:begin
SetLength(Result,N);
if N>0 then Stream.ReadBuffer(Pointer(Result)^,N);
end;
fb9:Result:=GetString(N);
end;
end;
procedure ReadSimpleList(var List:TNameValueList;Count:DWORD);
var
A:Integer;
begin
SetLength(List,Count);
for A:=0 to High(List) do
with List[A] do begin
Name:=ReadString;
Value:=ReadString;
end;
end;
procedure ReadStrangeList(var List:TNameValueList;Count:DWORD);
var
Index:Integer;
A:DWORD;
Pairs:array of packed record
ID,Name:DWORD;
end;
Strings:array of DWORD;
begin
List:=nil;
if Count=0 then Exit;
SetLength(List,Count);
SetLength(Pairs,Count+1);
Stream.ReadBuffer(Pairs[0],SizeOf(Pairs[0])*Count);
Pairs[Count].ID:=$FFFFFFFF;
SetLength(Strings,ReadDWORD);
Stream.ReadBuffer(Strings[0],SizeOf(Strings[0])*Length(Strings));
Index:=-1;
for A:=0 to High(Strings) do begin
if A<Pairs[Index+1].ID then
List[Index].Value:=List[Index].Value+#0+GetString(Strings[A])
else
Inc(Index);
if Pairs[Index].ID=A then begin
List[Index].Name:=GetString(Pairs[Index].Name);
List[Index].Value:=GetString(Strings[A]);
end
end;
end;
var
A:Integer;
Header:TFileHeader;
Count1,Count2,NextFile,NextInfo:DWORD;
begin
Stream:=TMemoryStream.Create;
try
Stream.LoadFromFile(FileName);
Stream.ReadBuffer(Header,SizeOf(Header));
if IsEqualGUID(Header.GUID,V8Sign) then
Version:=fb8
else if IsEqualGUID(Header.GUID,V9Sign) then begin
Stream.Seek(Header.DataOffset,soFromCurrent);
Version:=fb9;
end
else
raise Exception.Create('Unknown playlist format');
SetLength(PlayList,ReadDWORD);
for A:=0 to High(PlayList) do
with PlayList[A] do begin
ItemType:=ReadDWORD;
FileName:=ReadString;
SubSongIndex:=ReadDWORD;
if ItemType>0 then
case Version of
fb8:begin
if ItemType<>$D then
raise Exception.CreateFmt('Parse error (ItemType=%d)', [ItemType]);
Stream.ReadBuffer(StdInfo,V8StdInfoSize);
ReadSimpleList(MetaInfo,ReadDWORD);
ReadSimpleList(FileInfo,ReadDWORD);
end;
fb9:begin
if ItemType<>$1 then
raise Exception.CreateFmt('Parse error (ItemType=%d)', [ItemType]);
Stream.ReadBuffer(StdInfo,V9StdInfoSize);
NextFile:=ReadDWORD*4;
Inc(NextFile,Stream.Position);
Count1:=ReadDWORD;
Count2:=ReadDWORD;
NextInfo:=ReadDWORD*4;
Inc(NextInfo,Stream.Position);
ReadStrangeList(MetaInfo,Count1);
Stream.Position:=NextInfo;
ReadSimpleList(FileInfo,Count2);
Stream.Position:=NextFile;
end;
end;
end;
finally
Stream.Free;
end;
Result:=Version;
end;
procedure SavePlayList(const FileName:string;const PlayList:TPlayList;Version:TPlaylistVersion);
var
DataStream,StringStream:TMemoryStreamEx;
Hash:TStringHashEx;
procedure WriteDWORD(Value:DWORD);
begin
DataStream.WriteBuffer(Value,SizeOf(Value));
end;
function AddString(const Value:UTF8String):DWORD;
var
V:PDWORD;
begin
if not Hash.FindOrAdd(Value,PPointer(V)) then begin
V^:=StringStream.Position;
StringStream.WriteBuffer(Value[1],Length(Value)+1);
end;
Result:=V^;
end;
procedure WriteString(const Value:UTF8String);
var
Len:Integer;
begin
Len:=Length(Value);
DataStream.WriteBuffer(Len,SizeOf(Len));
if Len>0 then DataStream.WriteBuffer(Value[1],Len);
end;
procedure WriteLists(const MetaInfo,FileInfo:TNameValueList);
var
Pairs:array of packed record
X,Y:DWORD;
end;
PC:PChar;
S:string;
Strings:array of DWORD;
A,L,Len:Integer;
ID:DWORD;
InfoHeader:packed record
FullSize:DWORD;
MetaCount:DWORD;
FileCount:DWORD;
MetaSize:DWORD;
end;
begin
InfoHeader.MetaCount:=Length(MetaInfo);
SetLength(Pairs,InfoHeader.MetaCount);
SetLength(Strings,InfoHeader.MetaCount);
ID:=0;
for A:=0 to InfoHeader.MetaCount-1 do begin
Pairs[A].X:=ID;
Pairs[A].Y:=AddString(MetaInfo[A].Name);
PC:=PChar(MetaInfo[A].Value);
Len:=Length(MetaInfo[A].Value)+1;
repeat
if ID>DWORD(High(Strings)) then
SetLength(Strings,ID+1);
L:=StrLen(PC);
SetString(S,PC,L);
Strings[ID]:=AddString(S);
Inc(ID);
Inc(PC,L+1);
Dec(Len,L+1);
until Len=0;
end;
InfoHeader.FileCount:=Length(FileInfo);
InfoHeader.FullSize:=3+InfoHeader.MetaCount*2+1+ID+InfoHeader.FileCount*2;
InfoHeader.MetaSize:=InfoHeader.MetaCount*2+1+ID;
DataStream.WriteBuffer(InfoHeader,SizeOf(InfoHeader));
DataStream.WriteBuffer(Pairs[0],SizeOf(Pairs[0])*Length(Pairs));
WriteDWORD(ID);
DataStream.WriteBuffer(Strings[0],SizeOf(Strings[0])*Length(Strings));
SetLength(Pairs,InfoHeader.FileCount);
for A:=0 to InfoHeader.FileCount-1 do
with FileInfo[A] do begin
Pairs[A].X:=AddString(Name);
Pairs[A].Y:=AddString(Value);
end;
DataStream.WriteBuffer(Pairs[0],SizeOf(Pairs[0])*Length(Pairs));
end;
var
A,B:Integer;
FileHeader:TFileHeader;
ItemHeader:TItemHeader;
begin
DataStream:=TMemoryStreamEx.Create;
try
case Version of
fb8:begin
FileHeader.GUID:=V8Sign;
FileHeader.DataOffset:=0;
DataStream.WriteBuffer(FileHeader,SizeOf(FileHeader));
WriteDWORD(Length(PlayList));
for A:=0 to High(PlayList) do
with PlayList[A] do begin
WriteDWORD(ItemType);
WriteString(FileName);
WriteDWORD(SubSongIndex);
if ItemType>0 then begin
DataStream.WriteBuffer(StdInfo,V8StdInfoSize);
WriteDWORD(Length(MetaInfo));
for B:=0 to High(MetaInfo) do
with MetaInfo[B] do begin
WriteString(Name);
WriteString(Value);
end;
WriteDWORD(Length(FileInfo));
for B:=0 to High(FileInfo) do
with FileInfo[B] do begin
WriteString(Name);
WriteString(Value);
end;
end;
end;
DataStream.SaveToFile(FileName);
end;
fb9:begin
StringStream:=TMemoryStreamEx.Create;
try
WriteDWORD(Length(PlayList));
Hash:=TStringHashEx.Create(1024,Rot13Hash);
try
for A:=0 to High(PlayList) do
with PlayList[A] do begin
ItemHeader.ItemType:=ItemType;
ItemHeader.FileName:=AddString(FileName);
ItemHeader.SubSongIndex:=SubSongIndex;
DataStream.WriteBuffer(ItemHeader,SizeOf(ItemHeader));
if ItemType>0 then begin
DataStream.WriteBuffer(StdInfo,V9StdInfoSize);
WriteLists(MetaInfo,FileInfo);
end;
end;
finally
Hash.Free;
end;
with TFileStream.Create(FileName,fmCreate) do try
FileHeader.GUID:=V9Sign;
FileHeader.DataOffset:=StringStream.Size;
WriteBuffer(FileHeader,SizeOf(FileHeader));
WriteBuffer(StringStream.Memory^,StringStream.Size);
WriteBuffer(DataStream.Memory^,DataStream.Size);
finally
Free;
end;
finally
StringStream.Free;
end;
end;
end;
finally
DataStream.Free;
end;
end;
Если в качестве исходника у вас MP3, то там просто может не быть этих самых 20 KhZ, совсем.MotorMusic:Но когда настраиваю эквалайзер то частоты в 20 KhZ не меняются.