2014-01-20 2 views
1

OpenAL을 시작하려고합니다. 순간 오류 "AL/altypes.h" No such file or directory. 나타납니다에서C++ : AL/altypes.h 해당 파일이나 디렉토리가 없습니다.

g++ main.cpp -lOpenAL 

:

나는 내가 사용 here에서 가져온이 프로그램을 컴파일하려합니다. 아무도 내가 이것을 고칠 수있는 방법을 알고 있습니까? libopenal-dev을 설치했습니다. (우분투 13.04에 생각입니까?)을 같이

#include <iostream> 
#include <cstdlib> 
#include <AL/altypes.h> 
#include <AL/al.h> 
#include <AL/alu.h> 
#include <AL/alut.h> 


#define NUM_BUFFERS 1 
#define NUM_SOURCES 1 
#define NUM_ENVIRONMENTS 1 

ALfloat listenerPos[] = {0.0, 0.0, 4.0}; 
ALfloat listenerVel[] = {0.0, 0.0, 0.0}; 
ALfloat listenerOri[] = {0.0, 0.0, 1.0, 0.0, 1.0, 0.0}; 

ALfloat source0Pos[] = {0.0, 0.0, 0.0}; 
ALfloat source0Vel[] = {0.0, 0.0, 0.0}; 

ALuint buffer[NUM_BUFFERS]; 
ALuint source[NUM_SOURCES]; 
ALuint environment[NUM_ENVIRONMENTS]; 

ALsizei size, freq; 
ALenum format; 
ALvoid* data; 

void init(void) 
{ 
    alListenerfv(AL_POSITION,listenerPos); 
    alListenerfv(AL_VELOCITY,listenerVel); 
    alListenerfv(AL_ORIENTATION,listenerOri); 

    alGetError(); // clear any error messages 

    // Generate buffers, or else no sound will happen! 
    alGenBuffers(NUM_BUFFERS, buffer); 

    if(alGetError() != AL_NO_ERROR) 
    { 
     std::cout << "- Error creating buffers !!" << std::endl; 
     exit(1); 
    } 
    else 
    { 
     std::cout << "init() - No errors yet." << std::endl; 
    } 

    alutLoadWAVFile((Albyte *) "c.wav", &format, &data, size,&freq, &al_bool); 
    alBufferData(buffer[0],format,data,size,freq); 
    alutUnloadWAV(format,data,size,freq); 

    alGetError(); /* clear error */ 
    alGenSources(NUM_SOURCES, source); 

    if(alGetError() != AL_NO_ERROR) 
    { 
     std::cout << "- Error creating sources !!" << std::endl; 
     exit(2); 
    } 
    else 
    { 
     std::cout << "init - no errors after alGenSources" << std::endl; 
    } 

    alSourcef(source[0], AL_PITCH, 1.0f); 
    alSourcef(source[0], AL_GAIN, 1.0f); 
    alSourcefv(source[0], AL_POSITION, source0Pos); 
    alSourcefv(source[0], AL_VELOCITY, source0Vel); 
    alSourcei(source[0], AL_BUFFER,buffer[0]); 
    alSourcei(source[0], AL_LOOPING, AL_TRUE); 
} 

int main() 
{ 

    //initialise openAL 
    alutInit(&argc, argv) ; 

    init(); 

    return 0; 
} 

를 제외하고,이 프로그램은 실제로 내가 지금하고 싶은 일을하지 않습니다.

double/int 배열을 선언하고 데이터로 채우고 해당 데이터를 재생하려고합니다. 아무도 내가 어떻게 할 수 있는지 안다?

답변

1

유틸리티가 들어있는 libalut-dev 패키지가 있지만 오디오 파일 I/O의 libsndfile을 살펴보십시오. 항상 당신에게 많은 것을 가르쳐주는 자신의 WAV/PCM 파서를 굴리는 거룩한 성배와 너무 어렵지 않습니다. WRT 옆으로 ... 다음 오픈 코드는 데이터를 오픈 버퍼로 합성 한 다음 오디오로 렌더링합니다. 아래의 다른 코드 페이지는 스트리밍 오디오 플레이어를 제공하여 편리하게 사용할 수 있습니다.

gcc -o gen_tone_08 gen_tone_08.c -lopenal -lm 

는 우리가 당신

