ESP8266, MP3 網路收音機, 想起沒有筆記的 ATmega8 音樂盒


http://wp.me/ph3BR-20L

 

 

有商業/廣播電台, 除了透過大氣電波(無線電)發送, 近代還有利用網路同時廣播, 最近多數是用 MP3 (m3u8) 串流播送的, 也有用 WAV. 台灣的大部分廣播電台的網路播送都給 HINET 代管了, 所以一般的播放器幾年前就死翹翹了. 一個地區是一個小眾市場, 開發播放軟體的都是有地域性的, 例如在地的人沒有幾個有興趣聽德國的廣播電台, 所以也就沒人開發, 反過來也沒幾個德國人聽台灣廣播, 所以有網路廣播還是會局限於地域. 那自然開發收聽的軟體或者收音機, 自然少, 或許能聽台灣網台的收音機都要上萬元, 且買眾者零星.

網路上看到有些解釋了原因, 據說是 HINET 使用了 m3u8 (MP3) 串流播送, 慢慢逐步透過版權保護的方式 (DRM), 用瀏覽器收聽的話先下載一個 SWF (Adobe Flash) 到你的電腦, 透過這個工具, 在你的電腦上不停計算得到一個 m3u8 的網址連上去收聽, 隔一段時間就繼續計算繼續修訂網址才能繼續收聽. 一般聽不到斷線的可能原因是有 CACHE 或 BUFFERING, 翻譯意思是有 “正在緩衝", 下載很多段小片段, 累積一定數量才開始從喇叭播送.

本來也沒啥, 不過電腦就是頓在那裏等廣告等開播等到慢死了, 一旦開播就順了, 換台就再來一次, 這樣麻煩, 乾脆不聽, 因為瀏覽器都停頓好一陣子才開始播送廣播, 廣告機隨時跳出來就算了, 還是困擾. 沒經驗的可以試試聽這個HINET 代管的網台, 愛樂電台 https://www.e-classical.com.tw/voice/radio/

 

不過台灣有個人才, 有設計一個收聽用的軟體, 持續更新了有10年, 現在還能繼續收聽 HINET 代管的電台 (m3u8), 無論速度與激情都一樣順暢, 免了頓頓還有那些拖慢機器的廣告, 當然也希望作者可以指點一下如何做到的, 顯然還是要用到 ADOBE FLASH PLAYER. 原作者的網誌 http://cym6112.blogspot.tw/2011/07/blog-post.html, 當然, 必須要安裝那個 Adobe Flash, 不然沒有 Exceptional handling 就會出現上圖那個錯誤的問題. Flash Player下載點 https://get.adobe.com/tw/flashplayer/, 最近在 VirtualBox + Win XP3 收聽, 依然順暢, 不過這題外話的.

有關的 HINET 託管還有相關 MP3 電台 DRM 的一些資訊, 看過以下的網誌, 順序忘記了, 反正就看過參考過,

h_ttps://plus.google.com/109271007075151522335/posts/11g8DSFsxWB

http://franks543.blogspot.tw/2014/11/hichannel-radio-hls.html

http://adabc.blogspot.tw/2015/04/hichannellink.html

http://cym6112.blogspot.tw/2011/07/blog-post.html

http://blog.hoyo.idv.tw/?p=3031

http://www.osslab.org.tw/Hardware/Open_Embedded_System/NextVOD_unit_Hacking_-_%E7%B6%B2%E6%A8%82%E9%80%9A%E6%94%B9%E6%A9%9F/%E5%AD%90%E5%B0%88%E6%A1%88%3ANextRadio_-_%E7%B6%B2%E8%B7%AF%E6%94%B6%E9%9F%B3%E6%A9%9F/%E6%9C%80%E6%96%B0%E9%9B%BB%E5%8F%B0%E6%92%AD%E6%94%BE%E6%B8%85%E5%96%AE(%E9%9A%A8%E6%99%82%E6%9B%B4%E6%96%B0)

 

 

