一个基本的音乐播放器需要使用第三方库,例如PortAudio或SDL来处理音频。以下是一个简单的例子,使用PortAudio库播放音频文件。
首先,你需要安装PortAudio库。在Linux上,你可以使用包管理器安装它,例如在Ubuntu上使用:
sudo apt-install portaudio19-dev
代码
#include <stdio.h>
#include <portaudio.h>
#define SAMPLE_RATE (44100)
#define FRAMES_PER_BUFFER (1024)
#define NUM_SECONDS (5)
#define NUM_CHANNELS (2)
static int callback(const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData) {
(void) inputBuffer; /* Prevent unused variable warning. */
float *out = (float*) outputBuffer;
for (int i = 0; i < framesPerBuffer; i++) {
*out++ = (float) (*userData) / 32768.0f; /* scale to maximum amplitude */
(*userData) += 1; /* increment sample pointer */
if (userData >= &sine[DATA_SIZE]) {
userData = &sine[0]; /* loop sample buffer */
}
}
return 0;
}
int main(int argc, char *argv[]) {
short sine[NUM_SECONDS * SAMPLE_RATE];
for (int i = 0; i < NUM_SECONDS * SAMPLE_RATE; ++i) {
sine[i] = (short)(32767 * sin(2 * M_PI * (i / (double)SAMPLE_RATE)) + 32768);
}
PaError err = Pa_Initialize();
if (err != paNoError) {
fprintf(stderr, "Error initializing PortAudio: %s\n", Pa_GetErrorText(err));
return err;
}
PaStream *stream;
err = Pa_OpenDefaultStream(&stream, NUM_CHANNELS, NUM_CHANNELS, paFloat32, SAMPLE_RATE, FRAMES_PER_BUFFER, callback, &sine);
if (err != paNoError) {
fprintf(stderr, "Error opening stream: %s\n", Pa_GetErrorText(err));
return err;
}
err = Pa_StartStream(stream);
if (err != paNoError) {
fprintf(stderr, "Error starting stream: %s\n", Pa_GetErrorText(err));
return err;
}
printf("Play for 5 seconds.\n");
Pa_Sleep(NUM_SECONDS * 1000);
err = Pa_StopStream(stream);
if (err != paNoError) {
fprintf(stderr, "Error stopping stream: %s\n", Pa_GetErrorText(err));
return err;
}
err = Pa_CloseStream(stream);
if (err != paNoError) {
fprintf(stderr, "Error closing stream: %s\n", Pa_GetErrorText(err));
return err;
}
Pa_Terminate();
return 0;
}
这个代码使用了PortAudio的回调模式播放了一个简单的正弦波,你需要自行扩展代码以支持音频文件的读取和播放。