PWM drives the speaker.

Revision:
3:37a886d77bae
Parent:
2:436529700217
--- a/PwmOutSpeaker.cpp	Fri Mar 24 06:55:24 2017 +0000
+++ b/PwmOutSpeaker.cpp	Tue Jul 24 08:31:11 2018 +0000
@@ -27,15 +27,12 @@
     _bottom = 0;
     _top = 0;
     _playing = false;
-    outputVolume(1.0f);
-    format(16, 2);
+    outputVolume(1.0f, 1.0f);
+    format(16);
     frequency(44100);
 }
 
-bool PwmOutSpeaker::format(char length, char ch) {
-    if ((ch != 1) && (ch != 2)) {
-        return false;
-    }
+bool PwmOutSpeaker::format(char length) {
     switch (length) {
         case 8:
         case 16:
@@ -44,7 +41,6 @@
             return false;
     }
     _length = length;
-    _channel = ch;
     _data_cnt = 0;
     return true;
 }
@@ -81,11 +77,13 @@
     return true;
 }
 
-int PwmOutSpeaker::write(uint8_t * const p_data, uint32_t data_size) {
+int PwmOutSpeaker::write(void * const p_data, uint32_t data_size, const rbsp_data_conf_t * const p_data_conf) {
     int data_num;
     int i = 0;
-    float wk_vol;
-    float wk_ofs;
+    float wk_vol_l;
+    float wk_ofs_l;
+    float wk_vol_r;
+    float wk_ofs_r;
 
     if (_length == 8) {
         data_num = data_size;
@@ -95,40 +93,47 @@
     while (i < data_num) {
         if (_data_cnt < (_hz_multi - 1)) {
             _data_cnt++;
-            i += _channel;
+            i += 2;
         } else {
             _data_cnt = 0;
             while (((_bottom + 2) & MSK_RING_BUFF) == _top) {
                 Thread::wait(1);
             }
-            wk_vol = _speaker_vol;
-            wk_ofs = (1.0f - wk_vol) / 2;
+            wk_vol_l = _speaker_vol_l;
+            wk_ofs_l = (1.0f - wk_vol_l) / 2;
+            wk_vol_r = _speaker_vol_r;
+            wk_ofs_r = (1.0f - wk_vol_r) / 2;
             if (_length == 8) {
-                _pwm_duty_buf[_bottom] = ((float)p_data[i++] / (float)0xff) * wk_vol + wk_ofs;
-                if (_channel == 1) {
-                    _pwm_duty_buf[_bottom + 1] = _pwm_duty_buf[_bottom];
-                } else {
-                    _pwm_duty_buf[_bottom + 1] = ((float)p_data[i++] / (float)0xff) * wk_vol + wk_ofs;
-                }
+                _pwm_duty_buf[_bottom] = ((float)((uint8_t *)p_data)[i++] / (float)0xff) * wk_vol_l + wk_ofs_l;
+                _pwm_duty_buf[_bottom + 1] = ((float)((uint8_t *)p_data)[i++] / (float)0xff) * wk_vol_r + wk_ofs_r;
             } else {
-                _pwm_duty_buf[_bottom] = ((float)(((int16_t *)p_data)[i++] + 0x8000) / (float)0xffff) * wk_vol + wk_ofs;
-                if (_channel == 1) {
-                    _pwm_duty_buf[_bottom + 1] = _pwm_duty_buf[_bottom];
-                } else {
-                    _pwm_duty_buf[_bottom + 1] = ((float)(((int16_t *)p_data)[i++] + 0x8000) / (float)0xffff) * wk_vol + wk_ofs;
-                }
+                _pwm_duty_buf[_bottom] = ((float)(((int16_t *)p_data)[i++] + 0x8000) / (float)0xffff) * wk_vol_l + wk_ofs_l;
+                _pwm_duty_buf[_bottom + 1] = ((float)(((int16_t *)p_data)[i++] + 0x8000) / (float)0xffff) * wk_vol_r + wk_ofs_r;
             }
             _bottom = (_bottom + 2) & MSK_RING_BUFF;
         }
     }
+
+    if (p_data_conf != NULL) {
+        return data_size;
+    }
+
+    if (p_data_conf->p_notify_func != NULL) {
+        p_data_conf->p_notify_func(p_data, data_size, p_data_conf->p_app_data);
+    }
+
     return 0;
 }
 
-bool PwmOutSpeaker::outputVolume(float volume) {
-    if ((volume < 0.0) || (volume > 1.0)) {
+bool PwmOutSpeaker::outputVolume(float leftVolumeOut, float rightVolumeOut) {
+    if ((leftVolumeOut < 0.0) || (leftVolumeOut > 1.0)) {
         return false;
     }
-    _speaker_vol  = volume;
+    if ((rightVolumeOut < 0.0) || (rightVolumeOut > 1.0)) {
+        return false;
+    }
+    _speaker_vol_l  = leftVolumeOut;
+    _speaker_vol_r  = rightVolumeOut;
     return true;
 }