Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Tiedoston sisällyttäminen binääriin

Marope [13.07.2008 21:49:43]

#

Nyt projektin viimeisenä silauksena täytyisi musiikkitiedosto saada binääriin upotettua niin, ettei paketti tarvitse kuin yhden tiedoston toimiakseen. Olen tutkinut asiaa Googlen ja ohjelmointisivustojen hakutoimintojen avulla, mutta en löytänyt mitään toimivaa keinoa.

Löysin keinon sisällyttää tiedoston binääriin assemblyn avulla. Se toimikin varsin mainiosti, se sisällytti tiedoston binääriin, mutta sen soittaminen ei sitten ollutkaan mahdollista tai ainakin niin hankalaa, etten tiennyt keinoa. (http://www.peliguru.us/foorumi/index.php?topic­=21.0)

Nyt kiinnostaisi tietää noista resurssitiedostoista enemmän. Kuinka tiedosto sisällytetään binääriin resursseilla ja kuinka tiedosto sitten soitetaan? Musiikkitiedosto on muotoa midi ja IDE Dev-Cpp.

Grez [13.07.2008 22:05:40]

#

Niin, sitten pitäisi tietää myös, miten tuota midi-tiedostoa soitat. Eli osaako soitto-ohjelma ladata sen esimerkiksi resurssista vai haluaako se väkisin ladata sen midi-tiedostosta..

Metabolix [14.07.2008 08:28:24]

#

Muistelen, että nimenomaan MIDI-tiedostoja ei voi tallentaa resursseiksi (tai siis ei voi soittaa kätevästi resurssista käsin). Onko liikaa vaadittu, että ohjelma tallentaisi tiedoston jonnekin ja soittaisi sitten sieltä?

#include <stdlib.h>
#include <stdio.h>

char midin_polku[L_tmpnam + 1] = {0};

// Luodaan väliaikaistiedosto ja tallennetaan data
void tallenna_midi(void) {
    tmpnam(midin_polku);
    FILE *f = fopen(midin_polku, "w");
    fwrite(midin_data, midin_datan_koko, 1, f);
    fclose(f);
}
void poista_midi(void) {
    remove(midin_polku);
}

int main(void)
{
    tallenna_midi();
    atexit(poista_midi);

    // Tähän muu ohjelma...
    soita(midin_polku);
}

Helpoksi tallennustavaksi voin taas suositella Base64-enkoodausta, joka kasvattaa tiedoston kokoa 33 % mutta mahdollistaa datan tallentamisen helposti suoraan C-koodin sekaan. Purkamiseen tarvitaan yksinkertainen funktio. Toki datan voi myös dumpata suoraan C-taulukoksi:

unsigned char data[] = { 4, 255, 24, /*...*/ };

Marope [15.07.2008 19:37:08]

#

Nyt on siis kyse demon musiikista, eli tiedostojen generoimiset tai vastaavat eivät nyt tule kysymykseen. Neljään kilotavuun pitäisi saada mahdutettua jotakin, jota voisi sanoa musiikiksi.

Antti Laaksonen [15.07.2008 21:39:08]

#

Ymmärtääkseni neljän kilotavun rajoitus koskee ajettavan tiedoston kokoa eikä demon myöhempää muistinkäyttöä. En kyllä tiedä, sallitaanko kilpailuissa ja vastaavissa yleensä, että demo luo väliaikaisen aputiedoston.

Meitzi [16.07.2008 15:00:23]

#

Ainakin Assembly säännöissä sanotaan näin:
The production must work from read-only media and must not modify system settings (for example: Windows registry). However, you may use the platform's standard temporary directory during the execution of your entry for storing data if such service is available.

Vastaus

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

Tietoa sivustosta