Kyseinen koodivinkki on alkeellinen musiikkisoitin Audiere kirjastolle ( http://audiere.sourceforge.net/ ).
Se on komentorivi pohjainen esimerkki, joka kääntyy msvc++:lla.
Koodi on suht' yksinkertaista ja helppo lukuista, joten sitä ei kannata suuremmin selitellä.
Jos haluat kääntää ohjelman, on sinun asennettava kääntäjääsi audiere kirjasto.
Valmiiksi käännetty ohjelma löytyy kuitenkin täältä: http://koti.mbnet.fi/peku1/Musasoitin.zip
P.S. Älkää ihmetelkö Zephyrus nimeä :D. Se on oma "koodausnimeni".
Kirjoitin koodin englanniksi, jotta se kuulostaisi "virallisemmalta" ja siksi, etteivät ääkköset pelaa komentorivissä. Kommentit ovat silti selvyyden vuoksi suomeksi. ;)
Edit: Jostain syystä ohjelma ei hyväksy tiedoston nimiä, joissa on väli(' '). Syytä en tiedä.
Edit2:
Tuetut tiedostotyypit: mp3, Ogg Vorbis(tarvitaan ogg vorbis kirjasto), FLAC (tarvitaan libFLAC), pakkaamaton WAV, AIFF, MOD, S3M, XM, IT
#include <audiere.h> #include <iostream> using namespace std; using namespace audiere; int main() { AudioDevicePtr device(OpenDevice()); if (!device) { // Virhe } OutputStreamPtr stream; bool paused = false; // alkutekstit cout << "-------------------------------------------------------------------------\n"; cout << "Audiere Music Player v.0.1.\n"; cout << "Coded by the Zephyrus.\n"; cout << "If this program does any harm to your computer. I'm not responsible.\n"; cout << "-------------------------------------------------------------------------\n\n"; cout << "Make your choice:\n"; cout << " (p) Play music file\n"; cout << " (r) Pause/Resume\n"; cout << " (v) Set Volume\n"; cout << " (m) This menu\n"; cout << " (q) Quit\n\n"; while(true) { char a; cin >> a; switch (a) { case 'p': { cout << "Allowed formats: MP3, Ogg Vorbis (requires the vorbisfile libraries)\n"; cout << " FLAC (requires libFLAC), uncompressed WAV, AIFF, MOD, S3M\n"; cout << " XM, IT\n"; cout << "Type the path here:\n"; char *path = new char; cin >> path; // Jos viimeinen argumentti on true, ladataan koko biisi // ensiksi muistiin ja soitetaan vasta sitten stream = OutputStreamPtr(OpenSound(device, path, false)); stream->setRepeat(true); stream->setVolume(1.0f); stream->play(); break; } case 'r': { if(paused) { stream->play(); paused = false; cout << "Resumed..\n"; } else { stream->stop(); paused = true; cout << "Paused..\n"; } break; } case 'v': { // uusi merkkijono char* vo = new char; cout << "Type the new volume(0.0 - 1.0)\n"; cin >> vo; // konvertoidaan doubleksi double vol = atof(vo); //asetetaan volyymi stream->setVolume(vol); break; } case 'm': { cout << "Make your choice:\n"; cout << " (p) Play music file\n"; cout << " (r) Pause/Resume\n"; cout << " (v) Set Volume\n"; cout << " (m) This menu\n"; cout << " (q) Quit\n\n"; break; } case 'q': return 0; // Sammutetaan break; // Hyvien tapojen mukaisesti :D default: cout << "Unrecognized command!\n"; } } }
Kannattaisi yrittää korjata tuo välilyönti-bugi.
Tuo nimittäin johtuu siitä, että "cin >>" lukee muuttujaan vain ensimmäiseen väliin asti.
char *path = new char;
Eikös tuo varaa vain yhden tavun tilaa merkkijonolle, jolloin pidemmän polut saattavat jatkua muun datan päälle? Kaiken lisäksi varattua muistia ei vapauteta missään. Homma hoituisi helpommin näin:
char path[MAX_POLUN_PITUUS]; cin.getline(path, MAX_POLUN_PITUUS); // cin >> path;
Tuossa toimivat välilyönnitkin.
Kiitos tn.
varatun muistin vapauttaminen ei ainakaan delete käskyllä onnistunut, sillä "delete path;" rivi aiheutti ohjelman kaatumisen välittömästi.
Kaipaa pientä hienosäätöä
toimiiko tämä muilla?
mulla ei toimi näitä virheitä antaa
[Linker error] undefined reference to `_imp__AdrOpenSound@12'
[Linker error] undefined reference to `_imp__AdrOpenSampleSource@8'
[Linker error] undefined reference to `_imp__AdrOpenDevice@8'
ld returned 1 exit status
dev-c++:aa käytän
oon aloittelia :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.