vector als playlist (Problem)
-
ja aber mal ernst!!
Wo ist der fehler?
-
evirus schrieb:
Das Problem ist aber wenn während Playlist abgearbeitet wird (also player läuft) fügt er mir nich am ende das neue file ein sonder direkt nachdem abgespielten titel. Was ja falsch ist weil es heisst ja push_back <--

das "
" merkt man, ja.
am wahrscheinlichsten ist, dass der gerade abgespielte titel der letzte in deiner playlist ist.das ist nur eine vermutung basierend auf der unmenge an fakten, die du bietest *hint*.
-
hundvergrabe-freak schrieb:
Wo liegt der Hund begraben?

Im Wald.
Lebende oder Tote Hunde?
-
deque?
-
Da würde ich jetzt gerne etwas mehr Code sehen, denn was du da machst, ist so ziemlich die fehleranfälligste Methode... Kompiliert das überhaupt? Soweit ich weiß, verwendet vector<> nämlich den Zuweisungsoperator deines Datentyps und eine Zuweisung ist für const char* doch überhaupt nicht definiert

Grüße
Martin
-
Die Zuweisung ist schon definiert. Die Frage ist, woher die Daten der Zeichenkette 'newSample' kommen?
evirus: Zeig wirklich mal etwas mehr Code...
Aber ansonsten verwende std::vectorstd::string.
-
ich würde std::vector nehmen http://www.linuxsoftware.co.nz/containerchoice.png
und nimm anstatt (const) char* lieber std::stringbyebye :>
-
So so. Lebende Hunde.

