Мне нужен способ играть определенные музыкальные ноты в моей программе на языке C на Linux. При использовании окон можно использовать #include <dos.h>
и использовать прямолинейные функции, такие как sound(note/frequency)
, delay(time in ms)
, и самообслуживание nosound()
. Есть ли что-то параллельное в Linux? ThanksКак создать звук в C на Linux?
ответ
Windows использует собственную звуковую архитектуру, поэтому вы можете получить доступ к подпрограмме sound()
.
Различные машины linux, в зависимости от установленных пакетов, могут потребовать разные подходы. Может утилита beep
(из this question on stackexchange) может направить вас в правильном направлении
мне нравится наконечник выше относительно 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 дальше ... взять глупца в этом
Из коробки OpenAL играет буфер PCM аудио просто отлично ... однако он оставляет в качестве упражнения возможность играть в поток. В этом GitHub репо я написал аудио сервер с помощью OpenAL, который реализует Воспроизведение потокового аудио ... наслаждаться
Что такое '16' в' alDeleteBuffers (16, & streaming_source [0]); 'line? – user2029077
Вы хотите удалить источники с удалением буфера? – user2029077
одностороннюю
включая #include<conio.h>
и боковой основной() или где вы хотите использовать вызов печати (» \ а ")
printf("\a");
второй путь
включая файл заголовка
#include <windows.h>
и вызов функции Beep(500, 500);
Beep(freq, dur);
, где частота = звуковой частоты, который является INT и dutation в Int также
- 1. Звук API Ubuntu Linux
- 2. Как создать звук с нуля C#
- 3. Как создать дерево каталогов на C++/Linux?
- 4. В C/C++ на linux, как мне создать предопределенный mutex
- 5. Звук на [каждый глобальный] keypress (linux)
- 6. Как создать пример конвейера linux в c
- 7. Как создать таймер в linux на языке c?
- 8. Как звук воспроизводится в C++
- 9. Как я могу воспроизводить звук на C#?
- 10. Как создать проект Visual C++ для Linux?
- 11. Как записать звук из ПК в C++?
- 12. Как создать виртуальный порт CAN на Linux? (C++)
- 13. Как создать чат Facebook как звук?
- 14. C# Disable Webbrowser Звук/Звук приложения
- 15. Создать выходной файл в linux C++
- 16. Как создать сокет в Linux?
- 17. Как определить, что звук в настоящее время воспроизводится в Linux?
- 18. Как играть звук в C#, .NET
- 19. Как спать или приостановить PThread в c на Linux
- 20. Как добавить звук в C++ визуальной студии
- 21. Как создать пользователя linux с помощью C/C++?
- 22. Программирование на Linux в C++
- 23. Как создать logrotate в linux
- 24. Как остановить звук на Java?
- 25. Создать звук - PCM (Android - Java)
- 26. Как создать приложение BlackBerry на Linux?
- 27. Android Emulator Блокирует звук на хосте VMware Linux
- 28. Создать файл в linux
- 29. Как создать контролируемую загрузку процессора на Linux?
- 30. как создать звук игрока UISlider быть UIProgress
возможный дубликат [ALSA учебника требуется] (http://stackoverflow.com/questions/8485553/alsa-tutorial-required) – DevNull
Связанный дубликат на самом деле не отвечает на вопрос. Это просто ссылки на кучу учебников. – cpburnz
Возможно, вас заинтересует 'libao' [документация] (http://xiph.org/ao/doc/). Это позволит вам воспроизводить аудио данные PCM. Это нормально, если вы хотите звуковой сигнал ... – francis