赞
踩
一个基本的音乐播放器需要使用第三方库,例如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的回调模式播放了一个简单的正弦波,你需要自行扩展代码以支持音频文件的读取和播放。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。