kopia lustrzana https://github.com/xdsopl/robot36
Porównaj commity
7 Commity
0d1e90d613
...
728c9df890
Autor | SHA1 | Data |
---|---|---|
Ahmet Inan | 728c9df890 | |
Ahmet Inan | c93dff432e | |
Ahmet Inan | 1fbec49583 | |
Ahmet Inan | 28ebde8e93 | |
Ahmet Inan | 2c3c6b1293 | |
Ahmet Inan | 2d74f33bb6 | |
Помаранча | 07e2f59389 |
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
Ładowanie…
Reference in New Issue