void AudioSoundIo::setupWidget::reconnectSoundIo() { const QString& configBackend = m_isFirst ? ConfigManager::inst()->value( "audiosoundio", "backend" ) : m_backendModel.currentText(); m_isFirst = false; soundio_disconnect(m_soundio); int err; int backend_index = m_backendModel.findText(configBackend); if (backend_index < 0) { if ((err = soundio_connect(m_soundio))) { fprintf(stderr, "soundio: unable to connect backend: %s\n", soundio_strerror(err)); return; } backend_index = m_backendModel.findText(soundio_backend_name(m_soundio->current_backend)); assert(backend_index >= 0); } else { SoundIoBackend backend = soundio_get_backend(m_soundio, backend_index); if ((err = soundio_connect_backend(m_soundio, backend))) { fprintf(stderr, "soundio: unable to connect %s backend: %s\n", soundio_backend_name(backend), soundio_strerror(err)); if ((err = soundio_connect(m_soundio))) { fprintf(stderr, "soundio: unable to connect backend: %s\n", soundio_strerror(err)); return; } backend_index = m_backendModel.findText(soundio_backend_name(m_soundio->current_backend)); assert(backend_index >= 0); } } m_backendModel.setValue(backend_index); soundio_flush_events(m_soundio); const QString& configDeviceId = ConfigManager::inst()->value( "audiosoundio", "out_device_id" ); const QString& configDeviceRaw = ConfigManager::inst()->value( "audiosoundio", "out_device_raw" ); int deviceIndex = m_defaultOutIndex; bool wantRaw = (configDeviceRaw == "yes"); for (int i = 0; i < m_deviceList.length(); i += 1) { const DeviceId *deviceId = &m_deviceList.at(i); if (deviceId->id == configDeviceId && deviceId->is_raw == wantRaw) { deviceIndex = i; break; } } m_deviceModel.setValue(deviceIndex); }
static void write_callback(struct SoundIoOutStream *outstream, int frame_count_min, int frame_count_max) { UNUSED(frame_count_min); double float_sample_rate = outstream->sample_rate; double seconds_per_frame = 1.0 / float_sample_rate; struct SoundIoChannelArea *areas; int err; int frames_left = frame_count_max; for (;;) { int frame_count = frames_left; if ((err = soundio_outstream_begin_write(outstream, &areas, &frame_count))) { fprintf(stderr, "unrecoverable stream error: %s\n", soundio_strerror(err)); exit(1); } if (!frame_count) break; const struct SoundIoChannelLayout *layout = &outstream->layout; double pitch = 440.0; double radians_per_second = pitch * 2.0 * PI; for (int frame = 0; frame < frame_count; frame += 1) { double sample = (float) sin((seconds_offset + frame * seconds_per_frame) * radians_per_second); for (int channel = 0; channel < layout->channel_count; channel += 1) { write_sample(areas[channel].ptr, sample); areas[channel].ptr += areas[channel].step; } } seconds_offset += seconds_per_frame * frame_count; if ((err = soundio_outstream_end_write(outstream))) { if (err == SoundIoErrorUnderflow) return; fprintf(stderr, "unrecoverable stream error: %s\n", soundio_strerror(err)); exit(1); } frames_left -= frame_count; if (frames_left <= 0) break; } soundio_outstream_pause(outstream, want_pause); }
void SoundIoPlayer::unpause() { bug_fun(); if(auto err = soundio_outstream_pause(ctx->out, false)) logit("E: pause: " << soundio_strerror(err)); else { paused = false; } }
bool SKAudio::start() { if(auto err = soundio_outstream_start(out)) { logit("E: unable to start device: " << soundio_strerror(err)); return false; } return true; }
void SoundIoPlayer::pause() { bug_fun(); soundio_flush_events(ctx->sio); if(auto err = soundio_outstream_pause(ctx->out, true)) logit("E: pause: " << soundio_strerror(err)); else { paused = true; } }
static void read_callback(struct SoundIoInStream *instream, int frame_count_min, int frame_count_max) { struct SoundIoChannelArea *areas; float float_sample_rate = instream->sample_rate; float seconds_per_frame = 1.0f / float_sample_rate; int err; if (!caused_underflow && seconds_offset >= 3.0f) { fprintf(stderr, "OK sleeping...\n"); caused_underflow = true; sleep(3); } if (seconds_offset >= seconds_end) { soundio_wakeup(soundio); return; } int frames_left = frame_count_max; for (;;) { int frame_count = frames_left; if ((err = soundio_instream_begin_read(instream, &areas, &frame_count))) panic("begin read error: %s", soundio_strerror(err)); if (!frame_count) break; seconds_offset += seconds_per_frame * frame_count; if ((err = soundio_instream_end_read(instream))) panic("end read error: %s", soundio_strerror(err)); frames_left -= frame_count; if (frames_left <= 0) break; } fprintf(stderr, "OK received %d frames\n", frame_count_max); }
void AudioSoundIo::startProcessing() { m_outBufFrameIndex = 0; m_outBufFramesTotal = 0; m_outBufSize = mixer()->framesPerPeriod(); m_outBuf = new surroundSampleFrame[m_outBufSize]; int err; if ((err = soundio_outstream_start(m_outstream))) { fprintf(stderr, "soundio unable to start stream: %s\n", soundio_strerror(err)); } }
bool SKAudio::open() { if(auto err = soundio_outstream_open(out)) { logit("E: unable to open device: " << soundio_strerror(err)); return false; } if(out->layout_error) { logit("E: unable to set channel layout: " << out->layout_error); return false; } return true; }
AudioSoundIo::AudioSoundIo( bool & outSuccessful, Mixer * _mixer ) : AudioDevice( tLimit<ch_cnt_t>( ConfigManager::inst()->value( "audiosoundio", "channels" ).toInt(), DEFAULT_CHANNELS, SURROUND_CHANNELS ), _mixer ) { outSuccessful = false; m_soundio = NULL; m_outstream = NULL; m_disconnectErr = 0; m_outBufFrameIndex = 0; m_outBufFramesTotal = 0; m_soundio = soundio_create(); if (!m_soundio) { fprintf(stderr, "Unable to initialize soundio: out of memory\n"); return; } m_soundio->app_name = "LMMS"; m_soundio->userdata = this; m_soundio->on_backend_disconnect = staticOnBackendDisconnect; const QString& configBackend = ConfigManager::inst()->value( "audiosoundio", "backend" ); const QString& configDeviceId = ConfigManager::inst()->value( "audiosoundio", "out_device_id" ); const QString& configDeviceRaw = ConfigManager::inst()->value( "audiosoundio", "out_device_raw" ); int err; int outDeviceCount = 0; int backendCount = soundio_backend_count(m_soundio); for (int i = 0; i < backendCount; i += 1) { SoundIoBackend backend = soundio_get_backend(m_soundio, i); if (configBackend == soundio_backend_name(backend)) { if ((err = soundio_connect_backend(m_soundio, backend))) { // error occurred, leave outDeviceCount 0 } else { soundio_flush_events(m_soundio); if (m_disconnectErr) { fprintf(stderr, "Unable to initialize soundio: %s\n", soundio_strerror(m_disconnectErr)); return; } outDeviceCount = soundio_output_device_count(m_soundio); } break; } } if (outDeviceCount <= 0) { // try connecting to the default backend if ((err = soundio_connect(m_soundio))) { fprintf(stderr, "Unable to initialize soundio: %s\n", soundio_strerror(err)); return; } soundio_flush_events(m_soundio); if (m_disconnectErr) { fprintf(stderr, "Unable to initialize soundio: %s\n", soundio_strerror(m_disconnectErr)); return; } outDeviceCount = soundio_output_device_count(m_soundio); if (outDeviceCount <= 0) { fprintf(stderr, "Unable to initialize soundio: no devices found\n"); return; } } int selected_device_index = soundio_default_output_device_index(m_soundio); bool wantRaw = (configDeviceRaw == "yes"); for (int i = 0; i < outDeviceCount; i += 1) { SoundIoDevice *device = soundio_get_output_device(m_soundio, i); bool isThisOne = (configDeviceId == device->id && wantRaw == device->is_raw); soundio_device_unref(device); if (isThisOne) { selected_device_index = i; break; } } SoundIoDevice *device = soundio_get_output_device(m_soundio, selected_device_index); m_outstream = soundio_outstream_create(device); soundio_device_unref(device); if (!m_outstream) { fprintf(stderr, "Unable to initialize soundio: out of memory\n"); return; } int currentSampleRate = sampleRate(); int closestSupportedSampleRate = -1; for (int i = 0; i < device->sample_rate_count; i += 1) { SoundIoSampleRateRange *range = &device->sample_rates[i]; if (range->min <= currentSampleRate && currentSampleRate <= range->max) { closestSupportedSampleRate = currentSampleRate; break; } if (closestSupportedSampleRate == -1 || abs(range->max - currentSampleRate) < abs(closestSupportedSampleRate - currentSampleRate)) { closestSupportedSampleRate = range->max; } } if (closestSupportedSampleRate != currentSampleRate) { setSampleRate(closestSupportedSampleRate); currentSampleRate = closestSupportedSampleRate; } m_outstream->name = "LMMS"; m_outstream->software_latency = (double)mixer()->framesPerPeriod() / (double)currentSampleRate; m_outstream->userdata = this; m_outstream->write_callback = staticWriteCallback; m_outstream->error_callback = staticErrorCallback; m_outstream->underflow_callback = staticUnderflowCallback; m_outstream->sample_rate = currentSampleRate; m_outstream->layout = *soundio_channel_layout_get_default(channels()); m_outstream->format = SoundIoFormatFloat32NE; if ((err = soundio_outstream_open(m_outstream))) { fprintf(stderr, "Unable to initialize soundio: %s\n", soundio_strerror(err)); return; } fprintf(stderr, "Output device: '%s' backend: '%s'\n", device->name, soundio_backend_name(m_soundio->current_backend)); outSuccessful = true; }
void SoundIoPlayer::write_callback(SoundIoOutStream* out, int frames_min, int frames_max) { // bug_fun(); // bug_var(frame_count_min); // bug_var(frame_count_max); // bug_var(out->userdata); // bug_var(out); auto& player = *reinterpret_cast<SoundIoPlayer*>(out->userdata); auto& audio = player.audio; channelnum_vec ons; // local versions to avoid (postpone) write lock // mt_clk::time_point cb_time; { audiogang::write_lock lock(audio.mtx); // 10th second auto samples = audio.rate / 10; player.pos = std::max(player.pos, player.reg.b); auto end = std::min(player.pos + samples, player.reg.e); wxThreadEvent evt(wxEVT_THREAD, ID_PlayerPos); evt.SetExtraLong(player.pos); player.frame.GetEventHandler()->QueueEvent(evt.Clone()); // reg = player.reg; // pos = player.pos; // cb_time = player.cb_time; // bug_var(player.pos); // bug_var(end); // bug_var(reg.b); // bug_var(reg.e); // copy valid channels that are on ons.reserve(audio.channels.size()); for(auto const& channel: audio.channels) if(channel.idx < audio.buffers.size()) ons.push_back(channel.idx); auto ons_size = ons.size(); // if(!ons_size) // return; SoundIoChannelArea* areas; int frames_left = frames_max; auto d = std::chrono::milliseconds(100); for(;;) { int frame_count = frames_left; int err; if((err = soundio_outstream_begin_write(out, &areas, &frame_count))) { logit("E: Unrecoverable Sound System Error: " << soundio_strerror(err)); // SoundIoPlayer::ctx_lock_guard lock(player.ctx_mtx); player.shutdown(); return; } if(!frame_count) break; SoundIoChannelLayout const* layout = &out->layout; for(int frame = 0; frame < frame_count && player.pos < end; ++frame, ++player.pos) { for(int c = 0; c < layout->channel_count; ++c) { auto sample = c < ons_size? audio.buffers[ons[c]][player.pos]: 0.0; player.write_sample(areas[c].ptr, sample); areas[c].ptr += areas[c].step; } } if(player.pos < player.reg.b) player.pos = player.reg.b; if(player.pos >= player.reg.e) { player.pos = player.reg.e; if(player.loop) player.pos = player.reg.b; else { // SoundIoPlayer::ctx_lock_guard lock(player.ctx_mtx); player.shutdown(); // player.ctx.reset(); return; } } // time_t timer = std::time(0); // bug("time: " << std::ctime(&timer)); // if(mt_clk::now() > cb_time) // { // player.play_event(ID_PlayerPos); // cb_time += d; // } if((err = soundio_outstream_end_write(out))) { if(err == SoundIoErrorUnderflow) return; logit("E: Unrecoverable Sound System Error: " << soundio_strerror(err)); // SoundIoPlayer::ctx_lock_guard lock(player.ctx_mtx); player.shutdown(); return; } frames_left -= frame_count; if(frames_left <= 0) break; } } // read lock // update: // audiogang::write_lock lock(audio.mtx); // player.pos = pos; // player.cb_time = cb_time; }
void AudioSoundIo::errorCallback(int err) { fprintf(stderr, "soundio: error streaming: %s\n", soundio_strerror(err)); }
int main(int argc, char **argv) { char *exe = argv[0]; enum SoundIoBackend backend = SoundIoBackendNone; bool is_raw = false; char *device_id = NULL; for (int i = 1; i < argc; i += 1) { char *arg = argv[i]; if (arg[0] == '-' && arg[1] == '-') { if (strcmp(arg, "--raw") == 0) { is_raw = true; } else if (++i >= argc) { return usage(exe); } else if (strcmp(arg, "--device") == 0) { device_id = argv[i]; } else if (strcmp(arg, "--backend") == 0) { if (strcmp("dummy", argv[i]) == 0) { backend = SoundIoBackendDummy; } else if (strcmp("alsa", argv[i]) == 0) { backend = SoundIoBackendAlsa; } else if (strcmp("pulseaudio", argv[i]) == 0) { backend = SoundIoBackendPulseAudio; } else if (strcmp("jack", argv[i]) == 0) { backend = SoundIoBackendJack; } else if (strcmp("coreaudio", argv[i]) == 0) { backend = SoundIoBackendCoreAudio; } else if (strcmp("wasapi", argv[i]) == 0) { backend = SoundIoBackendWasapi; } else { fprintf(stderr, "Invalid backend: %s\n", argv[i]); return 1; } } else { return usage(exe); } } else { return usage(exe); } } fprintf(stderr, "Records for 3 seconds, sleeps for 3 seconds, then you should see at least\n" "one buffer overflow message, then records for 3 seconds.\n" "PulseAudio is not expected to pass this test.\n" "CoreAudio is not expected to pass this test.\n" "WASAPI is not expected to pass this test.\n"); if (!(soundio = soundio_create())) panic("out of memory"); int err = (backend == SoundIoBackendNone) ? soundio_connect(soundio) : soundio_connect_backend(soundio, backend); if (err) panic("error connecting: %s", soundio_strerror(err)); soundio_flush_events(soundio); int selected_device_index = -1; if (device_id) { int device_count = soundio_input_device_count(soundio); for (int i = 0; i < device_count; i += 1) { struct SoundIoDevice *device = soundio_get_input_device(soundio, i); if (strcmp(device->id, device_id) == 0 && device->is_raw == is_raw) { selected_device_index = i; break; } } } else { selected_device_index = soundio_default_input_device_index(soundio); } if (selected_device_index < 0) { fprintf(stderr, "input device not found\n"); return 1; } struct SoundIoDevice *device = soundio_get_input_device(soundio, selected_device_index); if (!device) { fprintf(stderr, "out of memory\n"); return 1; } fprintf(stderr, "Input device: %s\n", device->name); enum SoundIoFormat *fmt; for (fmt = prioritized_formats; *fmt != SoundIoFormatInvalid; fmt += 1) { if (soundio_device_supports_format(device, *fmt)) break; } if (*fmt == SoundIoFormatInvalid) panic("incompatible sample format"); struct SoundIoInStream *instream = soundio_instream_create(device); instream->format = *fmt; instream->read_callback = read_callback; instream->overflow_callback = overflow_callback; if ((err = soundio_instream_open(instream))) panic("unable to open device: %s", soundio_strerror(err)); fprintf(stderr, "OK format: %s\n", soundio_format_string(instream->format)); if ((err = soundio_instream_start(instream))) panic("unable to start device: %s", soundio_strerror(err)); while (seconds_offset < seconds_end) soundio_wait_events(soundio); soundio_instream_destroy(instream); soundio_device_unref(device); soundio_destroy(soundio); if (overflow_count > 0) { fprintf(stderr, "OK test passed with %d overflow callbacks\n", overflow_count); return 0; } else { fprintf(stderr, "FAIL no overflow callbacks received\n"); return 1; } }
//========AUDIO CALLBACK============= static void write_callback(struct SoundIoOutStream *outstream, int frame_count_min, int frame_count_max) { int frames_left = FRAME_COUNT;//frame_count_max; //int channels=outstream->layout.channel_count; //printf("min:%i max:%i\n",frame_count_min,frame_count_max); int err; struct SoundIoChannelArea *areas; while(frames_left>0) { int frame_count = frames_left; if((err = soundio_outstream_begin_write(outstream,&areas,&frame_count))) { printf("soundio_outstream_begin_write ERROR: %s",soundio_strerror(err)); exit(1); } if(!frame_count) break; for(int frame = 0; frame < frame_count; frame +=1) { int value1=0; int value2=0; int n=0; for(int i=0;i<MAX_POLYPHONY;i++) { if(playingsounds[i].sound!=NULL) { n++; value1 += playingsounds[i].sound->buffer[playingsounds[i].pos]*playingsounds[i].volume; value2 += playingsounds[i].sound->buffer[playingsounds[i].pos+1]*playingsounds[i].volume; playingsounds[i].pos+=2; if(playingsounds[i].pos>=playingsounds[i].sound->size) playingsounds[i].sound=NULL; } } short *ptr1=(short*)(areas[0].ptr + areas[0].step*frame); short *ptr2=(short*)(areas[1].ptr + areas[1].step*frame); if(n>0) { //if (n>10) printf("Poly:%i\n",n); *ptr1=(short)(value1/127); *ptr2=(short)(value2/127); } else { *ptr1=0; *ptr2=0; } } if ((err = soundio_outstream_end_write(outstream))) { printf("soundio_outstream_end_write ERROR: %s",soundio_strerror(err)); exit(1); } frames_left -= frame_count; } }
int main(int argc, char **argv) { char *exe = argv[0]; enum SoundIoBackend backend = SoundIoBackendNone; char *device_id = NULL; bool raw = false; char *stream_name = NULL; double latency = 0.0; int sample_rate = 0; for (int i = 1; i < argc; i += 1) { char *arg = argv[i]; if (arg[0] == '-' && arg[1] == '-') { if (strcmp(arg, "--raw") == 0) { raw = true; } else { i += 1; if (i >= argc) { return usage(exe); } else if (strcmp(arg, "--backend") == 0) { if (strcmp(argv[i], "dummy") == 0) { backend = SoundIoBackendDummy; } else if (strcmp(argv[i], "alsa") == 0) { backend = SoundIoBackendAlsa; } else if (strcmp(argv[i], "pulseaudio") == 0) { backend = SoundIoBackendPulseAudio; } else if (strcmp(argv[i], "jack") == 0) { backend = SoundIoBackendJack; } else if (strcmp(argv[i], "coreaudio") == 0) { backend = SoundIoBackendCoreAudio; } else if (strcmp(argv[i], "wasapi") == 0) { backend = SoundIoBackendWasapi; } else { fprintf(stderr, "Invalid backend: %s\n", argv[i]); return 1; } } else if (strcmp(arg, "--device") == 0) { device_id = argv[i]; } else if (strcmp(arg, "--name") == 0) { stream_name = argv[i]; } else if (strcmp(arg, "--latency") == 0) { latency = atof(argv[i]); } else if (strcmp(arg, "--sample-rate") == 0) { sample_rate = atoi(argv[i]); } else { return usage(exe); } } } else { return usage(exe); } } struct SoundIo *soundio = soundio_create(); if (!soundio) { fprintf(stderr, "out of memory\n"); return 1; } int err = (backend == SoundIoBackendNone) ? soundio_connect(soundio) : soundio_connect_backend(soundio, backend); if (err) { fprintf(stderr, "Unable to connect to backend: %s\n", soundio_strerror(err)); return 1; } fprintf(stderr, "Backend: %s\n", soundio_backend_name(soundio->current_backend)); soundio_flush_events(soundio); int selected_device_index = -1; if (device_id) { int device_count = soundio_output_device_count(soundio); for (int i = 0; i < device_count; i += 1) { struct SoundIoDevice *device = soundio_get_output_device(soundio, i); bool select_this_one = strcmp(device->id, device_id) == 0 && device->is_raw == raw; soundio_device_unref(device); if (select_this_one) { selected_device_index = i; break; } } } else { selected_device_index = soundio_default_output_device_index(soundio); } if (selected_device_index < 0) { fprintf(stderr, "Output device not found\n"); return 1; } struct SoundIoDevice *device = soundio_get_output_device(soundio, selected_device_index); if (!device) { fprintf(stderr, "out of memory\n"); return 1; } fprintf(stderr, "Output device: %s\n", device->name); if (device->probe_error) { fprintf(stderr, "Cannot probe device: %s\n", soundio_strerror(device->probe_error)); return 1; } struct SoundIoOutStream *outstream = soundio_outstream_create(device); if (!outstream) { fprintf(stderr, "out of memory\n"); return 1; } outstream->write_callback = write_callback; outstream->underflow_callback = underflow_callback; outstream->name = stream_name; outstream->software_latency = latency; outstream->sample_rate = sample_rate; if (soundio_device_supports_format(device, SoundIoFormatFloat32NE)) { outstream->format = SoundIoFormatFloat32NE; write_sample = write_sample_float32ne; } else if (soundio_device_supports_format(device, SoundIoFormatFloat64NE)) { outstream->format = SoundIoFormatFloat64NE; write_sample = write_sample_float64ne; } else if (soundio_device_supports_format(device, SoundIoFormatS32NE)) { outstream->format = SoundIoFormatS32NE; write_sample = write_sample_s32ne; } else if (soundio_device_supports_format(device, SoundIoFormatS16NE)) { outstream->format = SoundIoFormatS16NE; write_sample = write_sample_s16ne; } else { fprintf(stderr, "No suitable device format available.\n"); return 1; } if ((err = soundio_outstream_open(outstream))) { fprintf(stderr, "unable to open device: %s", soundio_strerror(err)); return 1; } fprintf(stderr, "Software latency: %f\n", outstream->software_latency); fprintf(stderr, "'p\\n' - pause\n" "'u\\n' - unpause\n" "'P\\n' - pause from within callback\n" "'c\\n' - clear buffer\n" "'q\\n' - quit\n"); if (outstream->layout_error) fprintf(stderr, "unable to set channel layout: %s\n", soundio_strerror(outstream->layout_error)); if ((err = soundio_outstream_start(outstream))) { fprintf(stderr, "unable to start device: %s\n", soundio_strerror(err)); return 1; } for (;;) { soundio_flush_events(soundio); int c = getc(stdin); if (c == 'p') { fprintf(stderr, "pausing result: %s\n", soundio_strerror(soundio_outstream_pause(outstream, true))); } else if (c == 'P') { want_pause = true; } else if (c == 'u') { want_pause = false; fprintf(stderr, "unpausing result: %s\n", soundio_strerror(soundio_outstream_pause(outstream, false))); } else if (c == 'c') { fprintf(stderr, "clear buffer result: %s\n", soundio_strerror(soundio_outstream_clear_buffer(outstream))); } else if (c == 'q') { break; } else if (c == '\r' || c == '\n') { // ignore } else { fprintf(stderr, "Unrecognized command: %c\n", c); } } soundio_outstream_destroy(outstream); soundio_device_unref(device); soundio_destroy(soundio); return 0; }
static void default_backend_disconnect_cb(struct SoundIo *, int err) { soundio_panic("libsoundio: backend disconnected: %s", soundio_strerror(err)); }
bool SKAudio::initialize(SoundIoBackend backend, str& device_id) { if(!(sio = soundio_create())) { logit("E: SoundIo out of memory: "); return false; } if(auto err = (backend == SoundIoBackendNone) ? soundio_connect(sio) : soundio_connect_backend(sio, backend)) { logit("E: SoundIo can't connect to backend: " << soundio_strerror(err)); return false; } soundio_flush_events(sio); auto selected_device_index = -1; if(!device_id.empty()) { auto device_count = soundio_output_device_count(sio); for(decltype(device_count) i = 0; i < device_count; ++i) { SoundIoDevice* device = soundio_get_output_device(sio, i); if(!std::strcmp(device->id, device_id.c_str())) { selected_device_index = i; break; } } } if(selected_device_index == -1) selected_device_index = soundio_default_output_device_index(sio); if(selected_device_index == -1) { logit("E: SoundIo can't find device: "); return false; } if(!(dev = soundio_get_output_device(sio, selected_device_index))) { logit("E: SoundIo out of memory: "); return false; } device_id = dev->id; if(dev->probe_error) { logit("E: Cannot probe device: " << soundio_strerror(dev->probe_error)); return false; } if(!(out = soundio_outstream_create(dev))) { logit("E: SoundIo out of memory: "); return false; } return true; }
static void default_instream_error_callback(struct SoundIoInStream *is, int err) { soundio_panic("libsoundio: %s", soundio_strerror(err)); }
static void default_outstream_error_callback(struct SoundIoOutStream *os, int err) { soundio_panic("libsoundio: %s", soundio_strerror(err)); }