Potřeboval bych trošku poradit, myslím, že půjde jen o nějakou kravinu, ale přece jen na to nemůžu přijít... :ehh:
Takže načítám hudbu mp3 s pomocí SDL_Mixer funkce Mix_LoadMUS( const char *file ), jenomže pro výběr mp3 používám API funkci GetFileNameOpen, takže cestu k souboru mp3 dostanu jako řetězec, např. C:blablabla.mp3 , proženu to smyčkou, dostanu C:/bla/bla/bla.mp3 a pošlu to funkci Mix_LoadMUS(...); ... bohužel tohle vyhodí chybu: Couldn't read from ... :error:
Ale když cestu napíšu ručně do zdrojáku:
Mix_LoadMUS("C:/bla/bla/bla.mp3");
tak to jede bez problému... :?
Poradíte někdo? :frosty_x:
Fórum › C / C++
Problém s Mix_LoadMUS( const char *file )
![](img/forum_vlakno_help_vyreseno.png)
Tigr94 napsal:
Pot?eboval bych tro?ku poradit, mysl?m, ?e p?jde jen o n?jakou kravinu, ale p?ece jen na to nem??u p?ij?t... :ehh:
Tak?e na??t?m hudbu mp3 s pomoc? SDL_Mixer funkce Mix_LoadMUS( const char *file ), jenom?e pro v?b?r mp3 pou??v?m API funkci GetFileNameOpen, tak?e cestu k souboru mp3 dostanu jako ?et?zec, nap?. C:blablabla.mp3 , pro?enu to smy?kou, dostanu C:/bla/bla/bla.mp3 a po?lu to funkci Mix_LoadMUS(...); ... bohu?el tohle vyhod? chybu: Couldn't read from ... :error:
Ale kdy? cestu nap??u ru?n? do zdroj?ku:
Mix_LoadMUS("C:/bla/bla/bla.mp3");
tak to jede bez probl?mu... :?
Porad?te n?kdo? :frosty_x:
Na jakem OS to bezi? Na windowsech asi ne, ze? Protoze ve WinAPI zadna takova funkce, jako je GetFileNameOpen, neexistuje(tedy alespon podle MSDN). Asi vas to uz napadlo, ale zkousel jste ty retezce porovnat, resp. vypsat? A to po volani GetFileNameOpen a po smycce.
Je to ve WinXP...
Jinak tu cestu si vypisuji i po GetOpenFileName i po smyčce a je naprosto správně... neleze mi to do hlavy proč to nejde :O
Tady je zdroják:
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL_image.h>
#include <windows.h>
int main(int argc, char *argv[])
{
Mix_Music *music = NULL;
FILE *soubor;
SDL_Surface *screen;
SDL_Surface *obr;
SDL_Rect obdel;
bool nacti=false;
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for filename
HWND hwnd; // owner window
HANDLE hf; // file handle
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
//
// Set lpstrFile[0] to '?' so that GetOpenFileName does not
// use the contents of szFile to initialize itself.
//
ofn.lpstrFile[0] = '?';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "*.mp3?";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrTitle = "Otevřít";
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if( SDL_Init( SDL_INIT_AUDIO|SDL_INIT_VIDEO ) < 0)
{
printf("Unable to init SDL: %sn", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
if( Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 2048) < 0)
{
printf("Warning: Couldn't set 44100 Hz 16-bit audionReason: %sn", SDL_GetError());
}
screen = SDL_SetVideoMode(470,584,32,SDL_SWSURFACE);
if ( screen == NULL )
{
printf("Unable to set 470x584 video: %sn", SDL_GetError());
exit(1);
}
obr = IMG_Load("obrazek.jpeg");
obdel.x = 0;
obdel.y = 0;
SDL_BlitSurface(obr, NULL, screen, &obdel);
SDL_Flip(screen);
int done=0;
while( done == 0 )
{
SDL_Event event;
while( SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT)
{
done = 1;
}
if( event.type == SDL_KEYDOWN)
{
if( event.key.keysym.sym == SDLK_ESCAPE)
{
done = 1;
}
if( event.key.keysym.sym == SDLK_RETURN)
{
if ( GetOpenFileName(&ofn) == TRUE )
{
hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
MessageBox(NULL, TEXT(szFile), TEXT("Pr?v? hraje:"), MB_OK );
nacti = true;
}
}
}
}
if( nacti )
{
for ( int x = 0; x <= strlen(szFile); x++ )
{
if ( szFile[x] == char(92) )
{
szFile[x] = char(47);
}
}
MessageBox(NULL, TEXT(szFile), TEXT("Pr?v? hraje:"), MB_OK );
if ( Mix_PlayingMusic() )
Mix_FreeMusic(music);
music = Mix_LoadMUS(szFile); // a tady je problem...
if ( music == NULL )
{
MessageBox(NULL, TEXT(Mix_GetError()), TEXT("Sorry, vole, error:"), MB_OK );
}
nacti = false;
ofn.lpstrFile[0] = '?';
}
if( !Mix_PlayingMusic())
{
Mix_PlayMusic(music, 0);
}
}
Mix_FadeOutMusic(1000);
SDL_Delay(1000);
Mix_FreeMusic(music);
return 0;
}
Tigr94 napsal:
Je to ve WinXP...
Jinak tu cestu si vypisuji i po GetOpenFileName i po smyčce a je naprosto správná... neleze mi to do hlavy proč to nejde :O
Jake pouzivate prostredi? Pokud je to MSVC 2005, neni tam nahodou nastaven preklad pod UNICODE? Jinak me jeste zarazi ty lomitka. Vzdyt prece na Winech se bezne pouzivaji obracena lomitka, tedy ''.
Používám Dev-C++...
U těch lomítek je jedno jestli je tam '' nebo '/', dev-c si to pžebere...
Lomitka vysvetlim...
Cestu dostanu ve tvaru C:blablabla.mp3, ale takto řetězec obsahuje speciální znaky, tady b... proto se musí předělat na:
C:blablabla.mp3 anebo C:/bla/bla/bla.mp3 ... no a změnit na / je snažší ne?
Jinak, jak to myslíte s tou mezí pole?
Tigr94 napsal:
Lomitka vysvetlim...
Cestu dostanu ve tvaru C:blablabla.mp3, ale takto řetězec obsahuje speciální znaky, tady b... proto se musí předělat na:
C:blablabla.mp3 anebo C:/bla/bla/bla.mp3 ... no a změnit na / je snažší než na .
Jinak, jak to myslíte s tou mezí pole?
Meze:
for (int x = 0; x <= strlen(szFile); x++) // ma byt jen x < strlen(szFile)
{
//...
}
Jinak mam takovy pocit, ze se lomitka zdvojuji je pro preklad(kompilator), to co je v pameti, vam muze byt fuk.?
Maly priklad pro demonstraci, vytvoril jsem na disku C: slozku bla a v ni podadresar bla a do nej ulozil exe s nazvem bla:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("%sn", argv[0]);
system("PAUSE");
return 0;
}
/*------------------*/
vystup:
C:blablabla.exe
Pokračujte stisknutím libovolné klávesy...
Už to mám, díky za pomoc...
Problém byl tady:
if ( GetOpenFileName(&ofn) == TRUE )
{
hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
MessageBox(NULL, TEXT(szFile), TEXT("Právě hraje:"), MB_OK );
nacti = true;
}
Parametr GENERIC READ stačilo změnit na 0... měl jsem pravdu, byla to opravdu jen kravina... každopádně už to mám, zbytečně jsem tady s tím otravoval... :))
Ale kdyby s tím měl někdo podobný problém, je to tady...
hf = CreateFile(ofn.lpstrFile, 0, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
Díky moc... :super:
![](img/forum_nove_psp_new.png)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/32.gif)
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Const char v C — založil Halancik
Definice const char *[] — založil Remder
Static const char array[] .. — založil kruciik
(C++) Převod const unsigned char * na string — založil richard.zavodny
Převedení system::string na const char — založil majklendek
Moderátoři diskuze