Problém s Mix_LoadMUS( const char *file ) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Problém s Mix_LoadMUS( const char *file ) – C / C++ – Fórum – Programujte.comProblém s Mix_LoadMUS( const char *file ) – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
28. 9. 2006   #1
-
0
-

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:

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
Jura_0
Stálý člen
28. 9. 2006   #2
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
28. 9. 2006   #3
-
0
-

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

Nahlásit jako SPAM
IP: ...–
28. 9. 2006   #4
-
0
-

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;
}

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
28. 9. 2006   #5
-
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 ''.

Nahlásit jako SPAM
IP: ...–
28. 9. 2006   #6
-
0
-

Používám Dev-C++...
U těch lomítek je jedno jestli je tam '' nebo '/', dev-c si to pžebere...

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
29. 9. 2006   #7
-
0
-

Jednak mne porad neni jasne, proc v ceste k souboru predelavate lomitka, kdyz jsou obe adresy shodne a druhak se mi nelibi ta smycka. Sice v tomto problem asi nebude, ale zasahujete za meze pole.

Nahlásit jako SPAM
IP: ...–
29. 9. 2006   #8
-
0
-

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?

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
29. 9. 2006   #9
-
0
-

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...

Nahlásit jako SPAM
IP: ...–
29. 9. 2006   #10
-
0
-

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:

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 88 hostů

Podobná vlákna

Const char v C — založil Halancik

Definice const char *[] — založil Remder

Static const char array[] .. — založil kruciik

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý