Загрузка данных
/* XXX Now we support either only input of ouput streams, bot not both at the same time */
PaError Pa_OpenStream(PaStream** stream,
const PaStreamParameters *inputParameters,
const PaStreamParameters *outputParameters,
double sampleRate, unsigned int framesPerBuffer,
PaStreamFlags streamFlags, PaStreamCallback *streamCallback,
void *userData)
{
struct pa_strm *pa_stream;
struct audio_dev *audio_dev;
int prev_rate, ret;
int rate = (int) sampleRate;
if(stream == NULL || streamCallback == NULL)
{
printf("Pa_OpenStream: failed stream=%p streamCallback=%p\n",stream,streamCallback);
return paInternalError;
}
printf("stream %p input %p output %p rate %f"
" framesPerBuffer %lu flags %lu callback %p user_data %p\n",
stream, inputParameters, outputParameters, sampleRate,
framesPerBuffer, streamFlags, streamCallback, userData);
pa_stream = pa_str_alloc();
if (!pa_stream) {
printf("Cannot allocate pa_strm\n");
return paInternalError;
}
if (outputParameters != NULL) {
pa_stream->active = 1;
pa_stream->number_of_chan = outputParameters->channelCount;
pa_stream->devid = outputParameters->device;
pa_stream->sample_format = outputParameters->sampleFormat;
} else {
pa_stream->active = 0;
pa_stream->number_of_chan = inputParameters->channelCount;
pa_stream->devid = inputParameters->device;
pa_stream->sample_format = inputParameters->sampleFormat;
}
pa_stream->callback = streamCallback;
pa_stream->user_data = userData;
pthread_cond_init(&pa_stream->pa_cond, 0);
ret = pa_mutex_init(pa_stream);
if(ret != 0) {
return paInternalError;
}
*stream = pa_stream;
audio_dev = audio_dev_get_by_idx(pa_stream->devid);
if (audio_dev == NULL)
return paInvalidDevice;
if(!audio_dev->ad_ops || !audio_dev->ad_ops->ad_ops_ioctl || !audio_dev->ad_ops->ad_ops_start)
{
printf("Pa_OpenStream failed: audio_dev=%p\n",audio_dev);
return paInvalidDevice;
}
prev_rate = audio_dev->ad_ops->ad_ops_ioctl(audio_dev,
ADIOCTL_GET_RATE, NULL);
if ((prev_rate != -1) && (prev_rate != rate)) {
audio_dev->ad_ops->ad_ops_ioctl(audio_dev, ADIOCTL_SET_RATE, &rate);
}
pa_stream->rate = rate;
audio_dev->dir == AUDIO_DEV_OUTPUT
? audio_dev_open_out_stream(audio_dev, pa_stream)
: audio_dev_open_in_stream(audio_dev, pa_stream);
pa_stream->state = PA_STREAM_RUNNING;
pthread_attr_init(&pa_stream->threadAttr);
pthread_attr_setstacksize(&pa_stream->threadAttr, 2048);
ret = pthread_create(&pa_stream->pa_thread, &pa_stream->threadAttr, outputParameters ? pa_thread_hnd_out : pa_thread_hnd_in, pa_stream);
if (ret != 0) {
printf("pthread_create failed ret=%d\n",ret);
ret = paInternalError;
}
else
ret = paNoError;
pthread_setschedprio(pa_stream->pa_thread, PA_THREAD_PRIORITY);
if(outputParameters)
pthread_setname_np(pa_stream->pa_thread, "pa_thread_hnd_out");
else
pthread_setname_np(pa_stream->pa_thread, "pa_thread_hnd_in");
return ret;
}
static void pa_thread_wakeup(struct pa_strm *strm,
enum pa_state state) {
if(!strm)
return;
strm->state = state;
strm->active = 1;
pa_cond_signal(strm);
}
PaError Pa_IsStreamStopped(PaStream *stream) {
struct pa_strm *strm = (struct pa_strm *)stream;
return strm->state == PA_STREAM_STOPPED;
}
PaError Pa_CloseStream(PaStream *stream) {
struct pa_strm *pa_stream = stream;
if (!Pa_IsStreamStopped(stream)) {
pa_thread_wakeup(pa_stream, PA_STREAM_CLOSED);
/* Wait until thread finished and only after that free the stream */
pthread_join(pa_stream->pa_thread, NULL);
}
pthread_cond_destroy(&pa_stream->pa_cond);
pa_mutex_destroy(pa_stream);
pthread_attr_destroy(&pa_stream->threadAttr);
pa_str_free(pa_stream);
return paNoError;
}
PaError Pa_StartStream(PaStream *stream) {
pa_thread_wakeup((struct pa_strm *) stream, PA_STREAM_RUNNING);
return paNoError;
}
PaError Pa_StopStream(PaStream *stream) {
struct pa_strm *strm;
struct audio_dev *audio_dev;
if(stream == NULL)
return paInternalError;
strm = (struct pa_strm *)stream;
audio_dev = audio_dev_get_by_idx(strm->devid);
if(!audio_dev || !audio_dev->ad_ops)
return paInternalError;
if (audio_dev->ad_ops->ad_ops_pause)
audio_dev->ad_ops->ad_ops_pause(audio_dev);
else
printf("Stream pause not supported!\n");
if (audio_dev->ad_ops->ad_ops_stop)
audio_dev->ad_ops->ad_ops_stop(audio_dev);
else
printf("Stream stop not supported!\n");
pa_thread_wakeup(strm, PA_STREAM_STOPPED);
/* Wait until thread finished and only after that free the stream */
pthread_join(strm->pa_thread, NULL);
return paNoError;
}
void Pa_Sleep(int msec) {
usleep(msec * 1000);
}
это весь код