c - ما هو عبر منصة خفيفة الوزن واف مكتبة اللعب؟




windows linux (5)

يمكنك أن تجرب مع هذا واحد: ليباو

أنا أبحث عن وسيلة خفيفة لجعل برنامجي (مكتوب في C) تكون قادرة على تشغيل الملفات الصوتية على أي من النوافذ أو لينكس. أنا حاليا باستخدام ويندوز المكالمات الأصلية، وهو في الأساس مجرد مكالمة واحدة التي يتم تمرير اسم الملف. أود شيء مماثل يعمل على لينكس.

الملفات الصوتية هي ميكروسوفت بم، قناة واحدة، 22 كيلوهرتز

أي اقتراحات؟


SDL_Mixer ، وإن لم يكن خفيفة الوزن جدا، لديها واجهة بسيطة للعب ملفات واف. وأعتقد، مثل سدل ، SDL_Mixer هو أيضا لغبل.

أوبينال هو آخر عبر منصة الصوت منصة التي هي أكثر موجهة نحو الصوت 3D.

بعد مكتبة الصوت مفتوحة المصدر الأخرى التي قد ترغب في التحقق من ذلك هو بورتاوديو


أحب فمود . الترخيص مجاني للاستخدام الشخصي، ومعقولة جدا للمشاريع الصغيرة أو المشاريع التجارية الصغيرة


منذ أنا أيضا أبحث عن إجابة للسؤال فعلت قليلا من البحث، وأنا لم تجد أي بسيطة (بسيطة مثل استدعاء وظيفة واحدة) طريقة لتشغيل ملف صوتي. ولكن مع بعض خطوط التعليمات البرمجية، فمن الممكن حتى بطريقة المحمولة باستخدام بورتاوديو المذكورة سابقا و ليبسندفيل (لغبل).

هنا هو حالة اختبار صغيرة لقد كتبت لاختبار كلا ليبس:


#include <portaudio.h>
#include <sndfile.h>

static int
output_cb(const void * input, void * output, unsigned long frames_per_buffer,
        const PaStreamCallbackTimeInfo *time_info,
        PaStreamCallbackFlags flags, void * data)
{
    SNDFILE * file = data;

    /* this should not actually be done inside of the stream callback
     * but in an own working thread 
     *
     * Note although I haven't tested it for stereo I think you have
     * to multiply frames_per_buffer with the channel count i.e. 2 for
     * stereo */
    sf_read_short(file, output, frames_per_buffer);
    return paContinue;
}

static void
end_cb(void * data)
{
    printf("end!\n");
}

#define error_check(err) \
    do {\
        if (err) { \
            fprintf(stderr, "line %d ", __LINE__); \
            fprintf(stderr, "error number: %d\n", err); \
            fprintf(stderr, "\n\t%s\n\n", Pa_GetErrorText(err)); \
            return err; \
        } \
    } while (0)

int
main(int argc, char ** argv)
{
    PaStreamParameters out_param;
    PaStream * stream;
    PaError err;
    SNDFILE * file;
    SF_INFO sfinfo;

    if (argc < 2)
    {
        fprintf(stderr, "Usage %s \n", argv[0]);
        return 1;
    }

    file = sf_open(argv[1], SFM_READ, &sfinfo);
    printf("%d frames %d samplerate %d channels\n", (int)sfinfo.frames,
            sfinfo.samplerate, sfinfo.channels);

    /* init portaudio */
    err = Pa_Initialize();
    error_check(err);

    /* we are using the default device */
    out_param.device = Pa_GetDefaultOutputDevice();
    if (out_param.device == paNoDevice)
    {
        fprintf(stderr, "Haven't found an audio device!\n");
        return -1;
    }

    /* stero or mono */
    out_param.channelCount = sfinfo.channels;
    out_param.sampleFormat = paInt16;
    out_param.suggestedLatency = Pa_GetDeviceInfo(out_param.device)->defaultLowOutputLatency;
    out_param.hostApiSpecificStreamInfo = NULL;

    err = Pa_OpenStream(&stream, NULL, &out_param, sfinfo.samplerate,
            paFramesPerBufferUnspecified, paClipOff,
            output_cb, file);
    error_check(err);

    err = Pa_SetStreamFinishedCallback(stream, &end_cb);
    error_check(err);

    err = Pa_StartStream(stream);
    error_check(err);

    printf("Play for 5 seconds.\n");
    Pa_Sleep(5000);

    err = Pa_StopStream(stream);
    error_check(err);

    err = Pa_CloseStream(stream);
    error_check(err);

    sf_close(file);

    Pa_Terminate();

    return 0;
}

بعض الملاحظات على سبيل المثال. ليس من الممارسة الجيدة أن تفعل تحميل البيانات داخل رد الاستدعاء، ولكن داخل موضوع التحميل الخاصة. إذا كنت بحاجة إلى تشغيل العديد من الملفات الصوتية يصبح أكثر صعوبة، لأنه ليس كل الخلفيات بورتاوديو دعم تيارات متعددة لجهاز واحد، على سبيل المثال لا الخلفية الخلفية أوس، ولكن الخلفية ألسا لا. أنا لا أعرف كيف الوضع على ويندوز. بما أن جميع ملفات الإدخال الخاصة بك من نفس النوع يمكنك مزجها على تملك الخاصة بك، الأمر الذي يعقد رمز أكثر قليلا، ولكن بعد ذلك كنت قد دعم أيضا ل أوس. إذا كان لديك أيضا معدلات عينة مختلفة أو عدد من القنوات، فإنه سيكون من الصعب جدا.

لذلك إذا كنت لا تريد أن تلعب ملفات متعددة في نفس الوقت، وهذا يمكن أن يكون حلا أو على الأقل بداية بالنسبة لك.


لقد استخدمت إركلانغ!

"إركلانغ هي مكتبة الصوت عبر منصة ل C ++، C # وجميع لغات .NET"

http://www.ambiera.com/irrklang/





cross-platform