1

int16_tオーディオPCMデータを含むバッファがあります。無限のオーディオループが聞こえるように、ポイントaからポイントbまでバッファーを繰り返し再生する必要があります。

サウンドを再生する最も簡単な方法はlibaoを使用することであることがわかりましたが、他の方法にも同意します。これは私のコードです:

int play(int a, int b, char *buf);

int main()
{
        int16_t *buf;  /*my buffer*/
        int a, b;
        /* a and b are the indexes of the buffer; 
         * because libao wants a buffer of char, 
         * and buf points to of int16_t, I'll pass 
         * the value a and b multiplied with 2.
         */ 

        [···]

        play(2*a, 2*b, (char *) buf);
        return 0;
}
int play(int a, int b, char *buf)
{  
        ao_device *device;  
        ao_sample_format format;  
        int default_driver;   
        /* -- Initialize -- */
        fprintf(stderr, "libao example program\n");  
        ao_initialize();  
        /* -- Setup for default driver -- */  
        default_driver = ao_default_driver_id();  
        memset(&format, 0, sizeof(format));  
        format.bits = 16;  
        format.channels = 1;  
        format.rate = 44100;  
        format.byte_format = AO_FMT_LITTLE;
        /* -- Open driver -- */  
        device = ao_open_live(default_driver, &format, NULL /* no options */);  
        if (device == NULL) {  
            fprintf(stderr, "Error opening device.\n");  
            exit(1);  
        }  
        /* -- Play the infinite loop -- */
        for (;;){
            ao_play(device, buf+a, b-a+1);
            /*buf+a is the start of the loop, b-a+1 the number of byte to play--edited*/
        }
        /* -- Close and shutdown -- */  
        ao_close(device);  
        ao_shutdown();  
    return 0;  
}

問題は、ループの終了と開始の間に無音の期間が聞こえることです。このコードを使用して他のコードをテストしているので、libaoの誤った使用が原因である可能性があるかどうかを絶対に知る必要があります。

4

1 に答える 1

1

はい、それは絶対にlibaoの誤った使用によって引き起こされる可能性があります。次のように、ao_play()呼び出しから+1を削除してください。

ao_play(device, buf+a, b-a);
于 2013-03-10T21:40:49.057 に答える