Porównaj commity

...

7 Commity

Autor SHA1 Wiadomość Data
Ahmet Inan 728c9df890 v2.14 2024-11-25 09:36:01 +01:00
Ahmet Inan c93dff432e use fixed point by default
simply too many devices have a broken floating point implementation
2024-11-24 07:43:38 +01:00
Ahmet Inan 1fbec49583 oops 2024-11-23 14:24:19 +01:00
Ahmet Inan 28ebde8e93 support full resolution saving of PD290 images
the scope image of PD290 is still cropped to 640 pixels but aspect
ratio is now correct
2024-11-22 16:34:25 +01:00
Ahmet Inan 2c3c6b1293 added experimental PD290 support
full 616 lines are supported but width is 640 pixels instead of 800 to
avoid breaking other modes. that means the aspect ratio is wrong for
PD290 at the moment.
2024-11-22 10:45:24 +01:00
Ahmet Inan 2d74f33bb6 integrated Ukrainian translation 2024-11-19 18:02:41 +01:00
Помаранча 07e2f59389 Added Ukrainian language 2024-11-19 17:59:23 +01:00
6 zmienionych plików z 93 dodań i 8 usunięć

Wyświetl plik

@ -10,8 +10,8 @@ android {
applicationId "xdsopl.robot36"
minSdk 24
targetSdk 34
versionCode 63
versionName "2.13"
versionCode 64
versionName "2.14"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

Wyświetl plik

@ -54,7 +54,7 @@ public class Decoder {
this.scopeBuffer = scopeBuffer;
this.imageBuffer = imageBuffer;
imageBuffer.line = -1;
pixelBuffer = new PixelBuffer(scopeBuffer.width, 2);
pixelBuffer = new PixelBuffer(800, 2);
demodulator = new Demodulator(sampleRate);
double pulseFilterSeconds = 0.0025;
int pulseFilterSamples = (int) Math.round(pulseFilterSeconds * sampleRate) | 1;
@ -115,6 +115,7 @@ public class Decoder {
syncPulse20msModes.add(new PaulDon("160", 98, 512, 400, 0.195584, sampleRate));
syncPulse20msModes.add(new PaulDon("180", 96, 640, 496, 0.18304, sampleRate));
syncPulse20msModes.add(new PaulDon("240", 97, 640, 496, 0.24448, sampleRate));
syncPulse20msModes.add(new PaulDon("290", 94, 800, 616, 0.2288, sampleRate));
}
private double scanLineMean(int[] lines) {
@ -169,10 +170,11 @@ public class Decoder {
}
private void copyUnscaled() {
int width = Math.min(scopeBuffer.width, pixelBuffer.width);
for (int row = 0; row < pixelBuffer.height; ++row) {
int line = scopeBuffer.width * scopeBuffer.line;
System.arraycopy(pixelBuffer.pixels, row * pixelBuffer.width, scopeBuffer.pixels, line, pixelBuffer.width);
Arrays.fill(scopeBuffer.pixels, line + pixelBuffer.width, line + scopeBuffer.width, 0);
System.arraycopy(pixelBuffer.pixels, row * pixelBuffer.width, scopeBuffer.pixels, line, width);
Arrays.fill(scopeBuffer.pixels, line + width, line + scopeBuffer.width, 0);
System.arraycopy(scopeBuffer.pixels, line, scopeBuffer.pixels, scopeBuffer.width * (scopeBuffer.line + scopeBuffer.height / 2), scopeBuffer.width);
scopeBuffer.line = (scopeBuffer.line + 1) % (scopeBuffer.height / 2);
}
@ -206,7 +208,7 @@ public class Decoder {
finish = imageBuffer.line == imageBuffer.height;
}
int scale = scopeBuffer.width / pixelBuffer.width;
if (scale == 1)
if (scale <= 1)
copyUnscaled();
else
copyScaled(scale);

Wyświetl plik

@ -424,7 +424,7 @@ public class MainActivity extends AppCompatActivity {
final int defaultSampleRate = 44100;
final int defaultChannelSelect = 0;
final int defaultAudioSource = MediaRecorder.AudioSource.MIC;
final int defaultAudioFormat = AudioFormat.ENCODING_PCM_FLOAT;
final int defaultAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
final boolean defaultAutoSave = true;
final String defaultLanguage = "system";
if (state == null) {
@ -457,7 +457,7 @@ public class MainActivity extends AppCompatActivity {
scopeBuffer = new PixelBuffer(640, 2 * 1280);
freqPlotBuffer = new PixelBuffer(256, 2 * 256);
peakMeterBuffer = new PixelBuffer(1, 16);
imageBuffer = new PixelBuffer(640, 496);
imageBuffer = new PixelBuffer(800, 616);
createScope(config);
createFreqPlot(config);
createPeakMeter();
@ -545,6 +545,10 @@ public class MainActivity extends AppCompatActivity {
setMode(R.string.pd240);
return true;
}
if (id == R.id.action_force_pd290) {
setMode(R.string.pd290);
return true;
}
if (id == R.id.action_force_martin1) {
setMode(R.string.martin1);
return true;
@ -685,6 +689,10 @@ public class MainActivity extends AppCompatActivity {
setLanguage("pl");
return true;
}
if (id == R.id.action_ukrainian) {
setLanguage("uk");
return true;
}
return super.onOptionsItemSelected(item);
}

Wyświetl plik

@ -62,6 +62,9 @@
<item
android:id="@+id/action_force_pd240"
android:title="@string/pd240" />
<item
android:id="@+id/action_force_pd290"
android:title="@string/pd290" />
</menu>
</item>
<item android:title="@string/martin_modes">
@ -247,6 +250,9 @@
<item
android:id="@+id/action_polish"
android:title="@string/polish" />
<item
android:id="@+id/action_ukrainian"
android:title="@string/ukrainian" />
</menu>
</item>
<item

Wyświetl plik

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="language">мова</string>
<string name="share">Поділитися</string>
<string name="more_options">Більше</string>
<string name="store_scope">Зберегти екран</string>
<string name="toggle_mode">Зафіксувати режим</string>
<string name="auto_mode">Автоматичний</string>
<string name="lock_mode">Вибір режима</string>
<string name="raw_mode">Без обробки</string>
<string name="listening">Слухаю</string>
<string name="audio_settings">Параметри аудіо</string>
<string name="sample_rate">Частота дискретизації</string>
<string name="channel_select">Вибір канала</string>
<string name="channel_default">Стандартний</string>
<string name="channel_first">Перший</string>
<string name="channel_second">Другий</string>
<string name="channel_summation">Спільний</string>
<string name="channel_analytic">Аналіз</string>
<string name="audio_source">Джерело аудіо</string>
<string name="source_default">Стандартний</string>
<string name="source_microphone">Мікрофон</string>
<string name="source_camcorder">Камера</string>
<string name="source_voice_recognition">Розпізнавання голосу</string>
<string name="source_unprocessed">Необроблений</string>
<string name="audio_format">Формат аудіо</string>
<string name="fixed_point">Фіксована точка</string>
<string name="floating_point">Плаваюча точка</string>
<string name="audio_init_failed">Помилка ініціалізації аудіо</string>
<string name="audio_setup_failed">Помилка налаштування аудіо</string>
<string name="audio_permission_denied">Аудіо - відмовлено у доступі</string>
<string name="audio_recording_error">Помилка запису аудіо</string>
<string name="creating_picture_directory_failed">Помилка створення каталогу для зображень</string>
<string name="creating_picture_file_failed">Помилка створення файлу зображення</string>
<string name="storing_picture_failed">Помилка збереження зображення</string>
<string name="scope_description">Декодоване зображення SSTV</string>
<string name="freq_plot_description">Графік частот</string>
<string name="peak_meter_description">Піковий рівень аудіосигналу</string>
<string name="auto_save">Автозбереження</string>
<string name="night_mode">Нічний режим</string>
<string name="enable">Увімкнути</string>
<string name="disable">Вимкнути</string>
<string name="close">Закрити</string>
<string name="privacy_policy">Політика приватності</string>
<string name="privacy_policy_text"><![CDATA[
<p><h1>Політика приватності</h1></p>
<p><h5>Доступ до мікрофону</h5>
Ця програма вимагає доступу до мікрофону вашого пристрою для декодування сигналів телебачення з повільною розгорткою (SSTV).
Мікрофон записує аудіо, що містить передачу SSTV.
</p>
<p><h5>Обробка даних</h5>
Додаток використовує невеликий тимчасовий буфер у пам\'яті для обробки аудіоданих у реальному часі.
Цей буфер постійно перезаписується новими даними у міру просування декодування.
Програма не зберігає необроблене аудіо, записане з мікрофона.
На пристрої зберігаються лише зображення, отримані внаслідок декодування сигналу SSTV.
</p>
]]></string>
<string name="about">О застосунок Robot36</string>
<string name="about_text"><![CDATA[
<p><h1>Robot36 %1$s</h1>Авторські права 2024 Ahmet Inan</p>
<p>Будь ласка, ознайомтеся з ВІДМОВИЮ ВІД ВІДПОВІДАЛЬНОСТІ внизу цієї сторінки</p>
<p><h5>Опис</h5>Декодує зображення телебачення з повільною розгорткою з аудіосигналу</p>
<p><h5>Реализация</h5><a href="https://github.com/xdsopl/robot36">Robot36 на Ґітхаб</a><br />Ліцензія BSD Zero Clause</p>
<p><h5>Специфікації режимів</h5><a href="http://www.barberdsp.com/downloads/Dayton%%20Paper.pdf">Dayton Paper</a><br />автор JL Barber - 2000</p>
<p><h5>ВІДМОВА ВІД ВІДПОВІДАЛЬНОСТІ</h5>%2$s</p>
]]></string>
</resources>

Wyświetl plik

@ -14,6 +14,7 @@
<string name="pd160" translatable="false">PD 160</string>
<string name="pd180" translatable="false">PD 180</string>
<string name="pd240" translatable="false">PD 240</string>
<string name="pd290" translatable="false">PD 290</string>
<string name="martin1" translatable="false">Martin 1</string>
<string name="martin2" translatable="false">Martin 2</string>
<string name="scottie1" translatable="false">Scottie 1</string>
@ -31,6 +32,7 @@
<string name="german" translatable="false">Deutsch</string>
<string name="brazilian_portuguese" translatable="false">Português brasileiro</string>
<string name="polish" translatable="false">Polski</string>
<string name="ukrainian" translatable="false">Українська</string>
<string name="disclaimer" translatable="false">THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.</string>
<string name="language">Language</string>
<string name="share">Share</string>