diff --git a/CHANGELOG.md b/CHANGELOG.md
index c3b9efacf3c22b98fd13f30ee5c25345c664683f..3db9bd186f10d9058bda6f980526a03dd878a2ee 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added
 
 * Support for CGB flag parsing
+* Waveform plotting support
 
 ### Changed
 
@@ -18,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Fixed
 
 * Major JoyPad issue with Action/Select read in register
+* Small issue with channel 3 audio and DAC disable
 
 ## [0.7.2] - 2023-03-04
 
diff --git a/frontends/web/ts/gb.ts b/frontends/web/ts/gb.ts
index dcde0e67798a246778a73e203c21ef4afb77f7a8..ce5fab7850f1a3a0dae56ea47c583625c125fe93 100644
--- a/frontends/web/ts/gb.ts
+++ b/frontends/web/ts/gb.ts
@@ -606,6 +606,18 @@ export class GameboyEmulator extends EmulatorBase implements Emulator {
         };
     }
 
+    get audioOutput(): Record<string, number> {
+        const output = this.gameBoy?.audio_all_output();
+        if (!output) return {};
+        return {
+            master: output[0],
+            ch1: output[1],
+            ch2: output[2],
+            ch3: output[3],
+            ch4: 0
+        };
+    }
+
     get palette(): string | undefined {
         const paletteObj = PALETTES[this.paletteIndex];
         return paletteObj.name;
diff --git a/src/apu.rs b/src/apu.rs
index 03893a90729e9ac9c25257aaa41abd86adb0e7f9..b44762b9655abc245d1a74036188923083b22b17 100644
--- a/src/apu.rs
+++ b/src/apu.rs
@@ -348,6 +348,18 @@ impl Apu {
         self.ch1_output + self.ch2_output + self.ch3_output
     }
 
+    pub fn ch1_output(&self) -> u8 {
+        self.ch1_output
+    }
+
+    pub fn ch2_output(&self) -> u8 {
+        self.ch2_output
+    }
+
+    pub fn ch3_output(&self) -> u8 {
+        self.ch3_output
+    }
+
     pub fn audio_buffer(&self) -> &VecDeque<u8> {
         &self.audio_buffer
     }
@@ -526,7 +538,7 @@ impl Apu {
             return;
         }
 
-        if self.ch3_enabled {
+        if self.ch3_enabled && self.ch3_dac {
             let wave_index = self.ch3_position >> 1;
             let mut output = self.wave_ram[wave_index as usize];
             output = if (self.ch3_position & 0x01) == 0x01 {
diff --git a/src/gb.rs b/src/gb.rs
index 07acdf7c93fb132f6448a788f7da5acbc8189259..a45b89216b24bfbd7525fcd4892336e753b8fecc 100644
--- a/src/gb.rs
+++ b/src/gb.rs
@@ -189,6 +189,31 @@ impl GameBoy {
         buffer
     }
 
+    pub fn audio_output(&self) -> u8 {
+        self.apu_i().output()
+    }
+
+    pub fn audio_all_output(&self) -> Vec<u8> {
+        vec![
+            self.audio_output(),
+            self.audio_ch1_output(),
+            self.audio_ch2_output(),
+            self.audio_ch3_output(),
+        ]
+    }
+
+    pub fn audio_ch1_output(&self) -> u8 {
+        self.apu_i().ch1_output()
+    }
+
+    pub fn audio_ch2_output(&self) -> u8 {
+        self.apu_i().ch2_output()
+    }
+
+    pub fn audio_ch3_output(&self) -> u8 {
+        self.apu_i().ch3_output()
+    }
+
     pub fn cartridge_eager(&mut self) -> Cartridge {
         self.mmu().rom().clone()
     }