MIDI in TMediaPlayer?
-
Hallo,
ich schreibe gerade einen kleinen Medienspieler und bin dabei auf ein kleines Problem gestoßen.Die Komponente TMediaPLayer kann ja bekanntlich MIDIfiles problemlos wiedergeben, bei mir hakt's da aber irgendwie. Folgendes Problem:
AnsiString GL_PROJECT_PATH = "C:\\Dokumente und Einstellungen\\User\\Desktop\\projects\\mm\\files"; music_player->FileName = GL_PROJECT_PATH+"\\test.mid"; music_player->Open(); // Die Datei wurde unter dem Angegebenen Namen nicht gefunden, überprüfen Sie, ob Dateiname od...bzw.
AnsiString GL_PROJECT_PATH = "C:\\Dokumente und Einstellungen\\User\\Desktop\\projects\\mm\\files"; music_player->FileName = GL_PROJECT_PATH+"\\test.midi"; music_player->Open(); // Es konnte kein Dateityp aus der angegebenen Dateiendung ermittelt werden...Ich hab's auch schon mit dem TOpenDialog versucht -> gleiches Problem!
Alle anderen Dateien (mp3, wave, avi) "findet" und öffnet er und gibt sie auch problemlos wieder. Wo ist hier also dass Problem? Der Dateipfad ist richtig, ich habe ihn über fünf Mal überprüft (unter anderem mit Copy and Paste!)!Ich habe keine Ahnung, warum es nicht klappt, hat vielleich irgendjemand eine Idee?
-
Hallo
hast du das midi schonmal in ein anderes Verzeichnis (zB S:\temp) kopiert
und es dann da versucht (das "" Problem)MfG
Klaus
-
Naja, das ganze ist in der Praxis noch etwas anders, als ich es beschrieben habe.
GL_PROJECT_PATH ist ein AnsiString, der aus der Registry ausgelesen wird. Das ganze ist dann recht statisch, die Datei wird einfach aus einem Unterverzeichnis des GL_PROJECT_PATH ausgelesen, ist also in dem Sinne dynamisch, hat aber den Nachteil, dass ich nicht einfach ein anderes Verzeichnis nehmen kann... (es ist halt wirklich immer der Unterordner "musics" des GL_PROJECT_PATH)Ich habe mal einfach das ganze BCB-Project verschoben, wodurch sich ja auch der Pfad zum MIDIFile ändert -> keine Änderung, gleicher Fehler...
Dann habe ich einfach mal den Pfad statisch angegeben -> keine Änderung, gleicher Fehler!
DANN habe ich die Datei nach C:\ kopiert und in test.mid umbenannt -> Es funktioniert wunderbar!
Ich versteh's aber trotzdem nicht. Die Datei existiert definitiv unter dem angegebenen Pfad, und zwar 100%ig äquivalent zum reelen Pfad... und unter C:\ bringt mir die Datei auch nichts, da dass Programm sie im Unterordner von GL_PROJECT_PATH braucht...
Ich habe keine Ahnung, woran es noch liegen könnte...
-
Hallo
setz mal am Anfang ein " sowie am Ende ein " (mittels \")
dann sollte es funktionierenMfG
Klaus
-
Reyx schrieb:
Die Datei existiert definitiv unter dem angegebenen Pfad
Hast du das mal zur Laufzeit mit FileExists() getestet?
Hast du dir deinen zusammengbastelten Pfad mal ausgeben lassen oder im Debugger angesehen? Scheinbar ist da irgendwo der Wurm drin.
-
KlausB schrieb:
Hallo
setz mal am Anfang ein " sowie am Ende ein " (mittels \")
dann sollte es funktionierenMfG
Klausdito
und zwar liegt das bestimmt an den Leerzeichen in folgendem Ordnernamen:
C:\Dokumente und Einstellungen
der wird als mehrere Parameter erkannt, bzw. nach dem ersten Leerzeichen abgebrochen.
-
Hallo,
Daran hatte ich auch gedacht, Jansen, aber ich habe mir den "zusammengebastelten" Pfad u.A. als ShowMessage, als TLabel->Caption sowie Als TEdit->Text ausgeben lassen, er ist definitiv korrekt.Wie gesagt, GL_PROJECT_NAME wird aus der Registry gelesen, da gibt es nicht viel, was verkehrt laufen kann (der Schlüssel hat den Wert "C:\Dokumente und Einstellungen\User\Desktop\Projects\CodeName Etriminal\Programm\projects\default"), da wird dann noch der Name des Unterordners rangehängt:
GL_PROJECT_PATH+"\\"+music_path->Text, welcher aus einem TEdit ausgelesen wird, sowie der Dateiname selbst, welcher über GetNextFile() ermittelt wird!
Laut FileExists() gibt es die Datei... Aber ich verstehe nicht, warum er alle anderen Dateitypen (es scheint ausschließlich bei MIDIFiles das Problem zu geben) problemlos wiedergibt... zumal die WinApi ja den Dateinamen per FindFirstFile() und FindNextFile() selbst ausgibt...
Mit dem Debugge habe ich leider noch nicht gearbeitet, ich schau's mir mal an.
Und, KlausB, was meinst du mit '\"'? In den Schüssel der Registry? Dann erkennt er gar keine Dateien mehr (bzw. er liest sie gar nicht erst aus, dass liegt dann nicht am TMediaPlayer).
An dem Midis kann es aber auch nicht liegen, ich habe alle möglichen durchprobiert, die können schließlich nicht alle defekt sein...
Insgesamt sieht das ganze folgendermaßen aus (so steht es jetzt wirklich im Quellcode, ist nur aus mehreren Funktionen zusammengefasst):
AnsiString GL_PROJECT_PATH; //Pfad zum aktiven Projekt void __fastcall Tresourcesform::FormShow(TObject *Sender) { //Initialisierung bei Programmstart TRegistry *registry = new TRegistry; registry->RootKey = HKEY_LOCAL_MACHINE; registry->OpenKey("Software\\Private\\Etriminal", false); //Den Pfad zum aktuallen Projekt einlesen... GL_PROJECT_PATH = registry->ReadString("current_project_path"); delete registry //Wenn das Formular aufgerufen wird, werden alle verfügbaren Resourcen ausgelesen! //Liest alle verfügbaren Grafiken ein. HANDLE directory_handle; WIN32_FIND_DATA wfd; if(resource_type == "graphics") { //Liest alle verfügbaren Grafiken aus... directory_handle = FindFirstFile(AnsiString(mainform->GL_PROJECT_PATH+music_path->Text+"\\*").c_str(), &wfd); FindNextFile(directory_handle, &wfd); while(FindNextFile(directory_handle, &wfd)) { //Wenn es es sich um eine Datei (NICHT um ein Verzeichnis!!) handelt if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { } else { available_music->Items->Add(wfd.cFileName); //TListBox available_music } } FindClose(directory_handle); } void __fastcall Tresourcesform::available_musicClick(TObject *Sender) { //Lädt, falls eine neúe Musikdatei gewählt wird, diese in den Multimedia-Spieler! //Bricht die Aktion ab, wenn kein neues Musikstück gewählt wurde! if(available_music->ItemIndex < 0) return; //Lädt die Datei in dem Multimedia-Spieler multimedia_player->FileName = mainform->GL_PROJECT_PATH+music_path->Text+"\\"+available_music->Items->Strings[available_music->ItemIndex]; }Ich hoffe mal, ich habe mich beim Übertragen nicht vertippt...
Edit: Sorry, geht ein bisschen über den Rand, ich hoffe das macht bei den zwei Zeilen nichts...
-
Reyx schrieb:
Und, KlausB, was meinst du mit '\"'?
Du sollst den "zusammengebastelten" String in Anführungszeichen einschliessen, um eventuelle Probleme mit den Leerzeichen im Dateipfad zu vermeiden. Also z.B.
music_player->FileName = "\"" + music_player->FileName + "\""; // oder music_player->FileName = QuotedStr(music_player->FileName);Allerdings bezweifle ich, dass das im aktuellen Fall die Ursache ist, zumindest hier hat TMediaPlayer keine Probleme mit besagten Leerzeichen.
Hast du auch tatsächlich den endgültigen, kompletten Pfad kontrolliert, also music_player->FileName? Was sagt FileExists()?
-
Hallo,
Ich hab den Code jetzt mal so umgeändert://Lädt die Datei in dem Multimedia-Spieler multimedia_player->FileName = mainform->GL_PROJECT_PATH+music_path->Text+"\\"+ available_music->Items->Strings[available_music->ItemIndex]; ShowMessage(multimedia_player->FileName); if(FileExists(multimedia_player->FileName)) ShowMessage("FileExists() -> Positiv");Unter dem Pfad, der in der ShowMessage() ausgegeben wird, finden zumindest Explorer und Winamp die Datei problemlos, und die Meldung "FileExists() -> Positiv" wird auch ausgegeben!
Edit: Und, wie du ja schon vermutet hast, an den Anführungszeichen liegt's auch nicht...
-
Deinem grösseren Code-Schnipsel zufolge rufst du multimedia_player->Open() ja erst in einer anderen Funktion auf, ist es möglich, dass multimedia_player->FileName da noch (unbeabsichtigt) geändert wird?
Bau mal eine Sicherung ein ala
if (FileExists(multimedia_player->FileName)) multimedia_player->Open(); else Fehlermeldung();Ansonsten bin ich mit meinem Latein so ziemlich am Ende.
-
Stimmt, dass hab' ich vergessen, sorry.
Das Prinzip ist einfach so, dass bei einem normalen Klick der Name eingelesen wird, aber erst bei einem Doppelklick die Datei geöffnet wird. Da es aber nirgendwo sonst eine Funktion o.Ä. gibt, welche den angegeben Dateinamen noch ändert (außer natürlich einem eventuell zweiten 'normalen' Klick) ... habe ich letztlich keine Ahnung, woran es noch liegen könnte... zumal ja alle Dateien bis auf die MidiFiles wunderbar erkannt werden.Eine Sicherung bringt auch nichts, gleiches Problem. Ich glaube, ich mache es einfach noch einmal ganz von Vorne, vielleicht fällt mir dabei ja irgendeine Kleinigkeit auf, die mir bisher entgangen ist
... naja, zumindest Danke für die Hilfe 
P.s. ich bin mir nicht ganz sicher, aber löst OnDblClick nicht OnClick mit aus? Aber selbst wenn, der Dateiname müsste dann ja eigentlich trotzdem gleich bleiben... oder?