これには困惑しました。これはモノラルでは完全に機能しますが、ステレオに変更すると途切れ途切れで静的に聞こえます。これはインターリーブの問題か何かですか (データはインターリーブされています)
編集:インターリーブ方法をより論理的なものに変更しましたが、それでも役に立ちません...
#include <pthread.h>
#include <portaudio/portaudio.h>
#include <sndfile.h>
#define STEREO 2
#define SAMPLE_RATE 44100
typedef struct{
M_float* data, *data_pos;
sf_count_t frames;
} StreamData;
StreamData stream_data;
int ProcessAudio(const void* input, void* output, ulong frames_per_buff,
const PaStreamCallbackTimeInfo* time_info, PaStreamCallbackFlags flags, void* strm_data){
M_StreamData* strm = (M_StreamData*)(strm_data);
M_float* strm_out = (M_float*)(output);
if(strm -> frames > frames_per_buff){
for(sf_count_t frames_iter = 0; frames_iter < frames_per_buff;){
M_float sample = (strm -> data_pos++)[0];
strm_out[frames_iter] = sample;
strm_out[++frames_iter] = sample;
}
}else{
return (paComplete);
}
return (paContinue);
}
void* StartAudio(void* params){
SF_INFO info;
info.channels = M_STEREO;
info.samplerate = M_SAMPLE_RATE;
info.format = SF_FORMAT_RAW | SF_FORMAT_FLOAT;
SNDFILE* file = sf_open(u8"californication.raw", SFM_READ, &info);
stream_data.data = malloc(info.frames * info.channels * sizeof(float));
stream_data.data_pos = stream_data.data;
stream_data.frames = sf_readf_float(file, stream_data.data, info.frames);
sf_close(file);
if(Pa_Initialize() != paNoError)exit(0);
PaStream* pa_stream = NULLPTR_T;
Pa_OpenDefaultStream(&pa_stream, 0, STEREO, paFloat32, SAMPLE_RATE, paFramesPerBufferUnspecified,
&ProcessAudio, &stream_data);
Pa_StartStream(pa_stream);
Pa_Sleep(9001);
Pa_StopStream(pa_stream);
Pa_CloseStream(pa_stream);
sf_close(file);
free(stream_data.data);
Pa_Terminate();
return (NULLPTR_T);
}
int main(void){
static pthread_t thrd;
pthread_create(&thrd, NULLPTR_T, &M_StartAudio, NULLPTR_T);
return (false);
}