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.