int err = MM_ERROR_SOUND_INTERNAL;
int period_time = PA_SIMPLE_PERIOD_TIME_FOR_MID_LATENCY_MSEC;
int samples_per_period = PA_SIMPLE_SAMPLES_PER_PERIOD_DEFAULT;
- int periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_DEFAULT;
int handle_mode = mode;
int sample_size = 0;
memset(&attr, '\0', sizeof(attr));
switch (handle_mode) {
- case HANDLE_MODE_INPUT:
- period_time = PA_SIMPLE_PERIOD_TIME_FOR_MID_LATENCY_MSEC;
- samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_DEFAULT;
- attr.prebuf = 0;
- attr.minreq = -1;
- attr.tlength = -1;
- attr.maxlength = -1;
- attr.fragsize = samples_per_period * pa_sample_size(ss);
-
- s = pa_simple_new_proplist(NULL, "MM_SOUND_PA_CLIENT", PA_STREAM_RECORD, NULL, "CAPTURE", ss, channel_map, &attr,
- proplist, &err);
- break;
-
- case HANDLE_MODE_INPUT_LOW_LATENCY:
- period_time = PA_SIMPLE_PERIOD_TIME_FOR_ULOW_LATENCY_MSEC;
- samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_FASTMODE;
- attr.prebuf = 0;
- attr.minreq = -1;
- attr.tlength = -1;
- attr.maxlength = -1;
- attr.fragsize = samples_per_period * pa_sample_size(ss);
-
- s = pa_simple_new_proplist(NULL, "MM_SOUND_PA_CLIENT", PA_STREAM_RECORD, NULL, "LOW LATENCY CAPTURE", ss, channel_map,
- &attr, proplist, &err);
- break;
-
- case HANDLE_MODE_INPUT_HIGH_LATENCY:
- period_time = PA_SIMPLE_PERIOD_TIME_FOR_HIGH_LATENCY_MSEC;
- samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_CAPTURE;
- attr.prebuf = 0;
- attr.minreq = -1;
- attr.tlength = -1;
- attr.maxlength = -1;
- attr.fragsize = samples_per_period * pa_sample_size(ss);
-
- s = pa_simple_new_proplist(NULL, "MM_SOUND_PA_CLIENT", PA_STREAM_RECORD, NULL, "HIGH LATENCY CAPTURE", ss, channel_map,
- &attr, proplist, &err);
- break;
-
case HANDLE_MODE_OUTPUT:
period_time = PA_SIMPLE_PERIOD_TIME_FOR_MID_LATENCY_MSEC;
samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_DEFAULT;
attr.prebuf = -1;
attr.minreq = -1;
attr.tlength = (ss->rate / 10) * pa_sample_size(ss) * ss->channels;
proplist, &err);
break;
- case HANDLE_MODE_OUTPUT_LOW_LATENCY:
- period_time = PA_SIMPLE_PERIOD_TIME_FOR_LOW_LATENCY_MSEC;
- samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_FASTMODE;
- attr.prebuf = (ss->rate / 100) * pa_sample_size(ss) * ss->channels;
- attr.minreq = -1;
- attr.tlength = (ss->rate / 10) * pa_sample_size(ss) * ss->channels;
- attr.maxlength = -1;
- attr.fragsize = 0;
- debug_msg("rate(%d), samplesize(%zu), ch(%d) format(%d)", ss->rate, pa_sample_size(ss), ss->channels, ss->format);
-
- debug_msg("prebuf(%d), minreq(%d), tlength(%d), maxlength(%d), fragsize(%d)", attr.prebuf, attr.minreq, attr.tlength,
- attr.maxlength, attr.fragsize);
-
- s = pa_simple_new_proplist(NULL, "MM_SOUND_PA_CLIENT", PA_STREAM_PLAYBACK, NULL, "LOW LATENCY PLAYBACK", ss,
- channel_map, &attr, proplist, &err);
- break;
-
- case HANDLE_MODE_OUTPUT_CLOCK:
- period_time = PA_SIMPLE_PERIOD_TIME_FOR_HIGH_LATENCY_MSEC;
- samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_PLAYBACK;
- attr.prebuf = -1;
- attr.minreq = -1;
- attr.tlength = (uint32_t) - 1;
- attr.maxlength = -1;
- attr.fragsize = 0;
-
- s = pa_simple_new_proplist(NULL, "MM_SOUND_PA_CLIENT", PA_STREAM_PLAYBACK, NULL, "HIGH LATENCY PLAYBACK", ss,
- channel_map, &attr, proplist, &err);
- break;
-
- case HANDLE_MODE_OUTPUT_VIDEO: /* low latency playback */
- period_time = PA_SIMPLE_PERIOD_TIME_FOR_LOW_LATENCY_MSEC;
- samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_VIDEO;
- attr.prebuf = 4 * (samples_per_period * pa_sample_size(ss));
- attr.minreq = samples_per_period * pa_sample_size(ss);
- attr.tlength = periods_per_buffer * samples_per_period * pa_sample_size(ss);
- attr.maxlength = -1;
- attr.fragsize = 0;
-
- s = pa_simple_new_proplist(NULL, "MM_SOUND_PA_CLIENT", PA_STREAM_PLAYBACK, NULL, "LOW LATENCY PLAYBACK", ss,
- channel_map, &attr, proplist, &err);
- break;
-
- case HANDLE_MODE_OUTPUT_AP_CALL:
-#if defined(_MMFW_I386_ALL_SIMULATOR)
- debug_msg("Does not support AP call mode at i386 simulator");
- s = NULL;
-#else
- period_time = PA_SIMPLE_PERIOD_TIME_FOR_VOIP_LATENCY_MSEC;
- samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_VOIP;
- attr.prebuf = -1;
- attr.minreq = pa_usec_to_bytes(20 * PA_USEC_PER_MSEC, ss);
- attr.tlength = pa_usec_to_bytes(100 * PA_USEC_PER_MSEC, ss);
- attr.maxlength = -1;
- attr.fragsize = 0;
-
- s = pa_simple_new_proplist(NULL, "MM_SOUND_PA_CLIENT", PA_STREAM_PLAYBACK, NULL, "VoIP PLAYBACK", ss, channel_map,
- &attr, proplist, &err);
-#endif
- break;
- case HANDLE_MODE_INPUT_AP_CALL:
-#if defined(_MMFW_I386_ALL_SIMULATOR)
- debug_msg("Does not support AP call mode at i386 simulator");
- s = NULL;
-#else
- period_time = PA_SIMPLE_PERIOD_TIME_FOR_VOIP_LATENCY_MSEC;
- samples_per_period = (ss->rate * period_time) / 1000;
- periods_per_buffer = PA_SIMPLE_PERIODS_PER_BUFFER_VOIP;
- attr.prebuf = 0;
- attr.minreq = -1;
- attr.tlength = -1;
- attr.maxlength = -1;
- attr.fragsize = samples_per_period * pa_sample_size(ss);
-
- s = pa_simple_new_proplist(NULL, "MM_SOUND_PA_CLIENT", PA_STREAM_RECORD, NULL, "VoIP CAPTURE", ss, channel_map, &attr,
- proplist, &err);
-#endif
- break;
default:
err = MM_ERROR_SOUND_INTERNAL;
goto fail;
switch (phandle->mode) {
case HANDLE_MODE_OUTPUT:
- case HANDLE_MODE_OUTPUT_CLOCK:
- case HANDLE_MODE_OUTPUT_LOW_LATENCY:
- case HANDLE_MODE_OUTPUT_AP_CALL:
- case HANDLE_MODE_OUTPUT_VIDEO:
if (0 > pa_simple_flush(phandle->s, &err)) {
err = MM_ERROR_SOUND_INTERNAL;
debug_msg("pa_simple_flush() failed with %s", pa_strerror(err));