small updates
This commit is contained in:
parent
2d9deaa1a4
commit
fc02c7008d
27
bugs
27
bugs
|
@ -1,27 +0,0 @@
|
||||||
Linux:
|
|
||||||
Updater:
|
|
||||||
After updater has extracted the file set the executable flag again for the TeaClient binary
|
|
||||||
|
|
||||||
|
|
||||||
Windows:
|
|
||||||
Updater:
|
|
||||||
Updater popups console which says that there are invalid arguments! Fix this!
|
|
||||||
Improve access to the update-install.exe (May request admin permissions)
|
|
||||||
|
|
||||||
|
|
||||||
General:
|
|
||||||
Audio replay with TS3 is a bit buggy!
|
|
||||||
|
|
||||||
|
|
||||||
Tasks designer:
|
|
||||||
TeaCup steam animated
|
|
||||||
Client redesign dark [+ Chat system]
|
|
||||||
Redesign loading animation (Web)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Notice:
|
|
||||||
electron-package-manager must be at 8.7.2 (Node 6 support)!
|
|
||||||
|
|
||||||
|
|
||||||
FIXME: Test the new voice resampler!
|
|
|
@ -115,7 +115,32 @@ export namespace _audio {
|
||||||
}
|
}
|
||||||
|
|
||||||
available_clients(): connection.voice.VoiceClient[] {
|
available_clients(): connection.voice.VoiceClient[] {
|
||||||
return this.handle.available_clients();
|
return this.handle.available_clients().map(e => Object.assign(e, {
|
||||||
|
support_latency_settings() { return true; },
|
||||||
|
reset_latency_settings: function() {
|
||||||
|
const stream = this.get_stream();
|
||||||
|
stream.set_buffer_latency(0.02);
|
||||||
|
stream.set_buffer_max_latency(0.2);
|
||||||
|
return this.latency_settings();
|
||||||
|
},
|
||||||
|
latency_settings: function (settings?: connection.voice.LatencySettings) : connection.voice.LatencySettings {
|
||||||
|
const stream = this.get_stream();
|
||||||
|
if(typeof settings !== "undefined") {
|
||||||
|
stream.set_buffer_latency(settings.min_buffer / 1000);
|
||||||
|
stream.set_buffer_max_latency(settings.max_buffer / 100);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
max_buffer: Math.floor(stream.get_buffer_max_latency() * 1000),
|
||||||
|
min_buffer: Math.floor(stream.get_buffer_latency() * 1000)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
support_flush() { return true; },
|
||||||
|
flush: function () {
|
||||||
|
const stream = this.get_stream();
|
||||||
|
stream.flush_buffer();
|
||||||
|
}
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
find_client(client_id: number) : connection.voice.VoiceClient | undefined {
|
find_client(client_id: number) : connection.voice.VoiceClient | undefined {
|
||||||
|
@ -132,13 +157,9 @@ export namespace _audio {
|
||||||
|
|
||||||
register_client(client_id: number): connection.voice.VoiceClient {
|
register_client(client_id: number): connection.voice.VoiceClient {
|
||||||
const client = this.handle.register_client(client_id);
|
const client = this.handle.register_client(client_id);
|
||||||
if(!client)
|
const c = this.find_client(client_id);
|
||||||
return client;
|
c.reset_latency_settings();
|
||||||
|
return c;
|
||||||
const stream = client.get_stream();
|
|
||||||
stream.set_buffer_latency(0.02);
|
|
||||||
stream.set_buffer_max_latency(0.2);
|
|
||||||
return client;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
decoding_supported(codec: number): boolean {
|
decoding_supported(codec: number): boolean {
|
||||||
|
|
|
@ -68,7 +68,6 @@ bool AudioInput::open_device(std::string& error, PaDeviceIndex index) {
|
||||||
parameters.device = this->_current_device_index;
|
parameters.device = this->_current_device_index;
|
||||||
parameters.sampleFormat = paFloat32;
|
parameters.sampleFormat = paFloat32;
|
||||||
parameters.suggestedLatency = this->_current_device->defaultLowOutputLatency;
|
parameters.suggestedLatency = this->_current_device->defaultLowOutputLatency;
|
||||||
|
|
||||||
auto err = Pa_OpenStream(
|
auto err = Pa_OpenStream(
|
||||||
&this->input_stream,
|
&this->input_stream,
|
||||||
¶meters,
|
¶meters,
|
||||||
|
@ -78,8 +77,10 @@ bool AudioInput::open_device(std::string& error, PaDeviceIndex index) {
|
||||||
paClipOff,
|
paClipOff,
|
||||||
&AudioInput::_audio_callback,
|
&AudioInput::_audio_callback,
|
||||||
this);
|
this);
|
||||||
|
|
||||||
if(err != paNoError) {
|
if(err != paNoError) {
|
||||||
error = "Pa_OpenStream returned " + to_string(err);
|
this->input_stream = nullptr;
|
||||||
|
error = to_string(err) + "/" + Pa_GetErrorText(err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,18 +112,22 @@ bool AudioInput::recording() {
|
||||||
void AudioInput::stop() {
|
void AudioInput::stop() {
|
||||||
lock_guard lock(this->input_stream_lock);
|
lock_guard lock(this->input_stream_lock);
|
||||||
if(this->input_stream) {
|
if(this->input_stream) {
|
||||||
Pa_AbortStream(this->input_stream);
|
if(Pa_IsStreamActive(this->input_stream))
|
||||||
|
Pa_StopStream(this->input_stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioInput::close_device() {
|
void AudioInput::close_device() {
|
||||||
lock_guard lock(this->input_stream_lock);
|
lock_guard lock(this->input_stream_lock);
|
||||||
if(this->input_stream) {
|
if(this->input_stream) {
|
||||||
/* TODO: Test for errors */
|
if(Pa_IsStreamActive(this->input_stream))
|
||||||
Pa_AbortStream(this->input_stream);
|
Pa_StopStream(this->input_stream);
|
||||||
Pa_CloseStream(this->input_stream);
|
|
||||||
|
|
||||||
|
auto error = Pa_CloseStream(this->input_stream);
|
||||||
|
if(error != paNoError)
|
||||||
|
log_error(category::audio, tr("Failed to close PA stream: {}"), error);
|
||||||
this->input_stream = nullptr;
|
this->input_stream = nullptr;
|
||||||
|
this_thread::sleep_for(chrono::seconds{1});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,7 @@ bool AudioOutput::open_device(std::string& error, PaDeviceIndex index) {
|
||||||
|
|
||||||
auto err = Pa_OpenStream(&output_stream, nullptr, &output_parameters, (double) this->_sample_rate, paFramesPerBufferUnspecified, paClipOff, &AudioOutput::_audio_callback, this);
|
auto err = Pa_OpenStream(&output_stream, nullptr, &output_parameters, (double) this->_sample_rate, paFramesPerBufferUnspecified, paClipOff, &AudioOutput::_audio_callback, this);
|
||||||
if(err != paNoError) {
|
if(err != paNoError) {
|
||||||
error = "Pa_OpenStream returned " + to_string(err);
|
error = to_string(err) + "/" + Pa_GetErrorText(err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,24 @@ const stream = handle.audio.playback.create_stream();
|
||||||
console.log("Own stream: %o", stream);
|
console.log("Own stream: %o", stream);
|
||||||
|
|
||||||
|
|
||||||
|
for(let i = 0; i < 12; i++) {
|
||||||
|
const recorder = handle.audio.record.create_recorder();
|
||||||
|
for(const device of handle.audio.available_devices()) {
|
||||||
|
if(!device.input_supported)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(device.name != "pulse")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
console.log("Found pulse at %o", device.device_index);
|
||||||
|
recorder.set_device(device.device_index, () => {});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
recorder.start(flag => console.log("X: " + flag));
|
||||||
|
const consumer = recorder.create_consumer();
|
||||||
|
consumer.create_filter_threshold(2);
|
||||||
|
}
|
||||||
|
|
||||||
/* -1 => default device */
|
/* -1 => default device */
|
||||||
const recorder = handle.audio.record.create_recorder();
|
const recorder = handle.audio.record.create_recorder();
|
||||||
console.log("Have device: %o", recorder);
|
console.log("Have device: %o", recorder);
|
||||||
|
@ -38,8 +56,10 @@ if(recorder.get_device() == -1) {
|
||||||
for(const device of handle.audio.available_devices()) {
|
for(const device of handle.audio.available_devices()) {
|
||||||
if(!device.input_supported)
|
if(!device.input_supported)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(device.name != "pulse")
|
if(device.name != "pulse")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
console.log("Found pulse at %o", device.device_index);
|
console.log("Found pulse at %o", device.device_index);
|
||||||
recorder.set_device(device.device_index, () => {});
|
recorder.set_device(device.device_index, () => {});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue