|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Build0815
Anmeldungsdatum: 30.09.2006 Beiträge: 51
|
Verfasst am: 29.07.2007, 13:58 Titel: load sample from memory - mit fmod |
|
|
Hi, ich versuche gerade ein mp3 file das ich vorher per allocate in den Speicher geladen habe per Fmod mit der function "fsound_sample_load" in fmod zu laden, um es dann mit "fsound_playsound" wieder abzuspielen.
Das sieht bis jetzt so aus (funktioniert allerdings nicht richtig - gibt keinen ton von sich...) :
Code: |
option explicit
#include once "fmod.bi"
Dim i As ULongInt
Dim f As Integer
Dim As UByte Ptr memory
Dim As Integer Ptr buffer
f = Freefile
Open "C:\test.mp3" For Binary Access Read As #f
Dim value As ULongInt = Lof(f)
memory = allocate(value * Len(UByte))
For i = 0 To value - 1
Get #f, , memory[i]
Next
Close #f
FSOUND_Init(44100, 32, 0)
buffer = FSOUND_Sample_Load(FSOUND_FREE, memory, FSOUND_LOADMEMORY, 0, 0)
FSOUND_PlaySound(FSOUND_FREE, buffer)
sleep
FSOUND_Close
End
|
Wenn sich jetzt vl. wer fragt warum ich das so kompliziert machen will, und warum ich das mp3 file nicht gleich von der HD mit Fmod lade, dann sei gesagt, dass ich eigentlich vor hab die mp3 datei aus einer einzigen Datei in der mehrere andere Dateien enthalten sind (also eine Art file-Archiv) direkt heraus in den Speicher zuladen und abzuspielen, .. natürlich wäre es auch möglich das mp3-Stück aus dem "file-archiv" rauszuladen, dann das Stück auf die Festplatte zu kopieren, abzuspielen und wieder zu löschen, allerdings soll das "file-archiv" den Sinn haben, dass keine Datei aus dem "Archiv" extra mit der Festplatte in berührung kommt (in dem Code oben wird der einfachheithalber allerdings eine einfache mp3 erstmal direkt alloziert).
Wenn mir jemand helfen, und zeigen könnte wie ich so eine mit FB allozierte mp3 direkt in Fmod abspielen kann wäre ich sehr dankbar.
mfg 0815
PS: Es ist auch gut möglich, dass der obige Code totaler Quatsch ist, da ich schon länger nicht mehr mit FB programmiert hab und sonst mit Zeigern auch nicht soviel zu tun hatte. (Ein dezenter Hinweis darauf, wäre dann bitte angebracht. )
PPS: Wenn ich was brauchbares dazu in google gefunden hätte, hätte ich das hier nicht geschrieben
Zuletzt bearbeitet von Build0815 am 30.07.2007, 17:02, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.07.2007, 15:39 Titel: |
|
|
interessanter Ansatz auf dessen loesung ich gespannt bin....
zunaechst aber...
FSOUND_Sample_Load gibt eine Long bzw Integer zurueck..
also buffer ist eine Integer keine integer ptr
was man oeffnet muss man auch wieder schliessen,
close #f
ansonsten konnte ich dem ganzen in der Form aber leider auch noch keinen Ton entlocken...
Edit:
option explicit ??
vielleicht mal den neuen Compiler 0.17 oder die 0.18 laden _________________
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 29.07.2007, 16:19 Titel: |
|
|
ich vermute die Laderoutine als Ursache??
Code: | ..
Get #f, i+1, memory[i] '<--- i+1
.. |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.07.2007, 16:33 Titel: |
|
|
Ich habs zum versuch mal so gemacht...
Code: |
#include once "fmod_x.bi"
Dim i As ULongInt
Dim f As Integer
Dim As UByte Ptr memory
Dim As Integer buffer
f = Freefile
Open "lithium.mp3" For Binary Access Read As #f
Dim value As ULongInt = Lof(f)
memory = allocate(value * Len(UByte))
For i = 0 To value - 1
Get #f,i+1,memory[i]
Next
Close #1
FSOUND_Init(44100, 32, 0)
buffer=FSOUND_Sample_Load(@memory,"test",FSOUND_NORMAL, 0, 0)
FSOUND_PlaySound(FSOUND_FREE, buffer)
sleep
FSOUND_Close
End
|
keine grossartige veraenderungen...
mein Problem faengt aber eigentlich schon damit an;
FSound_Sample (Index as Integer???,Name as String???,mode,offset,length)
Ich nehme mal an das Name nicht nur einer besseren Uebersicht dient
index hatte ich vermutet ist die adresse des Pointers....
leider habe ich mit FMod noch nicht viel mehr gemacht als einen Stream abgespielt... _________________
|
|
Nach oben |
|
|
Build0815
Anmeldungsdatum: 30.09.2006 Beiträge: 51
|
Verfasst am: 29.07.2007, 16:39 Titel: |
|
|
@Eternal_Pain: Die Funktion lautet folgendermaßen:
Zitat: |
FSOUND_Sample_Load
Loads and decodes a static soundfile into memory.
This includes such files as .WAV, .MP2, .MP3, .OGG, .RAW and others.
FSOUND_SAMPLE * F_API FSOUND_Sample_Load(
int index,
const char *name_or_data,
unsigned int inputmode,
int offset,
int length
);
Parameters
index Sample pool index. See remarks for more on the sample pool.
0 or above - The absolute index into the sample pool. The pool will grow as the index gets larger. If a slot is already used it will be replaced.
FSOUND_FREE - Let FSOUND select an arbitrary sample slot.
FSOUND_UNMANAGED - Dont have this sample managed within fsounds sample management system
name_or_data Name of sound file or pointer to memory image to load.
mode Description of the data format, OR in the bits defined in FSOUND_MODES to describe the data being loaded.
offset Optional. 0 by default. If > 0, this value is used to specify an offset in a file, so fmod will seek before opening. length must also be specified if this value is used.
length Optional. 0 by default. If > 0, this value is used to specify the length of a memory block when using FSOUND_LOADMEMORY, or it is the length of a file or file segment if the offset parameter is used. On PlayStation 2 this must be 16 byte aligned for memory loading.
|
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 29.07.2007, 17:24 Titel: |
|
|
evtl hilft euch das weiter:
http://www.askos.de/tutorial/kap314.htm#kap5 _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Build0815
Anmeldungsdatum: 30.09.2006 Beiträge: 51
|
Verfasst am: 30.07.2007, 16:58 Titel: |
|
|
Jetzt hab ichs doch geschafft ein mp3 file direkt aus dem Speicher abzuspielen, der Fahler war vorhin nur der, dass man im letzten Argument der Ladefunktion die Länge des allozierten Speicherbereichs angeben muss, in diesem Fall im Code die Variable "i".
(Also die Zeile << buffer = FSOUND_Sample_Load(FSOUND_FREE, memory, FSOUND_LOADMEMORY, 0, i)" >>)
Bei mir funktioniert der folgende Code (FB0.17):
Code: |
#include once "fmod.bi"
Dim i As ULongInt
Dim f As Integer
Dim As UByte Ptr memory
Dim As Integer Ptr buffer
f = Freefile
Open "C:\test.mp3" For Binary Access Read As #f
Dim value As ULongInt = Lof(f)
memory = allocate(value * Len(UByte))
For i = 0 To value - 1
Get #f, , memory[i]
Next
Close #f
Print(Str(memory))
Sleep
FSOUND_Init(44100, 32, 0)
buffer = FSOUND_Sample_Load(FSOUND_FREE, memory, FSOUND_LOADMEMORY, 0, i)
FSOUND_PlaySound(FSOUND_FREE, buffer)
sleep
FSOUND_Close
End
|
|
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 30.07.2007, 17:15 Titel: |
|
|
funktioniert super
auch wenn ich glaubte das gestern auch schon versucht zu haben... _________________
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|