mirror of
https://github.com/eried/portapack-mayhem.git
synced 2024-10-01 01:26:06 -04:00
Added microphone TX (very basic for now)
This commit is contained in:
parent
2d75722b74
commit
229ec3ea75
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||
* Copyright (C) 2016 Furrtek
|
||||
*
|
||||
* This file is part of PortaPack.
|
||||
*
|
||||
@ -228,7 +229,7 @@ buffer_t rx_empty_buffer() {
|
||||
if( next_lli ) {
|
||||
const size_t next_index = next_lli - &lli_rx_loop[0];
|
||||
const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask;
|
||||
return { reinterpret_cast<sample_t*>(lli_rx_loop[free_index].srcaddr), transfer_samples };
|
||||
return { reinterpret_cast<sample_t*>(lli_rx_loop[free_index].destaddr), transfer_samples };
|
||||
} else {
|
||||
return { nullptr, 0 };
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||
* Copyright (C) 2016 Furrtek
|
||||
*
|
||||
* This file is part of PortaPack.
|
||||
*
|
||||
|
59
firmware/baseband/audio_input.cpp
Normal file
59
firmware/baseband/audio_input.cpp
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||
* Copyright (C) 2016 Furrtek
|
||||
*
|
||||
* This file is part of PortaPack.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "audio_input.hpp"
|
||||
|
||||
#include "portapack_shared_memory.hpp"
|
||||
|
||||
#include "audio_dma.hpp"
|
||||
|
||||
#include "message.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
#include <array>
|
||||
|
||||
void AudioInput::configure(
|
||||
const iir_biquad_config_t& hpf_config,
|
||||
const float squelch_threshold
|
||||
) {
|
||||
//hpf.configure(hpf_config);
|
||||
//squelch.set_threshold(squelch_threshold);
|
||||
}
|
||||
|
||||
void AudioInput::read_audio_buffer(buffer_s16_t& audio) {
|
||||
//std::array<int16_t, 32> audio_int;
|
||||
|
||||
auto audio_buffer = audio::dma::rx_empty_buffer();
|
||||
|
||||
for(size_t i=0; i<audio_buffer.count; i++) {
|
||||
//const int32_t sample_int = audio.p[i] * k;
|
||||
//const int32_t sample_saturated = __SSAT(sample_int, 16);
|
||||
audio.p[i] = audio_buffer.p[i].left;
|
||||
//audio_int[i] = sample_saturated;
|
||||
}
|
||||
/*if( stream && send_to_fifo ) {
|
||||
stream->write(audio_int.data(), audio_buffer.count * sizeof(audio_int[0]));
|
||||
}*/
|
||||
|
||||
//feed_audio_stats(audio);
|
||||
}
|
61
firmware/baseband/audio_input.hpp
Normal file
61
firmware/baseband/audio_input.hpp
Normal file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||
* Copyright (C) 2016 Furrtek
|
||||
*
|
||||
* This file is part of PortaPack.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __AUDIO_INPUT_H__
|
||||
#define __AUDIO_INPUT_H__
|
||||
|
||||
#include "dsp_types.hpp"
|
||||
|
||||
#include "dsp_iir.hpp"
|
||||
#include "dsp_squelch.hpp"
|
||||
|
||||
#include "stream_input.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
|
||||
class AudioInput {
|
||||
public:
|
||||
void configure(
|
||||
const iir_biquad_config_t& hpf_config,
|
||||
const float squelch_threshold = 0.0f
|
||||
);
|
||||
|
||||
void read_audio_buffer(buffer_s16_t& audio);
|
||||
|
||||
/*void set_stream(std::unique_ptr<StreamInput> new_stream) {
|
||||
stream = std::move(new_stream);
|
||||
}*/
|
||||
|
||||
private:
|
||||
static constexpr float k = 32768.0f;
|
||||
static constexpr float ki = 1.0f / k;
|
||||
|
||||
IIRBiquadFilter hpf { };
|
||||
//FMSquelch squelch { };
|
||||
|
||||
//std::unique_ptr<StreamInput> stream { };
|
||||
|
||||
//AudioStatsCollector audio_stats { };
|
||||
};
|
||||
|
||||
#endif/*__AUDIO_INPUT_H__*/
|
96
firmware/baseband/proc_mictx.cpp
Normal file
96
firmware/baseband/proc_mictx.cpp
Normal file
@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
|
||||
* Copyright (C) 2016 Furrtek
|
||||
*
|
||||
* This file is part of PortaPack.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "proc_mictx.hpp"
|
||||
#include "portapack_shared_memory.hpp"
|
||||
#include "sine_table_int8.hpp"
|
||||
#include "event_m4.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
void MicTXProcessor::execute(const buffer_c8_t& buffer){
|
||||
|
||||
// This is called at 1536000/2048 = 750Hz
|
||||
|
||||
if (!configured) return;
|
||||
|
||||
audio_input.read_audio_buffer(audio_buffer);
|
||||
|
||||
for (size_t i = 0; i<buffer.count; i++) {
|
||||
|
||||
sample = audio_buffer.p[i >> 6] >> 8;
|
||||
|
||||
power += (sample < 0) ? -sample : sample;
|
||||
|
||||
if (!as) {
|
||||
as = divider;
|
||||
level_message.value = power / (divider / 4);
|
||||
shared_memory.application_queue.push(level_message);
|
||||
power = 0;
|
||||
} else {
|
||||
as--;
|
||||
}
|
||||
|
||||
if (ctcss_enabled) {
|
||||
ctcss_sample = sine_table_i8[(ctcss_phase & 0xFF000000U) >> 24];
|
||||
sample_mixed = ((sample * 205) + (ctcss_sample * 50)) / 256; // ~20%
|
||||
ctcss_phase += ctcss_phase_inc;
|
||||
} else {
|
||||
sample_mixed = sample;
|
||||
}
|
||||
|
||||
// FM
|
||||
delta = sample_mixed * fm_delta;
|
||||
|
||||
phase += delta;
|
||||
sphase = phase + (64 << 24);
|
||||
|
||||
re = (sine_table_i8[(sphase & 0xFF000000U) >> 24]);
|
||||
im = (sine_table_i8[(phase & 0xFF000000U) >> 24]);
|
||||
|
||||
buffer.p[i] = {re, im};
|
||||
}
|
||||
}
|
||||
|
||||
void MicTXProcessor::on_message(const Message* const msg) {
|
||||
const auto message = *reinterpret_cast<const AudioTXConfigMessage*>(msg);
|
||||
|
||||
switch(msg->id) {
|
||||
case Message::ID::AudioTXConfig:
|
||||
fm_delta = message.fm_delta * (0xFFFFFFULL / 1536000);
|
||||
divider = message.divider;
|
||||
ctcss_enabled = message.ctcss_enabled;
|
||||
ctcss_phase_inc = message.ctcss_phase_inc;
|
||||
|
||||
configured = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
EventDispatcher event_dispatcher { std::make_unique<MicTXProcessor>() };
|
||||
event_dispatcher.run();
|
||||
return 0;
|
||||
}
|
63
firmware/baseband/proc_mictx.hpp
Normal file
63
firmware/baseband/proc_mictx.hpp
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
|
||||
* Copyright (C) 2016 Furrtek
|
||||
*
|
||||
* This file is part of PortaPack.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __PROC_MICTX_H__
|
||||
#define __PROC_MICTX_H__
|
||||
|
||||
#include "audio_input.hpp"
|
||||
#include "baseband_processor.hpp"
|
||||
#include "baseband_thread.hpp"
|
||||
|
||||
class MicTXProcessor : public BasebandProcessor {
|
||||
public:
|
||||
void execute(const buffer_c8_t& buffer) override;
|
||||
|
||||
void on_message(const Message* const msg) override;
|
||||
|
||||
private:
|
||||
bool configured = false;
|
||||
|
||||
BasebandThread baseband_thread { 1536000, this, NORMALPRIO + 20, baseband::Direction::Transmit };
|
||||
|
||||
int16_t audio_data[64];
|
||||
buffer_s16_t audio_buffer {
|
||||
audio_data,
|
||||
sizeof(int16_t) * 64
|
||||
};
|
||||
|
||||
AudioInput audio_input { };
|
||||
|
||||
uint32_t divider { };
|
||||
uint32_t as { 0 };
|
||||
uint32_t fm_delta { 0 };
|
||||
bool ctcss_enabled { false };
|
||||
uint32_t ctcss_phase_inc { };
|
||||
uint32_t ctcss_phase { 0 }, phase { 0 }, sphase { 0 };
|
||||
int32_t ctcss_sample { 0 }, sample { 0 }, sample_mixed { }, delta { };
|
||||
uint64_t power { 0 };
|
||||
|
||||
int8_t re { 0 }, im { 0 };
|
||||
|
||||
AudioLevelMessage level_message { };
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user