admin 2025-11-20 16:11:04 休闲乐园

如何用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 n", argv[0]);

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;

}

Copyright © 2088 欢乐家园 - 休闲游戏活动与社交平台 All Rights Reserved.
友情链接