基本上有古典音樂的電台廣播, 地域性的都有一兩個, 對比 HINET 託管的愛樂電台, 同樣是 m3u8 串流, 這個 RTHK4 就直接了當給你連上去, 不怕盜版收錄, 測試或收聽都很好, http://stm.rthk.hk/radio4, 要看看 m3u8 的內文, 可以下載 http://stm.rthk.hk/radio4.m3u, 內容原來就是一般的文字檔案如下,


http://stm2.rthk.hk:80/radio4

 

手機有APP可以聽同樣的電台, 不過好幾次換台被突然滿屏的廣告機驚嚇了一大跳, 所以對這類APP沒有好感, 俺聽電台你打廣告本來不相干, 無奈被驚嚇到感覺就是不良, 後來有看到 ESP8266 可以10元錢就做個網路收音機, 原廠提供的開源項目, 那就試試玩, 反正沒多少錢, 在地買就貴一倍, 如果買多就自己淘寶購買.

這次做完就把它存到 Github, 方便日後參考, 實驗完畢, 算是總結學習報告, 有 firmware 及燒錄工具, 可供快速試用, 可以下載, https://github.com/xiaolaba/ESP8266_MP3_DECODER. 若要千辛萬苦自己建立 firmware, 很多時候會讓人卻步, 某些錯誤導致失了興趣停滯不前. 要試用的話, 燒好 firmware, 再把自家的 ROUTER 設定臨時改一下就立馬可以實驗聽網台,

ROUTER 設定,
wifi ssid : xiaolaba_tap
pwd : 123456789

用耳機可以直接聽, 接擴大機也可以, 嫌高音破音刺耳可以加 RC filter, 1k – 3.3uF. 想體驗一個MCU就可以聽網台但是礙於困難重重不知如可開始的, 可以一試. 硬件買 NodeMCU 較簡單台幣120, 買ESP-01就RMB10元, 玩過懂得基本的可以便宜可以選 ESP-12E / ESP-12F / ESP-12S. 只要知道怎樣進入 BOOT LOAD 模式就可以. 參考的來源有兩個如下,

https://github.com/Edzelf/Esp-radio/blob/master/README.md

https://github.com/espressif/ESP8266_MP3_DECODER.git

第一個不採用, 因為要外接MP3解碼器, 買那個MP3解碼器不如用手機聽算了, ARDUINO 也不太適合玩這個, 沒好玩的. 第二個是原廠的, 開發的人應該是老美後來受聘到樂鑫上班, 推廣這些 MCU 並不容易, IoT 範疇太廣, 應用層面寬, 如果當那年AVR沒有ARDUINO一脈, 也不會造就後來的榮景, 雖說很多人買了沒玩就丟一旁, 但據說也只能市佔率第四第五位. 而這個 ESP8266, 據作者說是可以完全不用 SRAM 和 MP3解碼器, 純粹依靠 MCU 還有 libmad (開源的MP3軟解碼庫), 實驗完畢也證實所言不虛. 開始看了一行誤會, 後來確定用 RTOS SDK 編譯就成了.

樂鑫最近比較完備文檔和使用指南, 雖然還有很多錯漏, 編譯 FIRMWAR 大致的過程如下, Win10,

1) 安裝 https://www.virtualbox.org/wiki/Downloads, VirtualBox 5.1.22 platform packages & VirtualBox 5.1.22 Oracle VM VirtualBox Extension Pack
2) 導入/安裝/啟動 ESP8266 LUBUNTU VIRTUAL BOX IMAGE, ESP8266_lubuntu_20141021.ova, 下載點http://download.espressif.com/FB/ESP8266_GCC.zip
3) sudo apt-get update
4) sudo apt-get install git
5) git clone https://github.com/espressif/ESP8266_MP3_DECODER.git
6) cd ESP8266_MP3_DECODER/mp3/user
7) playerconfig.h, 修改 ssid/pwd, #define PWM_HACK, 還有另外一個地方要改, 突然記不起來, 看README
8) cd mp3
9) make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE=1024 或 ./gen_misc.sh

 

編譯完畢會看到類似下面的幾行字, 不過作者說明那個地址實際要燒到0xA0000, 並不是 0x40000

Result:
!!!
No boot needed.
Generate eagle.flash.bin and eagle.irom0text.bin successfully in folder bin.
eagle.flash.bin——–>0x00000
eagle.irom0text.bin—->0x40000

 

實際接線還是比較簡單的, 看圖識字最快, 電路圖, 用兩條線接擴音喇叭或耳機,
用 ESP-1 : IO3, GND
用 NodeMCU : RX, GND

實際聽聽看網台的廣播, 能聽清楚但是絕對不是HIFI, 作者說明 dithered 5-bit PWM output sound,

h_ttps://youtu.be/a8qV91JFXUU

 

2017-JUL-10, update, 以上是當初實驗PWM 模式, 毛刺很多, 姑且試試看 SOFT DAC 模式, 結果比較好, 聽起來好多了.

h_ttps://youtu.be/o4L3yBBE2Yo

 

要自己改電台, 裡面重要就是 (server, PORT, PATH), 有了這3個東西, 抄抄人家的源碼, 兜了一個10元的自制網路收音機, 不花多少錢的玩具. 後來想想看, 除了用 MP3 串流的電台廣播, 用 WMV 串流的電台廣播也給它試一下又何妨, 試了一下果然不行, 因為沒有解碼器, 所以連上伺服器也沒聲音, 例如這個 MMS 串流的網台, 中廣-亞洲語網, mms://media.ccdntech.com/wmtencoder/rti/cbs6.wmv, 據說使用 PORT 1755,

用 Windows Media Player 或者 PotPlayer 都可以聽, 當然在 PC 上執行. 換成自己做的玩具, 就沒響, 也是沒有解碼器, 用這個 Terminal 工具 https://sites.google.com/site/terminalbpp/, 看輸出證明沒有解碼器.

因而想到之前抄過 PWM 合成聲音的音樂盒玩具, 用 ATMega8, 當然直接燒到ARDUINO UNO也可以, 所以翻一下, 居然沒有筆記…? 記得大概在2015年做的, 翻翻翻…找到一些資料, 可是源碼呢……? 當時抄來試驗, 沒想到那麼容易做好, 所以也忘記了作筆記, 動手做一個, 同時了解音源的設計原理, 還有學習樂聲合成的方法. 電路圖和架構圖, 輸出是兩個 IO, 反向輸出, PWM 製造音階和弦, 時長決定音節, 網上抄來的, 讀通了就可以隨便改自己想要的設計,
http://elm-chan.org/works/mxb/report.html

www.myplace.nu/avr/minidds

http://web.archive.org/web/20150331153153/http://www.myplace.nu/avr/minidds/

 

音樂盒的兩個IO在播放時的波形,

h_ttps://www.youtube.com/watch?v=TZao4bZD9eI

音樂盒試驗

h_ttps://www.youtube.com/watch?v=CesfRJtvWTo

 

燒錄ATMEGA8的HEX檔案. 抄來的. 版權屬於原作人, https://www.mcselec.com/index.php?option=com_content&task=view&id=221&Itemid=57


