Bin wie gesagt kein Profi und befürchte das kann ev. Wochen dauern bis ich da durch bin.
Das Prinzip ist eigentlich sehr einfach, anstelle die Daten direkt von Disc zu laden, gibst du SDL die Daten direkt vom einem RAM-Buffer mit.
Für die ersten Versuche würde ich die Daten mal so hoch laden, egal ob MP3 oder eine Images.
Und dann kann du mal mit dem IOStream von SDL spielen.
Code: Alles auswählen
function FileToByteBuffer(const path: string): TCharArray;
var
f: file of byte;
size: int64;
begin
Result := nil;
if FileExists(path) then begin
Assign(f, path);
Reset(f);
size := FileSize(f);
SetLength(Result, size);
BlockRead(f, Result[0], size);
Close(f);
end else begin
WriteLn('FEHLER: Kann Datei ' + path + ' nicht finden');
end;
end;
Wen dies mal klappt, kannst du es immer noch über die Resourcen machen.
Ich habe es gestern mal so probiert und es funktionierte.
Code: Alles auswählen
function ResourceToByteBuffer(Resource: string): TCharArray;
var
rs: TResourceStream;
begin
Result := nil;
rs := TResourceStream.Create(HINSTANCE, Resource, RT_RCDATA);
SetLength(Result, rs.Size);
rs.Read(PChar(Result)^, rs.Size);
rs.Free;
end;
Für Windows muss einfach noch die unit windows eingebunden werden.
SDL-Seitig kannst du es dann so hoch laden.
Code: Alles auswählen
var
buffer: TCharArray;
procedure TForm1.FormCreate(Sender: TObject);
var
stream: PSDL_IOStream;
begin
// buffer := FileToByteBuffer('/home/tux/Schreibtisch/sound/test.mp3');
// oder
buffer := ResourceToByteBuffer('MP3');
stream := SDL_IOFromConstMem(Pointer(buffer), Length(buffer));
if stream = nil then begin
WriteLn('stream error: ', SDL_GetError);
end;
SDL_Init(SDL_INIT_AUDIO);
WriteLn(Mix_OpenAudio(0, nil));
music := Mix_LoadMUS_IO(stream, True);
if music = nil then begin
WriteLn('error music: ', Mix_GetError);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Mix_FadeInMusic(music, 1, 3000);
end;
Was noch wichtig ist, der Buffer muss global deklariert sein, weil SDL den braucht, bis man den Stream mit SDL_CloseIO beendet.
Das ist ein Vorteil von SDL man kann für alles den IOStrem verwenden, egal ob Musik, Images, etc.