#include <stdio.h> 
#include <stdlib.h> // gives malloc 
#include <math.h> 


#ifdef __APPLE__ 
#include <OpenAL/al.h> 
#include <OpenAL/alc.h> 
#elif __linux 
#include <AL/al.h> 
#include <AL/alc.h> 
#endif 

ALCdevice * openal_output_device; 
ALCcontext * openal_output_context; 

ALuint internal_buffer; 
ALuint streaming_source[1]; 

int al_check_error(const char * given_label) { 

    ALenum al_error; 
    al_error = alGetError(); 

    if(AL_NO_ERROR != al_error) { 

     printf("ERROR - %s (%s)\n", alGetString(al_error), given_label); 
     return al_error; 
    } 
    return 0; 
} 

void MM_init_al() { 

    const char * defname = alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); 

    openal_output_device = alcOpenDevice(defname); 
    openal_output_context = alcCreateContext(openal_output_device, NULL); 
    alcMakeContextCurrent(openal_output_context); 

    // setup buffer and source 

    alGenBuffers(1, & internal_buffer); 
    al_check_error("failed call to alGenBuffers"); 
} 

void MM_exit_al() { 

    ALenum errorCode = 0; 

    // Stop the sources 
    alSourceStopv(1, & streaming_source[0]);  //  streaming_source 
    int ii; 
    for (ii = 0; ii < 1; ++ii) { 
     alSourcei(streaming_source[ii], AL_BUFFER, 0); 
    } 
    // Clean-up 
    alDeleteSources(1, &streaming_source[0]); 
    alDeleteBuffers(16, &streaming_source[0]); 
    errorCode = alGetError(); 
    alcMakeContextCurrent(NULL); 
    errorCode = alGetError(); 
    alcDestroyContext(openal_output_context); 
    alcCloseDevice(openal_output_device); 
} 

void MM_render_one_buffer() { 

    /* Fill buffer with Sine-Wave */ 
    // float freq = 440.f; 
    float freq = 100.f; 
    float incr_freq = 0.1f; 

    int seconds = 4; 
    // unsigned sample_rate = 22050; 
    unsigned sample_rate = 44100; 
    double my_pi = 3.14159; 
    size_t buf_size = seconds * sample_rate; 

    short * samples = malloc(sizeof(short) * buf_size); 

    printf("\nhere is freq %f\n", freq); 
    int i=0; 
    for(; i<buf_size; ++i) { 
     samples[i] = 32760 * sin((2.f * my_pi * freq)/sample_rate * i); 

     freq += incr_freq; 
     // incr_freq += incr_freq; 
     // freq *= factor_freq; 

     if (100.0 > freq || freq > 5000.0) { 

      incr_freq *= -1.0f; 
     } 
    } 

    /* upload buffer to OpenAL */ 
    alBufferData(internal_buffer, AL_FORMAT_MONO16, samples, buf_size, sample_rate); 
    al_check_error("populating alBufferData"); 

    free(samples); 

    /* Set-up sound source and play buffer */ 
    // ALuint src = 0; 
    // alGenSources(1, &src); 
    // alSourcei(src, AL_BUFFER, internal_buffer); 
    alGenSources(1, & streaming_source[0]); 
    alSourcei(streaming_source[0], AL_BUFFER, internal_buffer); 
    // alSourcePlay(src); 
    alSourcePlay(streaming_source[0]); 

    // --------------------- 

    ALenum current_playing_state; 
    alGetSourcei(streaming_source[0], AL_SOURCE_STATE, & current_playing_state); 
    al_check_error("alGetSourcei AL_SOURCE_STATE"); 

    while (AL_PLAYING == current_playing_state) { 

     printf("still playing ... so sleep\n"); 

     sleep(1); // should use a thread sleep NOT sleep() for a more responsive finish 

     alGetSourcei(streaming_source[0], AL_SOURCE_STATE, & current_playing_state); 
     al_check_error("alGetSourcei AL_SOURCE_STATE"); 
    } 

    printf("end of playing\n"); 

    /* Dealloc OpenAL */ 
    MM_exit_al(); 

} // MM_render_one_buffer 

int main() { 

    MM_init_al(); 

    MM_render_one_buffer(); 
} 
에 얼마나 알려 사용하여 컴파일
관련 문제