Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: OpenAL ei toimi macissa

Sivun loppuun

A.V.K [10.08.2012 10:11:47]

#

Olen tässä jo jonkin aikaa yrittänyt saada OpenAL:ää toimimaan. Ilmeisesti Xcoden (compilerini) uusin versio ei enää tue aluttia (alut.h) enkä ole tähän mennessä löytänyt kuin yhden kunnollisen OpenAL tutorialin ilman aluttia, ja sekin oli sitten vain Windowsille. Eli onko mitään mahdollisuutta saada OpenAL:ää toimimaan macillä? Jos ei niin mistä saisi jonkun muun hyvän audio kirjaston?

Grez [10.08.2012 10:40:00]

#

Oletko löytänyt tuota vai eikö se ole kunnollinen?
http://www.edenwaith.com/products/pige/tutorials/openal.php

A.V.K [10.08.2012 10:44:29]

#

Tuo käyttää aluttia.

Grez [10.08.2012 11:01:50]

#

Tämä(kin) tutoriaali on Windowsille, mutta onko siinä jotain niin Windows-spesifistä, ettei sitä voisi soveltaa Macille?

http://www.youtube.com/watch?v=V83Ja4FmrqE

A.V.K [10.08.2012 11:11:08]

#

Macci ei sisällä windows.h:ta jota tuo tutoriaali käyttää.

Grez [10.08.2012 11:13:52]

#

Ja ilmeisesti ihan vaan jättämällä windows.h pois ei myöskään toimi?

Miten jos vaan otat jonkin uusinta OpenAL:ia käyttävän esimerkin ja lähdet siitä rakentamaan. Ei pitäisi tarvita ALUTia ainakaan tämän mukaan http://developer.apple.com/library/mac/#qa/qa1504/_index.html

A.V.K [10.08.2012 16:15:57]

#

Grez kirjoitti:

Miten jos vaan otat jonkin uusinta OpenAL:ia käyttävän esimerkin ja lähdet siitä rakentamaan.

Mistä saan sellaisen?

Grez [10.08.2012 19:33:19]

#

Luulis että joku esimerkki tulisi OpenAL-kirjaston mukana tai olisi saatavilla sivuilta. Mutta näköjään edes OpenAL -projektin sivut ei toimi kunnolla ja muutenkaan ei oikein laadulla vakuuta. Toisaalta ei mitenkään yllätä kun Creative Labs on mukana kuviossa.

A.V.K [10.08.2012 22:53:41]

#

Ei oo tullu minkään mukana esimerkkejä... Ei taida oikeen toi OpenAL onnistua. Tiedätkö mitään muuta hyvää audio kirjastoa jonka saisi varmasti toimimaan macille?

Spongi [11.08.2012 04:46:12]

#

Ei minulla mielestäni ollut mitään suurempia ongelmia kun OpenAL:ää kokeilin jonkun aikaa sitten sitten ilman aluttia. Tuon lisäkikkareen tarkoituksenahan on käsittääkseni vain hoitaa alustus omalla tavallaan sekä avustaa buffereiden luonnissa. Ei luulisi olevan niin vaikeaa käydä tutoriaalin rivejä läpi ja selvittää mitä käytetyt alutin funktiot tekevät ja korvata nämä omilla vastineilla.

Itse muistaakseni tein tämän pohjalta omat testailuni, ja en käyttänyt aluttia: http://www.gamedev.net/page/resources/_/technical/game-programming/introduction-to-ogg-vorbis-r2031

Ensimmäinen hakutulos googlessa, "openal wav": http://enigma-dev.org/forums/index.php?topic=730.0

A.V.K [11.08.2012 12:09:23]

#

Tuon tutorialin koodi jonka laitoit linkkiin antaa mutamia erroreita joistain määrittelemättömistä muuttujista. (?!)

Macro [11.08.2012 12:30:25]

#

Jos määrittelet ne sitten? Kääntäjät antavat aika yksityiskohtaisia virheilmoituksia, joiden perusteella on aika helppo korjata ongelmia.

A.V.K [11.08.2012 12:38:28]

#

Ongelma on etten tiedä mitä noiden muuttujien kuuluisi tehdä koska niitä käytetään joissain file_read funktioissa joita kääntäjäni ei myöskään tunnista.

Spongi [12.08.2012 06:52:18]

#

"Kopioin nämä koodit täältä välistä mutta ei tämä käänny"

Käytä aikaa sen koodin ymmärtämiseen, ei pelkällä copypastella opi kovinkaan paljoa. Ja siellä kerrotaan aika selkeästi mitä ne file_read-alkuiset funktiot tekevät, jollei sitä osaa itse jostain syystä päätellä.

reino [12.08.2012 12:09:56]

#

Kyllä voi jättää macilla pois tuon windows.h tiedoston jos poistat samalla wintoosajutut.

<A.K> kirjoitti:

Tuon tutorialin koodi jonka laitoit linkkiin antaa mutamia erroreita joistain määrittelemättömistä muuttujista. (?!)

Voisit postata koodin niin joku voisi ehkä selvittää vähän mikä on vialla. Osaisitko sinäkään selvittää mikä on ongelmana viestissä jossa lukee vaan esimerkiksi "Apua, mun koodi ei toimi. Kertokaa miten korjaan sen!!" ei hyödytä kovinkaan paljon. Postaa vaikka mikä wirhe tuosta alut.h:sta tulee.

PS. Ja itse suosittelen kääntäjäksi GCC:tä.

