|
@@ -109,7 +109,8 @@ extern struct outputstate output;
|
|
|
extern struct buffer *streambuf;
|
|
|
extern struct buffer *outputbuf;
|
|
|
extern u8_t *silencebuf;
|
|
|
-extern bool jack_mutes_amp;
|
|
|
+
|
|
|
+bool jack_mutes_amp = false;
|
|
|
|
|
|
static log_level loglevel;
|
|
|
static bool running, isI2SStarted;
|
|
@@ -120,6 +121,7 @@ static u8_t *obuf;
|
|
|
static frames_t oframes;
|
|
|
static bool spdif;
|
|
|
static size_t dma_buf_frames;
|
|
|
+static int jack_status = -1; // 0 = inserted
|
|
|
|
|
|
DECLARE_ALL_MIN_MAX;
|
|
|
|
|
@@ -154,7 +156,7 @@ static void spdif_convert(ISAMPLE_T *src, size_t frames, u32_t *dst, size_t *cou
|
|
|
|
|
|
#define I2C_PORT 0
|
|
|
#define I2C_ADDR 0x4c
|
|
|
-#define VOLUME_GPIO 33
|
|
|
+#define VOLUME_GPIO 14
|
|
|
#define JACK_GPIO 34
|
|
|
|
|
|
struct tas575x_cmd_s {
|
|
@@ -438,10 +440,17 @@ static void *output_thread_i2s() {
|
|
|
|
|
|
TIME_MEASUREMENT_START(timer_start);
|
|
|
|
|
|
- LOCK;
|
|
|
- if(jack_mutes_amp){
|
|
|
- // todo: implement some muting logic
|
|
|
+ // handle jack insertion as a polling function (to avoid to have to do de-bouncing)
|
|
|
+ if (gpio_get_level(JACK_GPIO) != jack_status) {
|
|
|
+ jack_status = gpio_get_level(JACK_GPIO);
|
|
|
+ if (jack_mutes_amp) {
|
|
|
+ //gpio_set_level(VOLUME_GPIO, jack_status);
|
|
|
+ LOG_INFO("Changing jack status %d", jack_status);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ LOCK;
|
|
|
+
|
|
|
// manage led display
|
|
|
if (state != output.state) {
|
|
|
LOG_INFO("Output state is %d", output.state);
|
|
@@ -464,7 +473,7 @@ static void *output_thread_i2s() {
|
|
|
} else if (output.state == OUTPUT_STOPPED) {
|
|
|
synced = false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
oframes = 0;
|
|
|
output.updated = gettime_ms();
|
|
|
output.frames_played_dmp = output.frames_played;
|
|
@@ -493,7 +502,7 @@ static void *output_thread_i2s() {
|
|
|
}
|
|
|
|
|
|
UNLOCK;
|
|
|
-
|
|
|
+
|
|
|
// now send all the data
|
|
|
TIME_MEASUREMENT_START(timer_start);
|
|
|
|