:020000020000FC
:0200000012C02C
:02000600EFC049
:100026000FE50DBF04E00EBFFF241BE3A0E6B0E022
:1000360000270D931A95E9F707E007BB01E008BB17
:1000460001EA0FBD09E00EBD00E00BBD00E009BDF1
:100056000EE303BD0AE005BD00E809BFF894E6EA31
:10006600F2E067D0EEECF2E064D0E6EAF2E061D0CE
:10007600EEEDF2E05ED002E000939800E6EAF2E0F0
:1000860058D0EEECF2E055D0E6EAF2E052D0ECEED3
:10009600F2E04FD0009198000A950093980071F70E
:1000A600E6EAF2E046D0EEECF2E043D0E6EAF2E031
:1000B60040D0E8E4F3E03DD0E8EEF3E03AD0E8EEF5
:1000C600F3E037D0EAE2F4E034D0E6EAF2E031D009
:1000D600EEECF2E02ED0E6EAF2E02BD0ECEEF2E027
:1000E60028D0E6EAF2E025D0EEECF2E022D0E6EA0D
:1000F600F2E01FD0EEE5F4E01CD0EEECF2E019D011
:10010600E6EAF2E016D0ECEEF2E013D0E6EAF2E030
:1001160010D0EEECF2E00DD0E6EAF2E00AD0ECE127
:10012600F6E007D000E005BD00E007BBC19AC29A21
:10013600FFCF65908824789434D0F8948614789408
:10014600D8F3C09AB099C09845914F3F29F0042F33
:1001560004D04078B1F3EDCF0895FF93EF93E02FED
:10016600EE0FFF27E85DF94F05911591C0916100EB
:10017600C75FC63308F0CC27C0936100DD27CE5990
:10018600DF4F28E138E0F894198308833C832B83FA
:1001960078940FEF0D830E83FF82F886EF91FF911F
:1001A6000895FF93EF93C2E6D0E00E811FEF01178B
:1001B60089F01E830F8103950C3008F000E00F8351
:1001C60048F0E885E39531F0E887FF27E85EF84FC9
:1001D60004910D832996C83941F7EF91FF9108954F
:1001E600EFB66F015E01C2E6D0E0222433247A81A5
:1001F600EB81FC81649148805980740DE51DFF1DDB
:10020600FC3018F0E058F040FE827A83FC83EB83E2
:100216007D81162E67FD6195002470FD060E0694FD
:1002260071FD060E069472FD060E069473FD060E0B
:10023600002474FD060E069475FD060E069476FDE2
:10024600060E069477FD060E110C1F2C10F4019471
:100256001108200C311C2996C83949F63594279483
:10026600359427946DEF70E0261637060CF01B01C7
:1002760061E07FEF261637060CF41B0135942794B0
:100286003794622D6058762F709537FC63956ABD5A
:1002960078BD08947F1C8F1CF601E501EFBE18950A
:1002A60000CC10CB10CC10CB10CC10C710CA10C885
:1002B6001045AD10B410B910BC10C010C51047A839
:1002C60010B410B810C010FF00C410C71048AD100D
:1002D600B410B910C010FF0000C810C71045AD100B
:1002E600B410B920FF0000C810C71045AD10B410F7
:1002F600B910C710C810CA104CB010B710BC10C344
:1003060010CD10CC104AAB10B710BB10C110CC10DA
:10031600CA1048AD10B410B910C010CA10C81047A2
:10032600A810B410C010C010CC10C010CC10CC1047
:10033600D810CB10CC10CB10CC10CB10CC10CB10CF
:10034600FF0000C810C71045AD10B410B9104840E2
:100356003CBA1048413CB9104843403C3AB71048B3
:10036600B510B910BC10B9104DBC10B908CC084C6A
:10037600B510BA104ABE10BA1052BE10BA08D1084B
:1003860051B5104FC0104D3A37B5104CC0104A3A0F
:1003960037B51048C01046B510B91045BC10B91095
:1003A60045BC08C30845B908C60848B510B910BC0D
:1003B60010B9104ABC104BB9104CB410B910BC108F
:1003C6004CB9104D3EB21045B51048B710C010B725
:1003D60010C0104AB704C804C704C8044AC10CC7F1
:1003E60004FF004840BC08CF08C308CF08C508CFA3
:1003F600084743C108CF084843C008CF084A4341CD
:10040600BE08CF084C4340BC08CF08D408D30851D7
:1004160039B508CF08CD08CC084A3BB708CF08CD78
:1004260008CA08FF004C3BBA08CD08CC08CB08CC5C
:1004360008C708CC08CB08CC08C708CC08CB08CC22
:1004460030C710CC10CB10CC30C710CC10CB10CC92
:1004560010CB10CC10CB10FF00C810C71045AD1044
:10046600AD10AD10AD10AD10AD102D404346C91006
:10047600AD10AD10AD10AD10AD102D4145CA10AD8B
:1004860010AD10AD102D4CC9102D4DCA102D444A7B
:10049600CD10AD10AD10AD102D444ACD10AD102DC0
:1004A6004548CC10AD10AD10AD10AD10AD10262DD9
:1004B60041CA1026AD1026AD1026AD10262D40C817
:1004C60010262D3EC710272D3C42C51027AD1027FC
:1004D600AD1027AD10272D3CC51027AD10262D3C9D
:1004E600C51026AD10262D40C81026AD10262D3E6F
:1004F600C71026AD102D213CC510AD10AD10AD10A6
:10050600AD10AD102D404346C910AD10AD10AD1065
:10051600AD10AD102D4145CA10AD10AD10AD102D6A
:1005260049CC102D4ACD102D4ACD10AD10AD10ADD1
:10053600102D4ACD10AD102E4ACD10AE10AE10AE15
:1005460010AE10AE102E43CB10AE10AE10AE102E65
:1005560041CA102E3FC8102E3E41C610AE10AE1036
:10056600AE102E3E41C510AE102E3E41C410AE1048
:10057600AE10AE102E3E41C410AE10303C40C560E9
:10058600343840C76039A108BC0CC00CC508C80C7B
:10059600CC0C4A403CB908C80CC70C45403CB908CD
:1005A600C80CCC0CD108D40CD80C56403CB908D495
:1005B6000CD30C51403CB908D40CD80CDD08E00C27
:1005C600E40C62403CB908E00CDF0C5E403CB90824
:1005D600DD0CDC0CDB08DA0CD90CD808D70CD60CF1
:1005E600D508D40CD30CD20CD10CD00CCF0CCE0C1D
:1005F600CD0CCC10CB10CC10C710CA10C81045AD0E
:1006060010B410B910BC10C010C51047A810B41013
:10061600B810C010FF0000C810C710453C2DA160DF
:10062600FF00210023002500270029002C002E00B2
:100636003100340037003A003E00410045004900D1
:100646004E00520057005C00620068006E007500A4
:100656007B0083008B0093009C00A500AF00B900CF
:10066600C400D000DC00E900F700060115012601F0
:1006760037014A015D01720188019F01B801D2016B
:10068600EE010B022A024B026E029302BA02E40248
:1006960010033F037003A403DC03160455049704F8
:1006A600DC0427057505C80520067D06E006490712
:1006B600B8072D08A9082D09B9094D0AEA0A900BB1
:1006C600400CFA0CC00D910E6F0F5A1053115B12AD
:1006D60072139A14D41520178018F519801B231D40
:1006E600DE1EB420A622B524E4263429A72B402EEC
:1006F6000031EA330037453ABC3D68414C456A490A
:10070600C84D68524E57805C0062D467006E8A748A
:10071600787BFFFCFAF7F5F3F0EEEBE9E7E4E2E0CD
:10072600DEDBD9D7D5D3D1CFCDCBC9C7C5C3C1BFE2
:10073600BDBBB9B7B6B4B2B0AEADABA9A8A6A4A3BB
:10074600A19F9E9C9B999896959392908F8D8C8B4A
:1007560089888685848281807F7D7C7B7A7877769E
:1007660075747371706F6E6D6C6B6A6968676665B8
:1007760064636261605F5E5D5C5B5A5958575756A9
:10078600555453525251504F4E4E4D4C4B4B4A4975
:1007960048484746454544434342414140403F3E21
:1007A6003E3D3C3C3B3B3A393938383737363635AF
:1007B60035343333323231313030302F2F2E2E2D27
:1007C6002D2C2C2B2B2B2A2A292828272726262591
:1007D6002524232322222121201F1F1E1E1D1D1C0E
:1007E6001C1B1A1A1919181817161615151414138E
:1007F6001312111110100F0F0E0D0D0C0C0B0B0A0E
:100806000A0908080707060605040403030202018D
:100816000100000000000000FFFEFEFDFEFEFF00DE
:1008260000000000FFFEFDFDFCFCFDFEFF000001D8
:10083600000000FFFEFDFDFE0000020405050503A5
:100846000100FEFDFCFDFE000102030200FEFAF5BA
:10085600F1EEEDEDF0F5FB01080F14171817141162
:100866000D0A070606080A0D1012141414131212A4
:1008760012121315181A1B1C1B1916110B0500FB57
:10088600F7F4F3F3F5F7FBFF010406060400FBF4A7
:10089600EBE2D9D0C8C2BEBBBAB9BABABAB9B8B512
:1008A600B3B1B0B2B5BBC3CEDAE6F3FE070F151986
:1008B6001C1E2124282C31373B3D3E3C38312A2250
:1008C6001B16141519212A343F485056595A5957A0
:1008D60054514F4D4B494845423D3730271F160E60
:1008E6000600FBF6F2EFECEAE8E6E4E3E2E1E0DF3D
:1008F600DEDDDCDBD9D7D4D0CCC7C1BAB3ABA29A84
:10090600928C878484878C939DA7B2BCC4CBD0D3AA
:10091600D5D5D5D6D7D8DBDFE3E7EAEDEFF0F1F2B0
:10092600F4F7FC020B16222E39434B5154565756F8
:10093600565555555656575654524E4945403C3ACB
:1009460038393B3E42464B4F5356595B5C5C5C5ACA
:100956005651493F34261809FBEDE1D6CEC7C3C030
:10096600BEBDBCBCBCBDBEC0C3C8CCD2D7DCE0E3F8
:10097600E4E4E2DED9D4CEC8C2BCB6B1ACA6A19C32
:100986009895949495999EA4ACB4BDC6CFD8E0E84A
:10099600F0F8FF050B1014161615120E0A0501FFC6
:1009A600FDFDFE000105090C1014181C22282F3726
:1009B600404851596065696C6C6C6B696765646227
:1009C600605D5A57534F4B46423E3B3837353433BA
:1009D60032302E2C2A2725221F1C18140F0A03FD3D
:1009E600F4EBE2D9D0C7BFB8B1ABA6A19D99969357
:1009F600929090909192939596979898999A9B9D9C
:100A06009FA2A6AAAEB2B5B8BBBDBFC1C3C6CACE69
:100A1600D4DAE1E9F0F6FC01060A0E12171B2026CD
:100A26002B31363B3F4346494B4D4F515355585B4F
:100A36005D60636567696B6D6E6F7070706F6D6B0F
:100A46006864605C58534F4B46413C37312B241E3B
:100A560018120C070300FDFAF8F5F2EFECE8E4E0F3
:100A6600DBD6D2CDC9C5C1BDB9B5B1AEABA8A5A3BC
:100A7600A19F9E9C9B9A99989898999B9DA0A3A7A5
:100A8600AAADB0B2B4B5B6B7B8B9BABCBFC1C5C8DD
:100A9600CCD0D4D8DDE2E8EEF5FC030B131B2229FB
:100AA60030353A3F43474B4F5256595C5E5F606163
:100AB600626263646567696C6E7072737372716E7D
:100AC6006B67635F5B57534F4A46413B352F29237C
:100AD6001D18130E0B070401FFFBF7F2EDE7E1DB30
:100AE600D5CEC8C2BCB7B2ADA8A49F9B9793908D34
:100AF6008B89888788898A8C8E909396989B9DA0EF
:100B0600A2A5A8ABAFB2B6BABEC2C7CBCFD3D7DB0E
:100B1600E0E5EAF0F6FC01080E14191F24292E322E
:100B2600373C4045494D5155585A5D5F616365678D
:100B36006A6D707376797B7D7E7E7D7D7B79777538
:100B460073706E6B67635E59534C453E362F271F95
:100B560018100902FCF5EEE7E1DAD4CDC7C2BCB73E
:100B6600B1ACA8A39F9A96938F8C8987858483823C
:100B7600818181818283838586888A8C8E919598EE
:100B86009CA1A5AAB0B5BBC1C6CCD2D8DEE4EAF01A
:100B9600F6FC00050B11171C22272D32373C414568
:100BA6004A4E5255595C5F626466686A6B6D6D6E3B
:100BB6006E6F6E6E6D6C6B6A686664625F5D5A57C7
:100BC60053504C4844403B37322E29241F1A150FE8
:100BD6000A0500FBF6F1EBE6E1DCD7D2CEC9C5C0CB
:100BE600BCB8B4B0ADA9A6A3A19E9C9A98969594BC
:100BF60093929291929293939596989A9C9EA1A481
:100C0600A7ABAEB2B6BBBFC4C9CED3D9DEE4E9EF5B
:020C1600F5FBEC
:00000001FF

 

 