Also
Die Playlist kommt von Flex Anwendung als String an und wird nach
einer trennzeichen zerlegt ",":Bsp.
#A,glocke.wav,ansage1.wav,ansage2.wavhier ist fmod class wo ich probleme habe wenn player läuft und die Playlist vergrössert wird. weil es soll ja wenn noch mehr abgespielt werden soll direkt dran gehägt werden. was leider nicht der fall ist.
/* ========================================================================================== */ /* Next Sample /* ========================================================================================== */ int Sample::NextId(int& indexp) { indexp++; } /* ========================================================================================== */ /* OnSoundComplete /* ========================================================================================== */ signed char F_CALLBACKAPI Sample::OnSoundComplete(FSOUND_STREAM *stream, void *buff, int len, int dwuser) { // end of stream callback doesnt have a 'buff' value, if it doesnt it could be a synch point. if (buff) { printf("\nSYNCHPOINT : \"%s\"\n", buff); } else { printf(" - done!!"); ((Sample*)dwuser)->PlayTemplate(); } return true; } /* ========================================================================================== */ /* Initalize LsaChannel /* ========================================================================================== */ bool Sample::Init(const char* channel, int LsaSamplerate, int LsaChannels, int LsaType, int LsaDriver, char* FMOD_DLL) { channelDevice = channel; index = 0; PlayerStatus = 0; fmod = FMOD_CreateInstance(FMOD_DLL); fmod->FSOUND_Stream_SetBufferSize(200); fmod->FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND); fmod->FSOUND_SetDriver(LsaDriver); fmod->FSOUND_SetMixer(FSOUND_MIXER_QUALITY_FPU); if(!fmod->FSOUND_Init(LsaSamplerate, LsaChannels, LsaType)) { printf("LSASound ERROR: %s", fmod->FSOUND_GetError()); return false; } else { printf("LSASound Initalized: %s", channel); printf("\nDEVICE OUTPUT: %s",fmod->FSOUND_GetDriverName(LsaDriver)); } return true; }; /* ========================================================================================== */ /* Play one sample /* ========================================================================================== */ bool Sample::PlaySample() { PlayerStatus = 1; cVar = fmod->FSOUND_Stream_Open(LsaP[index], 0, 0, 0); printf("\n [%s] - Playing id:%d - %s", channelDevice, index, LsaP[index]); if (!cVar) { printf("\nERROR: Couldn't open stream: %s", LsaP[index]); } fmod->FSOUND_Stream_SetEndCallback(cVar, Sample::OnSoundComplete, (DWORD_PTR)this); fmod->FSOUND_Stream_Play(0, cVar); return true; }; /* ========================================================================================== */ /* Play Template from flex */ /* ========================================================================================== */ bool Sample::PlayTemplate() { //printf("\n>>>>>>>>>>>>>>>>>>>>>>> status: %d <<<<<<<<<<<<<<<<<<<<<<<<<<<", PlayerStatus); //-- playlist if (index < LsaP.size()) { PlaySample(); NextId(index); } else { index = 0; LsaP.clear(); printf("\nStop LsaP.size(): %d", LsaP.size()); PlayerStatus = 0; } return true; } /* ========================================================================================== */ /* Shutdown Channel */ /* ========================================================================================== */ void Sample::Close() { fmod->FSOUND_Stream_Close(cVar); fmod->FSOUND_Close(); FMOD_FreeInstance(fmod); }; /* ========================================================================================== */ /* Add next playlist to playist /* ========================================================================================== */ void Sample::AddToPlaylist(char* flexlist) { if(flex.size()>0) { flex.clear(); } int mx = Explode(flexlist, ",", flex, true); //-- int start on 1 - 0 is controll no play data for(int i = 1; i < mx; i++) { const char* newSample = const_cast<char*>(flex[i].c_str()); //LsaP.insert(LsaP.begin(), const_cast<char*>(flex[i].c_str())); LsaP.push_back( newSample ); //RealPlayList[i] = [NULL, const_cast<char*>(flex[i].c_str()]; } } /* ========================================================================================== */ /* Player Status */ /* ========================================================================================== */ int Sample::isPlaying() { return PlayerStatus; }; /* ========================================================================================== */ /* UTILS */ /* ========================================================================================== */ void Sample::GetDevices() { for (int count=0; count < fmod->FSOUND_GetNumDrivers(); count++) { printf("\nDEVICE: %s",fmod->FSOUND_GetDriverName(count)); } }mit AddToPlaylist(char* flexlist) wird playlist immer wieder bestückt.
PS: vector weil ich dynamische liste brauche weiss ja nicht wie gross später die liste sein wird daher kann ich ja die grösse net vordefineren und brauche was dynamisches.
Danke! :p
-
Könnte es daran liegen, dass Du die Playlist in AddToPlaylist am Anfang löscht?
BTW: Warum castest Du von einem const char* das const weg, um es anschließend wieder einem const char* zuzuweisen?
-
Wie schon gesagt, verwende std::vectorstd::string.
Mit "const char *" speicherst du nur einen Zeiger auf einen unbekannten Speicherbereich (da von FLEX verwaltet).
-
Ich lösche nur flex string um sicher zu gehen das es leer ist bevor wieder gesplitet wird. Playlist lösche ich nur wenn wiedergabe beendet ist.
ok und es richtig zu machen werde ich jetzt
std::vectorstd::string benutzen was aber das Problem noch nicht beheben wird.
Aber hast ja schon recht.aber fmod will
DLL_API FSOUND_STREAM * F_API FSOUND_Stream_Open(const char *name_or_data, unsigned int mode, int offset, int length);
const char* ja haben
-
std::string::c_str() ist die Lösung.
-
Also wenn ich statisch die liste von flex erstelle ohne das ich die nachricht splite.
Also so:

const char* flexlist[] = {"assets/audio/gong_1.wav","assets/audio/gong_2.wav"}; for(int i = 0; i < 2; i++) { const char* newSample = flexlist[i]; LsaP.push_back( newSample ); }Dann funktioniert es. Und die Playlist stimmt auch.
Jetzt ist sicher die frage wieso aber dann nicht funktioniert wenn ich die
flexlist dynamisch bekomme und splite. dann kommt er damit nicht klar wenn abgespielt wird. ausser wenn ich warte bis playlist fertig ist dann hängt er das richtig an Playlist dran.


-
SUPER!!!! Es funktioniert!!!!

vector<string> LsaP;
jetzt ist Playlist als string definiert und schon klappts.
VIELEN DANK AN ALLE!!
Ich muß echt sagen das mit (c++ forum) eine super hilfe vorhanden ist.
Die ich nicht mehr missen möchte.
DANKE SCHÖN!!!!
