2014-10-27 3 views
6

Мне нужен способ играть определенные музыкальные ноты в моей программе на языке C на Linux. При использовании окон можно использовать #include <dos.h> и использовать прямолинейные функции, такие как sound(note/frequency), delay(time in ms), и самообслуживание nosound(). Есть ли что-то параллельное в Linux? ThanksКак создать звук в C на Linux?

+1

возможный дубликат [ALSA учебника требуется] (http://stackoverflow.com/questions/8485553/alsa-tutorial-required) – DevNull

+1

Связанный дубликат на самом деле не отвечает на вопрос. Это просто ссылки на кучу учебников. – cpburnz

+2

Возможно, вас заинтересует 'libao' [документация] (http://xiph.org/ao/doc/). Это позволит вам воспроизводить аудио данные PCM. Это нормально, если вы хотите звуковой сигнал ... – francis

ответ

0

Windows использует собственную звуковую архитектуру, поэтому вы можете получить доступ к подпрограмме sound().

Различные машины linux, в зависимости от установленных пакетов, могут потребовать разные подходы. Может утилита beep (из this question on stackexchange) может направить вас в правильном направлении

4

мне нравится наконечник выше относительно libao - я просто дал ему попробовать и это прекрасно работает. Вот подобный уровень сложности с использованием OpenAL для визуализации аудио-

// sudo apt-get install libopenal-dev 

// gcc -o openal_play_monday openal_play_monday.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; 

    // allocate PCM audio buffer   
    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(); 
} 

Если вы хотите принять OpenAL дальше ... взять глупца в этом

github source code

Из коробки OpenAL играет буфер PCM аудио просто отлично ... однако он оставляет в качестве упражнения возможность играть в поток. В этом GitHub репо я написал аудио сервер с помощью OpenAL, который реализует Воспроизведение потокового аудио ... наслаждаться

+0

Что такое '16' в' alDeleteBuffers (16, & streaming_source [0]); 'line? – user2029077

+0

Вы хотите удалить источники с удалением буфера? – user2029077

0

одностороннюю

включая #include<conio.h> и боковой основной() или где вы хотите использовать вызов печати (» \ а ")

printf("\a");

второй путь

включая файл заголовка

#include <windows.h> 

и вызов функции Beep(500, 500);

Beep(freq, dur);, где частота = звуковой частоты, который является INT и dutation в Int также

Смежные вопросы