回頭來看看, ESP8266 MP3 能收台, 但是聲音就是噪噪的, 跟實際FM收音機訊號不良的狀態差不多, 不聽不知道, 一聽就分曉, 所以不管聽那一個網台或者純粹放 MP3 音樂, 情況都是一致的. 如果能夠理解為什麼, 還有寫碼的原理, 大概是可以改善的. 這裡遇到了兩個新的名詞 I2S / PCM. 因此搜尋一下世界圖書館, 看到有關 PCM 還有 I2S 的基本資料, 例如,

http://www.csie.ntnu.edu.tw/~u91029/Audio.html

http://jackho1977.blogspot.tw/2007/12/i2s.html

 

原來聲音還有那麼多相關的資訊, 對比源碼寫東西, 先看 I2S 怎樣變成 PWM 輸出, 源碼片段如下,

https://github.com/espressif/ESP8266_MP3_DECODER/blob/master/mp3/user/user_main.c


//https://github.com/espressif/ESP8266_MP3_DECODER/blob/master/mp3/user/user_main.c

//Array with 32-bit values which have one bit more set to '1' in every consecutive array index value
//table of 5 bit PWM = 32 sampling point ??
const unsigned int ICACHE_RODATA_ATTR fakePwm[]={ 
 0x00000010, 0x00000410, 0x00400410, 0x00400C10,
 0x00500C10, 0x00D00C10, 0x20D00C10, 0x21D00C10, 
 0x21D80C10, 0xA1D80C10, 0xA1D80D10, 0xA1D80D30,
 0xA1DC0D30, 0xA1DC8D30, 0xB1DC8D30, 0xB9DC8D30, 
 0xB9FC8D30, 0xBDFC8D30, 0xBDFE8D30, 0xBDFE8D32,
 0xBDFE8D33, 0xBDFECD33, 0xFDFECD33, 0xFDFECD73, 
 0xFDFEDD73, 0xFFFEDD73, 0xFFFEDD7B, 0xFFFEFD7B,
 0xFFFFFD7B, 0xFFFFFDFB, 0xFFFFFFFB, 0xFFFFFFFF
 };

static int sampToI2sPwm(short s) {
//Okay, when this is enabled it means a speaker is
//connected *directly* to the data output. Instead of
//having a nice PCM signal, we fake a PWM signal here.
static int err=0; //??
int samp=s; //16 bit PCM data, sound sample

samp=(samp+32768); //to unsigned //聲音數據上移, 0 - 65536, 正號
samp-=err; //Add the error we made when rounding the previous sample (error diffusion)

//clip value, 限幅
if (samp>65535) samp=65535;
if (samp<0) samp=0;

//send pwm value for sample value
samp=fakePwm[samp>>11]; //保留最高 5bit PCM 聲音數據
err=(samp&0x7ff); //Save rounding error. //保存餘下 11bit PCM 聲音數據

return samp; //?

待續….

 

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s