A.V.K [12.08.2012 16:16:35]

#

No tässä on sen tutoriaalin koodi jonka Spongli laittoi linkkiin (pistin sen kokonaan int mainin sisään. En tiedä onko tarkoitus(?)).

#include <openal/al.h>
#include <openal/alc.h>
#include <cstdio>

int main(int argc, const char * argv[])
{
    ALCdevice* device = alcOpenDevice(NULL);
    ALCcontext* context = alcCreateContext(device, NULL);
    alcMakeContextCurrent(context);

    alListener3f(AL_POSITION, 0, 0, 0);
    alListener3f(AL_VELOCITY, 0, 0, 0);
    alListener3f(AL_ORIENTATION, 0, 0, -1);

    ALuint source;
    alGenSources(1, &source);

    alSourcef(source, AL_PITCH, 1);
    alSourcef(source, AL_GAIN, 1);
    alSource3f(source, AL_POSITION, 0, 0, 0);
    alSource3f(source, AL_VELOCITY, 0, 0, 0);
    alSourcei(source, AL_LOOPING, AL_FALSE);

    alGenBuffers(1, &buffer);

    //TODO Load data to buffer

    alSourcei(source, AL_BUFFER, buffer);

    FILE* f = fopen("audio.wav", "fb");
    char xbuffer[5];
    xbuffer[4] = '\0';
    if (fread(xbuffer, sizeof(char), 4, file) != 4 || strcmp(xbuffer, "RIFF") != 0)
        throw "Not a WAV file";

    file_read_int32_le(xbuffer, file);

    if (fread(xbuffer, sizeof(char), 4, file) != 4 || strcmp(xbuffer, "WAVE") != 0)
        throw "Not a WAV file";

    if (fread(xbuffer, sizeof(char), 4, file) != 4 || strcmp(xbuffer, "fmt ") != 0)
        throw "Invalid WAV file";

    file_read_int32_le(xbuffer, file);
    short audioFormat = file_read_int16_le(xbuffer, file);
    short channels = file_read_int16_le(xbuffer, file);
    int sampleRate = file_read_int32_le(xbuffer, file);
    int byteRate = file_read_int32_le(xbuffer, file);
    file_read_int16_le(xbuffer, file);
    short bitsPerSample = file_read_int16_le(xbuffer, file);

    if (audioFormat != 16) {
        short extraParams = file_read_int16_le(xbuffer, file);
        file_ignore_bytes(file, extraParams);
    }

    if (fread(xbuffer, sizeof(char), 4, file) != 4 || strcmp(xbuffer, "data") != 0)
        throw "Invalid WAV file";

    int dataChunkSize = file_read_int32_le(xbuffer, file);
    unsigned char* bufferData = file_allocate_and_read_bytes(file, (size_t) dataChunkSize);

    float duration = float(dataChunkSize) / byteRate;
    alBufferData(buffer, GetFormatFromInfo(channels, bitsPerSample), bufferData, dataChunkSize, sampleRate);
    free(bufferData);
    fclose(f);

    static inline ALenum GetFormatFromInfo(short channels, short bitsPerSample) {
        if (channels == 1)
            return AL_FORMAT_MONO16;
        return AL_FORMAT_STEREO16;
    }

    alSourcePlay(source);
    fgetc(stdin);

    alDeleteSources(1, &source);
    alDeleteBuffers(1, &buffer);
    alcDestroyContext(context);
    alcCloseDevice(device);

    return 0;
}

Eli XCode antaa tälläisiä erroreita:

- Use of uncleared identififer 'buffer'
- Use of uncleared identififer 'file'
- use of uncleared identififer 'strcmp'

Miten nuo tulisi määritellä?

Jalmari91 [12.08.2012 18:33:10]

#

Use of uncleared identififer 'buffer' => Et ole missään määritellyt bufferia
Use of uncleared identififer 'file' => Vinkki ?FILE* f = fopen("audio.wav", "fb");?
use of uncleared identififer 'strcmp' => #include <cstring>

A.V.K [12.08.2012 21:31:47]

#

Miten bufferi kuuluisi määritellä? Ja en ymmärrä tuota vinkkiäsi. Strcmp:n sain toimimaan #include <cstring>:llä

Jalmari91 [12.08.2012 22:15:36]

#

Bufferin voit määritellä esim ALuint buffers[NUM_BUFFERS]; Mutta muista antaa NUM_BUFFERS:lle jokin arvo. Ja tuon tiedoston aukaisu rivin pitäisi olla FILE* file = fopen("audio.wav","fb");.

A.V.K [14.08.2012 18:48:05]

#

Olen nyt määritellyt bufferin ALuint buffers[1]; ja muutin &buffer -> buffers koska XCode antoi errorin ja ehdotti tekemään niin. Ja muutin f -> file. Mutta nyt errorit näyttää tältä:
- No matching function called 'alSourcei'
- Use of unclear identififer 'file_read_int32_le'
- Use of unclear identififer 'file_read_int16_le'

jalski [14.08.2012 19:02:10]

#

<A.K> kirjoitti:

nyt errorit näyttää tältä:
- Use of unclear identififer 'file_read_int32_le'
- Use of unclear identififer 'file_read_int16_le'

Eikös nopealla vilkaisulla katsottuna tutoriaalissa kerrota mitä nuo ovat ja, että ne pitää toteuttaa itse (jätetty C-kielen harjoitteeksi)?


Sivun alkuun

Vastaus

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

Tietoa sivustosta