Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Audiere musiikkisoitin

peki [04.08.2004 17:10:06]

#

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

Juice [05.08.2004 18:14:24]

#

Kannattaisi yrittää korjata tuo välilyönti-bugi.

Metabolix [05.08.2004 23:48:22]

#

Tuo nimittäin johtuu siitä, että "cin >>" lukee muuttujaan vain ensimmäiseen väliin asti.

tn [06.08.2004 13:33:32]

#

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.

peki [08.08.2004 17:48:32]

#

Kiitos tn.
varatun muistin vapauttaminen ei ainakaan delete käskyllä onnistunut, sillä "delete path;" rivi aiheutti ohjelman kaatumisen välittömästi.

C++Amatööri [11.08.2005 15:16:28]

#

Kaipaa pientä hienosäätöä

kankkune [31.01.2007 18:10:47]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta