static int openSoundDevice (void) { if (!pcm) { if (!(pcm = openPcmDevice(LOG_WARNING, opt_pcmDevice))) return 0; speechParameters.nChannels = setPcmChannelCount(pcm, 1); speechParameters.nSampleFreq = setPcmSampleRate(pcm, 22050); { typedef struct { PcmAmplitudeFormat internal; int external; } FormatEntry; static const FormatEntry formatTable[] = { {PCM_FMT_S16L , 16}, {PCM_FMT_U8 , 8}, {PCM_FMT_UNKNOWN, 0} }; const FormatEntry *format = formatTable; while (format->internal != PCM_FMT_UNKNOWN) { if (setPcmAmplitudeFormat(pcm, format->internal) == format->internal) break; ++format; } if (format->internal == PCM_FMT_UNKNOWN) { logMessage(LOG_WARNING, "No supported sound format."); closePcmDevice(pcm); pcm = NULL; return 0; } speechParameters.nBits = format->external; } logMessage(LOG_DEBUG, "Mikropuhe audio configuration: channels=%d rate=%d bits=%d", speechParameters.nChannels, speechParameters.nSampleFreq, speechParameters.nBits); } return 1; }
static NoteDevice * pcmConstruct (int errorLevel) { NoteDevice *device; if ((device = malloc(sizeof(*device)))) { if ((device->pcm = openPcmDevice(errorLevel, opt_pcmDevice))) { device->blockSize = getPcmBlockSize(device->pcm); device->sampleRate = getPcmSampleRate(device->pcm); device->channelCount = getPcmChannelCount(device->pcm); device->amplitudeFormat = getPcmAmplitudeFormat(device->pcm); device->blockUsed = 0; if ((device->blockAddress = malloc(device->blockSize))) { logMessage(LOG_DEBUG, "PCM enabled: blk=%d rate=%d chan=%d fmt=%d", device->blockSize, device->sampleRate, device->channelCount, device->amplitudeFormat); return device; } else { logMallocError(); } closePcmDevice(device->pcm); } free(device); } else { logMallocError(); } logMessage(LOG_DEBUG, "PCM not available"); return NULL; }