Entwickler-Ecke
Multimedia / Grafik - Datei aus eigebundender *.res als TMediafile nutzen
IhopeonlyReader - Di 12.06.12 18:42
Titel: Datei aus eigebundender *.res als TMediafile nutzen
guten Tag,
die Music.res enthält folgenden Inhalt:
Delphi-Quelltext
1: 2: 3: 4:
| 1 WAVE "C:\Users\Benutzername\Desktop\Spiel\nötigeSounds\Win.wav" 2 WAVE "C:\Users\Benutzername\Desktop\Spiel\nötigeSounds\Loose.wav" 3 WAVE "C:\Users\Benutzername\Desktop\Spiel\nötigeSounds\Teleporter.wav" 4 MIDI "C:\Users\Benutzername\Desktop\Spiel\nötigeSounds\Backgroundmusic.mid" |
ich habe sie dann compiliert ( mit Brcc32.exe) und sie eingebunden.. soweit kein problem
die "Kurztöne" (also 1,2 und 3) spiele ich mit folgendem Code ab:
Delphi-Quelltext
1: 2: 3:
| PlaySound(PCHAR(1),HInstance, snd_ASync or snd_Memory or snd_Resource); PlaySound(PCHAR(2),HInstance, snd_ASync or snd_Memory or snd_Resource); PlaySound(PCHAR(3),HInstance, snd_ASync or snd_Memory or snd_Resource); |
Soweit alles kein problem :)
Aber wie kann ich die 3 Minuten MIDI Sequenz wiedergeben? Playsound funktioniert nicht parallel (mehrmals), dann bricht die jetzige ab, also wenn er ein LV schafft hört die Hintergrundmusik auf, damit fällt PlaySound aus.
Bis jetzz hatte ich die Midi-Sequenz immer beigelegt und sie mit einem TMediaplayer abgespielt. Aber das funktioniert jetzt nicht mehr :(
Möglichkeit (die ich aber vermeiden möchte):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var Datei: TResourceStream; MedPlayer: TMediaPlayer;
Datei := TResourceStream.Create(HInstance,'4' , 'MIDI'); try Datei.SaveToFile(Pfad+'\Backroundmusic.mid'); finally Datei.Free; end; MedPlayer := TMediaPlayer.create(Form1); try MedPlayer.Filename := Pfad+'\Backroundmusic.mid'; finally Medplayer.play; |
ich denke ihr versteht, dass ich die Hintergrundmusik direkt in der EXE verwenden möchte und sie nciht vorher speichern möchte...
freu mich auf eure Antworten :)
EDIT: Ich möchte nicht den Mediaplayer vermeiden, sondern das Speichern der Datei um sie mit dem TMediaplayer zu verwenden.. kann ich eine variable Datei: MusicFile anlegen und diese dann mit Datei := TResourceStream.Create(HInstance,'4' , 'MIDI') aufrufen und dann mit MedPlayer.File := Datei arbeiten? natürlich ist das jetzt sehr grob gedacht, aber von der Idee her mein ich natürlich
Moderiert von Narses: Beiträge zusammengefasst
MCISendString(PChar('play ' + Pfad+'Backgroundmusik.Mid'), nil, 0, 0);
klappt auch leider nicht... :(
mal ne frage: warum ist folgender code nicht möglich:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var Datei: TResourceStream;
Datei := TResourceStream.Create(HInstance,'4' , 'MIDI'); MCISendString(PChar('play ' + Datei), nil, 0, 0); |
ich gehe davon aus, das der Fehler darin liegt, das ein TResourceStream nicht weitergegeben werden kann an die Soundkarte, aber wie ist es denn?
Und wie schaff ich es einen TMediaplayer eine Datei abzuspielen? Also dass ich keinen Pfad sondenr eine Datei angebe...
Beispiel:
Bis jetzt: Mediaplayer.filename := Pfad+Musikdatei
Gesucht: Mediaplayer.????? := Datei;
Was muss hinter den . für die Fragezeichen ?? sowas wie File gibt es ja leider nicht.
Was muss die Variable Datei für ein Typ sein? ich denke mal sowas wie Mediafile, dass auch nicht klappt :D
(das sind nur Überlegungen von mir, wie es ungefähr sein müsste... aber ich weiß es einfach nicht genau :( )
Moderiert von Narses: Topic aus Dateizugriff verschoben am Di 12.06.2012 um 23:39
IhopeonlyReader - Mi 13.06.12 17:12
Die Frage nochmal kurz:
Wie kann man eine Datei (die per *.res eingebunden wurde) mit einem Mediaplayer abspielen?
IhopeonlyReader - Sa 16.06.12 11:54
-push-
PS: Ist das Erlaubt?
jaenicke - Sa 16.06.12 12:43
[quote:b9163613b8=\"
IhopeonlyReader\"(664496)]-push-
PS: Ist das Erlaubt?[/quote:b9163613b8]Da mehr als 24 Stunden vergangen sind, ja. ;-)
Ich denke das beste ist dafür die Bass DLL, das ist ohnehin mindestens tausendmal besser als der TMediaPlayer:
http://www.un4seen.com/bass.html
Damit kannst du auch Streams abspielen und mit TResourceStream hast du ja bereits die Daten in einem Stream.
IhopeonlyReader - Sa 16.06.12 16:07
Danke :) Aber bei dem einbinden folgendes Problem: mit der Unit: "Dynamic_WASAPI"
Quellcode der Unit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197:
|
unit Dynamic_WASAPI;
interface
uses Windows, Dynamic_Bass;
const BASS_ERROR_BUSY = 46; BASS_ERROR_WASAPI = 5000; BASS_WASAPI_TYPE_NETWORKDEVICE = 0; BASS_WASAPI_TYPE_SPEAKERS = 1; BASS_WASAPI_TYPE_LINELEVEL = 2; BASS_WASAPI_TYPE_HEADPHONES = 3; BASS_WASAPI_TYPE_MICROPHONE = 4; BASS_WASAPI_TYPE_HEADSET = 5; BASS_WASAPI_TYPE_HANDSET = 6; BASS_WASAPI_TYPE_DIGITAL = 7; BASS_WASAPI_TYPE_SPDIF = 8; BASS_WASAPI_TYPE_HDMI = 9; BASS_WASAPI_TYPE_UNKNOWN = 10;
BASS_DEVICE_ENABLED = 1; BASS_DEVICE_DEFAULT = 2; BASS_DEVICE_INIT = 4; BASS_DEVICE_LOOPBACK = 8; BASS_DEVICE_INPUT = 16;
BASS_WASAPI_EXCLUSIVE = 1; BASS_WASAPI_AUTOFORMAT = 2; BASS_WASAPI_BUFFER = 4;
BASS_WASAPI_FORMAT_FLOAT = 0; BASS_WASAPI_FORMAT_8BIT = 1; BASS_WASAPI_FORMAT_16BIT = 2; BASS_WASAPI_FORMAT_24BIT = 3; BASS_WASAPI_FORMAT_32BIT = 4;
type BASS_WASAPI_DEVICEINFO = record name: PAnsiChar; id: PAnsiChar; &type: DWORD; flags: DWORD; minperiod: Single; defperiod: Single; mixfreq: DWORD; mixchans: DWORD; end;
BASS_WASAPI_INFO = record initflags: DWORD; freq: DWORD; chans: DWORD; format: DWORD; buflen: DWORD; volmax: Single; volmin: Single; volstep: Single; end;
WASAPIPROC = function(buffer:Pointer; length:DWORD; user:Pointer): DWORD; stdcall;
var BASS_WASAPI_GetVersion:function(): DWORD; stdcall; BASS_WASAPI_GetDeviceInfo:function(device:DWORD; var info:BASS_WASAPI_DEVICEINFO): BOOL; stdcall; BASS_WASAPI_GetDeviceLevel:function(device:DWORD; chan:Integer): single; stdcall; BASS_WASAPI_SetDevice:function(device:DWORD): BOOL; stdcall; BASS_WASAPI_GetDevice:function(): DWORD; stdcall; BASS_WASAPI_CheckFormat:function(device:Integer; freq,chans,flags:DWORD): DWORD; stdcall; BASS_WASAPI_Init:function(device:Integer; freq,chans,flags:DWORD; buffer,period:Single; proc:WASAPIPROC; user:Pointer): BOOL; stdcall; BASS_WASAPI_Free:function(): BOOL; stdcall; BASS_WASAPI_GetInfo:function(var info:BASS_WASAPI_INFO): BOOL; stdcall; BASS_WASAPI_GetCPU:function(): float; stdcall; BASS_WASAPI_Lock:function(lock:BOOL): BOOL; stdcall; BASS_WASAPI_Start:function(): BOOL; stdcall; BASS_WASAPI_Stop:function(reset:BOOL): BOOL; stdcall; BASS_WASAPI_IsStarted:function(): BOOL; stdcall; BASS_WASAPI_SetVolume:function(linear:BOOL; volume:single): BOOL; stdcall; BASS_WASAPI_GetVolume:function(linear:BOOL): single; stdcall; BASS_WASAPI_SetMute:function(mute:BOOL): BOOL; stdcall; BASS_WASAPI_GetMute:function(): BOOL; stdcall; BASS_WASAPI_PutData:function(buffer: Pointer; length: DWORD): DWORD; stdcall; BASS_WASAPI_GetData:function(buffer: Pointer; length: DWORD): DWORD; stdcall; BASS_WASAPI_GetLevel:function(): DWORD; stdcall;
var WASAPI_Handle : Thandle = 0;
Function Load_WASAPIDLL(const dllfilename : string) : boolean; procedure Unload_WASAPIDLL;
implementation
Function Load_WASAPIDLL(const dllfilename : string) : boolean; var oldmode : integer; begin if WASAPI_Handle <> 0 then Result:= true else begin oldmode := SetErrorMode($8001); {$IFDEF UNICODE} WASAPI_Handle:= LoadLibraryW(PWideChar(dllfilename)); {$ELSE} BASSCD_Handle:= LoadLibrary(PChar(dllfilename)); {$ENDIF} SetErrorMode(oldmode); if WASAPI_Handle <> 0 then begin @BASS_WASAPI_GetVersion:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetVersion')); @BASS_WASAPI_GetDeviceInfo:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetDeviceInfo')); @BASS_WASAPI_GetDeviceLevel:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetDeviceLevel')); @BASS_WASAPI_SetDevice:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_SetDevice')); @BASS_WASAPI_GetDevice:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetDevice')); @BASS_WASAPI_CheckFormat:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_CheckFormat')); @BASS_WASAPI_Init:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_Init')); @BASS_WASAPI_Free:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_Free')); @BASS_WASAPI_GetInfo:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetInfo')); @BASS_WASAPI_GetCPU:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetCPU')); @BASS_WASAPI_Lock:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_Lock')); @BASS_WASAPI_Start:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_Start')); @BASS_WASAPI_Stop:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_Stop')); @BASS_WASAPI_IsStarted:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_IsStarted')); @BASS_WASAPI_SetVolume:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_SetVolume')); @BASS_WASAPI_GetVolume:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetVolume')); @BASS_WASAPI_SetMute:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_SetMute')); @BASS_WASAPI_GetMute:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetMute')); @BASS_WASAPI_PutData:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_PutData')); @BASS_WASAPI_GetData:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetData')); @BASS_WASAPI_GetLevel:= GetProcAddress(WASAPI_Handle, Pchar('BASS_WASAPI_GetLevel'));
if (@BASS_WASAPI_GetVersion = nil) or (@BASS_WASAPI_GetDeviceInfo = nil) or (@BASS_WASAPI_GetDeviceLevel = nil) or (@BASS_WASAPI_SetDevice = nil) or (@BASS_WASAPI_GetDevice = nil) or (@BASS_WASAPI_CheckFormat = nil) or (@BASS_WASAPI_Init = nil) or (@BASS_WASAPI_Free = nil) or (@BASS_WASAPI_GetInfo = nil) or (@BASS_WASAPI_GetCPU = nil) or (@BASS_WASAPI_Lock = nil) or (@BASS_WASAPI_Start = nil) or (@BASS_WASAPI_Stop = nil) or (@BASS_WASAPI_IsStarted = nil) or (@BASS_WASAPI_SetVolume = nil) or (@BASS_WASAPI_GetVolume = nil) or (@BASS_WASAPI_SetMute = nil) or (@BASS_WASAPI_GetMute = nil) or (@BASS_WASAPI_PutData = nil) or (@BASS_WASAPI_GetData = nil) or (@BASS_WASAPI_GetLevel = nil) then begin FreeLibrary(WASAPI_Handle); WASAPI_Handle := 0; end; end; Result:= (WASAPI_Handle <> 0); end; end;
procedure Unload_WASAPIDLL; begin if WASAPI_Handle <> 0 then FreeLibrary(WASAPI_Handle); WASAPI_Handle := 0; end;
end. |
Fehlermeldung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| [Fehler] Dynamic_WASAPI.pas(56): Ungültiges Zeichen in Eingabedatei: '&' ($26) [Fehler] Dynamic_WASAPI.pas(56): '=' erwartet, aber ';' gefunden [Fehler] Dynamic_WASAPI.pas(57): '=' erwartet, aber ':' gefunden [Fehler] Dynamic_WASAPI.pas(58): '=' erwartet, aber ':' gefunden [Fehler] Dynamic_WASAPI.pas(59): '=' erwartet, aber ':' gefunden [Fehler] Dynamic_WASAPI.pas(60): '=' erwartet, aber ':' gefunden [Fehler] Dynamic_WASAPI.pas(61): '=' erwartet, aber ':' gefunden [Fehler] Dynamic_WASAPI.pas(62): 'IMPLEMENTATION' erwartet, aber ';' gefunden [Fehler] Dynamic_WASAPI.pas(73): '.' erwartet, aber ';' gefunden [Fehler] Dynamic_WASAPI.pas(75): Bezeichner erwartet, aber '(' gefunden [Fehler] Dynamic_WASAPI.pas(75): Unbekannte Anweisung: 'length' [Fehler] Dynamic_WASAPI.pas(92): Undefinierter Bezeichner: 'WASAPIPROC' [Fehler] Dynamic_WASAPI.pas(94): Undefinierter Bezeichner: 'BASS_WASAPI_INFO' [Fehler] Dynamic_WASAPI.pas(110): Lokale Variablen können nicht initialisiert werden [Fehler] Dynamic_WASAPI.pas(116): ';' erwartet, aber 'IMPLEMENTATION' gefunden [Fataler Fehler] Project1.dpr(6): Verwendete Unit 'Dynamic_WASAPI.pas' kann nicht compiliert werden |
aber z.B. der Fehler
[Fehler] Dynamic_WASAPI.pas(75): Unbekannte Anweisung: 'length'
wundert mich sehr... wurde vergessen bestimme units einzubinden?
jaenicke - Sa 16.06.12 21:59
Nimm einfach das & in Zeile 56 weg, der Rest sind Folgefehler, wahrscheinlich geht es dann schon. Aber wozu brauchst du die Windows Audio Session API? Eigentlich sollte doch Dynamic_BASS erst einmal reichen.
IhopeonlyReader - Sa 16.06.12 22:32
wie aufrufen und so? *hilfe nötig^^
da der Nutzer es wie ein TMediaplayer nutzen sollte (also es sollte einstellbar, play und stop/break) sollte ja eine sichtbare komponente vorhanden sein oder? oder muss ich das mit buttons erreichen?
Gausi - Sa 16.06.12 22:37
Ja. Die bass.dll ist keine (visuelle) Komponente, sondern "nur" eine externe Bibliothek, die du mitliefern musst.
Die GUI dazu muss man selber schreiben, wenn man eine benötigt.
IhopeonlyReader - Mo 18.06.12 13:31
Gausi hat folgendes geschrieben : |
Die GUI dazu muss man selber schreiben, wenn man eine benötigt. |
Mhh... ehrlich gesagt habe ich davon ca 0 Ahnung...
Ich würde gerne einen Stream abspielen, wie ist das denn damit möglich?
Wenn das wirklich nur eine Datenbank ist, dann würde ich gerne wissen WOZU das eine Datenbank ist, wenn man den GUI doch selbstschreiben muss
Gausi - Mo 18.06.12 13:48
Das ist keine Datenbank, sondern eine Bibliothek, das ist wohl doch etwas anderes.
Wo ist denn das Problem, ein paar Buttons auf die Form zu klatschen und im OnClick die entsprechenden Routinen der bass.dll aufzurufen? Klar wäre es für dich schöner, wenn bei der bass.dll direkt dein fertiges Programm dabei wäre, aber in vielen Fällen wird ja (fast) gar keine GUI für das Abspielen benötigt (z.B. bei Hintergrundmusik oder Effekten bei Spielen).
Wie das Abspielen eines RessourceStreams damit genau geht, weiß ich auch nicht. Ich sehe aber auch nicht ganz den Sinn dahinter, alles in die exe zu packen. Zumal du mit der bass.dll jetzt ja sowieso mindestens eine weitere Datei mitliefern musst. ;-)
Nebenbei: Wenn das wirklich nur ein Haus ist, dann würde ich gerne wissen WOZU das ein Haus ist, wenn man sich den Bodenbelag und die Tapete selbst aussuchen muss. :zwinker:
IhopeonlyReader - Mo 18.06.12 16:45
ok danke :)
ich wollte einfach vermeiden, dass wenn man meine EXE rumgibt, dass man dann alle datein erst komprimieren muss etc... so ist es nur eien einfache EXE (trotzt musik dateien.. weniger als 1MB groß)
ich verstehe nun was du meinst :D und wenn ich die bibliothek mitliefern muss, dann benutz ich doch lieber den alten Tmediaplayer (mit dem ich zufrieden bin) und lade die Datei im App-Data ordner und lass sie dann abspielen, und damit ich den PC nicht zumüll lösche ich die Datei beim schließen (und spielstandlöschenbutton) wieder :)
Aber eins ist dennnoch blöd bei dem TMediaplayer: Wenn ich die Dauerschleife bei mir drin habe, dann wird die datei nach ende wieder abgespielt ( mediaplayer.play) dabei lagt es ca 0,2 sek.. ist das verhinderbar?
Also jedesmal wenn ich auf play klicke lagt es :( woran leigt das (an der schleife liegt es nicht, da es auch lagt wenn ich manuell auf den playbutton drücke)
jaenicke - Mo 18.06.12 17:22
Solche kleinen Probleme wirst du nicht verhindern können, wenn du bei TMediaPlayer bleiben willst. :nixweiss:
Es ist nun einmal Standard, dass eine Anwendung nicht nur aus einer Exe besteht. Wenn das bei dir anders sein soll, dann musst du eben auch entsprechende Einschränkungen in Kauf nehmen...
Gausi - Mo 18.06.12 17:26
Wobei ich 0.2 sec schon für arg viel bei kurzen Files halte, selbst für den TMediaPlayer. :gruebel:
Sicher, dass das "laggen" nicht daran liegt, dass die Datei am Anfang oder Ende etwas Stille hat? Oder hakt das Programm wirklich komplett?
IhopeonlyReader - Mo 18.06.12 18:08
Da ich mit einem timer meine Spielfiguren zeichne... und diese dann für kurze zeit Stehen bleiben lagt das ganze programm :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!