如何用c语言播放mp3音乐播放器
#include
#include
#include
#include
#define BUFFER_SIZE 4096
// Error handling macro
#define CHECK_ERROR(err, msg)
if (err != MPG123_OK) {
fprintf(stderr, "%s: %sn", msg, mpg123_plain_strerror(err));
exit(EXIT_FAILURE);
}
typedef struct {
unsigned char buffer[BUFFER_SIZE];
size_t buffer_size;
size_t buffer_index;
int done;
} AudioData;
// PortAudio callback function
static int paCallback(const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData) {
AudioData *data = (AudioData *)userData;
unsigned char *out = (unsigned char *)outputBuffer;
size_t bytes_to_copy = framesPerBuffer * 2 * 2; // 2 channels, 2 bytes per sample
if (data->buffer_index + bytes_to_copy > data->buffer_size) {
bytes_to_copy = data->buffer_size - data->buffer_index;
data->done = 1;
}
memcpy(out, data->buffer + data->buffer_index, bytes_to_copy);
data->buffer_index += bytes_to_copy;
return data->done ? paComplete : paContinue;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s
return EXIT_FAILURE;
}
mpg123_handle *mh;
PaStream *stream;
int err;
long rate;
int channels, encoding;
AudioData data = {0};
// Initialize libmpg123
err = mpg123_init();
CHECK_ERROR(err, "mpg123_init");
mh = mpg123_new(NULL, &err);
CHECK_ERROR(err, "mpg123_new");
err = mpg123_open(mh, argv[1]);
CHECK_ERROR(err, "mpg123_open");
err = mpg123_getformat(mh, &rate, &channels, &encoding);
CHECK_ERROR(err, "mpg123_getformat");
// Initialize PortAudio
err = Pa_Initialize();
if (err != paNoError) {
fprintf(stderr, "Pa_Initialize: %sn", Pa_GetErrorText(err));
return EXIT_FAILURE;
}
err = Pa_OpenDefaultStream(&stream, 0, channels, paInt16, rate, 256, paCallback, &data);
if (err != paNoError) {
fprintf(stderr, "Pa_OpenDefaultStream: %sn", Pa_GetErrorText(err));
return EXIT_FAILURE;
}
err = Pa_StartStream(stream);
if (err != paNoError) {
fprintf(stderr, "Pa_StartStream: %sn", Pa_GetErrorText(err));
return EXIT_FAILURE;
}
while (!data.done) {
size_t done;
err = mpg123_read(mh, data.buffer, BUFFER_SIZE, &done);
if (err != MPG123_OK && err != MPG123_DONE) {
fprintf(stderr, "mpg123_read: %sn", mpg123_plain_strerror(err));
return EXIT_FAILURE;
}
data.buffer_size = done;
data.buffer_index = 0;
while (!data.done && data.buffer_index < data.buffer_size) {
Pa_Sleep(10);
}
}
err = Pa_StopStream(stream);
if (err != paNoError) {
fprintf(stderr, "Pa_StopStream: %sn", Pa_GetErrorText(err));
return EXIT_FAILURE;
}
err = Pa_CloseStream(stream);
if (err != paNoError) {
fprintf(stderr, "Pa_CloseStream: %sn", Pa_GetErrorText(err));
return EXIT_FAILURE;
}
Pa_Terminate();
mpg123_close(mh);
mpg123_delete(mh);
mpg123_exit();
return EXIT_SUCCESS;
}