0

私は把握できないように見える非常に奇妙な問題を抱えています。これはコンパイラのバグであるとほぼ確信しています。

xTech : xIncludes.hh

#ifndef _xIncludes_
#define _xIncludes_

#define SDL_MAIN_HANDLED

#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdint.h>
#include <vector>
#include <SDL2/SDL.h>

#if defined _WIN32
    #include <winsock.h>
#endif

#endif

xTech : xSound.cc

#include "xSound.hh"

int xOGGStreamSource::_stream(ALuint Buffer) {
    char data[BufferSize];
    int size = 0;
    int section;
    int result;

    while (size < BufferSize) {
        result = ov_read(&_oggstream, data + size, BufferSize - size, 0, 2, 1, &section);

        if (result > 0)
            size += result;
        else
            if (result < 0)
                return result;
            else
                break; //This seems a little redundant.... deal with it after it works.
    }

    if (size == 0) return 0;
    alBufferData(Buffer, _format, data, size, _vorbisinfo->rate);
    return 1;
}

void xOGGStreamSource::_empty() {
    int queued;

    alGetSourcei(_source, AL_BUFFERS_QUEUED, &queued);

    while (queued--) {
        ALuint Buffer;
        alSourceUnqueueBuffers(_source, 1, &Buffer);
    }
}

int xOGGStreamSource::Open(xString path) {
    int result;

    _oggfile = xOpenFile(path, "rb");

    if (_oggfile.Buffer == NULL) {
        xLogf("Audio", "Error in OGG File '%s', file does not exist.", path);
        return -3;
    }

    if (result = ov_open(_oggfile.Buffer, &_oggstream, NULL, 0) < 0) {
        xLogf("Audio", "Error in OGG File '%s', file is non-OGG.", path);
        xCloseFile(_oggfile);
        return -2;
    }

    _vorbisinfo = ov_info(&_oggstream, -1);
    _vorbiscomment = ov_comment(&_oggstream, -1);

    if (_vorbisinfo->channels == 1)
        _format = AL_FORMAT_MONO16;
    else
        _format = AL_FORMAT_STEREO16;

    alGenBuffers(2, _buffers);
    alGenSources(1, &_source);

    return 1;
}

void xOGGStreamSource::Close() {
    alSourceStop(_source);
    _empty();
    alDeleteSources(1, &_source);
    alDeleteBuffers(1, _buffers);

    ov_clear(&_oggstream);
}

int xOGGStreamSource::Playback() {
    if (Playing()) return 1;
    if (!_stream(_buffers[0])) return 0;
    if (!_stream(_buffers[1])) return 0;

    alSourceQueueBuffers(_source, 2, _buffers);
    alSourcePlay(_source);

    return 1;
}

int xOGGStreamSource::Playing() {
    ALenum state;
    alGetSourcei(_source, AL_SOURCE_STATE, &state);
    return (state == AL_PLAYING);
}

int xOGGStreamSource::Update(xVec3f_t Pos, xVec3f_t Vloc, xVec3f_t Dir, float Vol) {
    int processed;
    int active = 1;

    alSource3f(_source, AL_POSITION,        Pos.X, Pos.Y, Pos.Z);
    alSource3f(_source, AL_VELOCITY,        Vloc.X, Vloc.Y, Vloc.Z);
    alSource3f(_source, AL_DIRECTION,       Dir.X, Dir.Y, Dir.Z);
    alSourcef (_source, AL_GAIN, Vol);
    alSourcei (_source, AL_SOURCE_RELATIVE, AL_TRUE);

    alGetSourcei(_source, AL_BUFFERS_PROCESSED, &processed);

    while(processed--) {
        ALuint Buffer;
        alSourceUnqueueBuffers(_source, 1, &Buffer);
        active = _stream(Buffer);
        alSourceQueueBuffers(_source, 1, &Buffer);
    }

    return active;
}

xSound::xSound(xOGGStreamSource xss) { _source = xss; }

int xSound::PlaySound(float Volume, xVec3f_t Location) {
    if (!_source.Playback()) return -3;

    while(_source.Update(Location, xVec3f_t(0,0,0), xVec3f_t(0,0,0), Volume)) {
        if (!_source.Playing()) {
            if (!_source.Playback()) return -2;
            else return -1;
        }
    }
    _source.Close();
    return 1;
}

xSoundManager::xSoundManager(){}

int xSoundManager::Init() {
    _device = alcOpenDevice(NULL);
    if (!_device) return -2;

    _context = alcCreateContext(_device, NULL);
    if (alcMakeContextCurrent(_context) == ALC_FALSE || !_context) return -1;

    if (!Volume) {
        xLogf("Error", "Volume in Audio is not set properly. Setting to default");
        Volume = DEFAULT_VOLUME;
    }
    alListenerf(AL_GAIN, Volume);

    if (!BufferSize) {
        xLogf("Error", "Buffer size in Audio is not set properly. Setting to default");
        BufferSize = DEFAULT_BUFFER_SIZE;
    }

    return 0;
}

xSound* xSoundManager::LoadOGG(xString file) {
    xOGGStreamSource ogg;
    if (ogg.Open(file) < 0) return NULL;

    return new xSound(ogg);
}

xTechLibTest : main.cc

int main() {
    xSetLogFile("xTechLibTest.log");

    xSoundManager* audio = new xSoundManager();
    if (audio->Init() < 0) return -1;

    xSound* testsound1 = audio->LoadOGG("testsound.ogg");
    if (testsound1 == NULL) return -2;
    testsound1->PlaySound(1.0, xVec3f_t(1.0,0.5,0.3));
}

上記のコードとそれに関連するすべて (文字列の実装など) は正常に動作し、まったく問題はありません。それは、SDL.h を含めるまでです。定義したすべての関数に対して未定義の参照を取得しますが、以前はコンパイラが問題なくそれらを見つけることができました。SDL.h を含めるだけで、私が作成した定義が完全に無効になるようです。ここで何が起こっているのですか?

4

2 に答える 2

0

SDL ライブラリへのリンケージを適切に含めましたか?

バイナリを自分でビルドした場合は、パスとライブラリを含める必要があります。Linux システムでは、スタティック ライブラリを自分で構築した場合、libSDL2.a というバイナリが作成されますが、リンクするには、リンクされたライブラリとして SDL2 を指定する必要があります。

また、補足として、xsound.hファイルに冗長なインクルードガードがありますか(経由#ifdef _xsound_...)?

ps 環境の設定方法を指定すると、他のユーザーに役立ちます。コンパイラ、システム OS、IDE。

于 2013-11-10T16:50:05.267 に答える