{"id":6358,"date":"2024-10-13T13:10:36","date_gmt":"2024-10-13T11:10:36","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=6358"},"modified":"2024-10-18T10:27:06","modified_gmt":"2024-10-18T08:27:06","slug":"tinyusb-audio-on-an-rp2040-in-arduino","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/","title":{"rendered":"TinyUSB: Audio on an RP2040 in Arduino"},"content":{"rendered":"<p>When I first had a look at implementing an <strong>Audio USB device for the RP2040<\/strong> with <a href=\"https:\/\/github.com\/hathach\/tinyusb\">TinyUSB<\/a>, I could make things work, but taking up the task to make this work in Arduino was too big.<\/p>\n<p>Then Adafruit released <a href=\"https:\/\/github.com\/adafruit\/Adafruit_TinyUSB_Arduino\">their TinyUSB for Arduino<\/a> that was quite nicely integrated into the <a href=\"https:\/\/github.com\/earlephilhower\/arduino-pico\">RP2040 Arduino core of Earle Phil Hower<\/a>.<\/p>\n<p>I was hoping that Adafruit would provide some audio implementation with examples.<\/p>\n<p>Since this did not happen, I decided to give it a try: Here I am documenting my experiences.<\/p>\n<h3>Design Goals for my new Adafruit_USBD_Audio class:<\/h3>\n<p>The microcontroller should be able to be an <strong>USB Audio Device<\/strong>:<\/p>\n<ul>\n<li>provide data access via <strong>callbacks<\/strong><\/li>\n<li>configure audio info via <strong>begin<\/strong> method<\/li>\n<li>implement a <strong>Speaker<\/strong> (audio sink)<\/li>\n<li>implement a <strong>Microphone<\/strong> (audio source)<\/li>\n<li>provide all potential TinyUSB audio calback methods so that we can easily create a <strong>subclass and overwrite<\/strong> them<\/li>\n<\/ul>\n<p>I was considering of implementing this as a subclass of Stream, but in the end I decided that this might be better done in my AudioTools project.<\/p>\n<h3>Device descriptors (the Microphone)<\/h3>\n<p>The first challenge was to come up with the device descriptors. I used the ones from the TinyUSB project as starting point. I wanted to have a 2 channels microphone, so I <a href=\"https:\/\/github.com\/pschatzmann\/tinyusb\/tree\/master\/examples\/device\/audio_2_channel_mic\">extended the examples<\/a> for this case and tested it with the original build environment with a Rasperry Pico RP2040.<\/p>\n<p>Next I implemented an Audio Device C++ class in <a href=\"https:\/\/github.com\/pschatzmann\/Adafruit_TinyUSB_Arduino\">my Adafruit_TinyUSB_Arduino fork<\/a> that generates the descriptor dynamically and implemented the tinyusb callbacks as virtual methods.<\/p>\n<h3>Device descriptors (the Speaker)<\/h3>\n<p>TinyUSB was providing this <a href=\"https:\/\/github.com\/pschatzmann\/tinyusb\/tree\/master\/examples\/device\/uac2_speaker_fb\">2 channel speaker example<\/a>, but this was giving compile errors. So I needed to first do some corrections to make it compile. After my corrections, it was working, so I integrated it into my C++ Aduio class as well.<\/p>\n<h3>Testing\/Debugging Tools<\/h3>\n<p>USB development is quite <strong>tricky<\/strong> since it is very difficult to track what&#8217;s happening. Using a debugger simply does not work because of the <strong>strict timing requirements<\/strong> and even adding logging commands turns out to be too slow.<\/p>\n<p>I was using the following debugging\/testing approch (in Linux):<\/p>\n<ul>\n<li>I used <strong>lsusb<\/strong> to compare my new generated device descriptor with the orignal one and first made sure that they are abolutely equal<\/li>\n<li>I used <strong>dmesg<\/strong> to check if the usb generated errors<\/li>\n<li>I added some <strong>digitalWrites<\/strong> in the callback functions and used a <strong>logic analyser<\/strong> to check if and how often some functions were called.<\/li>\n<li>I used the <strong>stacktrace of the debugger<\/strong> to pin down crashes <\/li>\n<li>I did some <strong>extensive code reviews<\/strong> to make sure that the orignal code was matching the ported C++ code.<\/li>\n<li>I used <strong>Audacity<\/strong> to test the recording and output functionality. Fortunately there is a Rescan Audio devices in the Transport menu<\/li>\n<\/ul>\n<h3>Problems with CDC (using the Microphone example)<\/h3>\n<p>Initially I deactivated CDC and the functionality was working great. But as soon as I activated CDC (Serial support) things initially were working, but when testing, just changing the sample rate in Audacity was crashing the microcontroller.<\/p>\n<p>Here the debugger came to my help and so I found that I was not the first with this issue and that there was even <a href=\"https:\/\/github.com\/hathach\/tinyusb\/pull\/1802#issuecomment-2408904235\">an open pull request<\/a> that addressed the problem. After applying it to my fork, the issue was gone!<\/p>\n<h3>Problems with CDC (using the Speaker example)<\/h3>\n<p>When I was implementing the Speaker it was also working w\/o CDC and activating CDC was immediately crashing. Here <strong>dmesg<\/strong> was giving the hint:<\/p>\n<pre><code>   [29056.169071] usb 1-1.3: config 1 interface 3 altsetting 1 has a duplicate endpoint with address 0x82, skipping\n<\/code><\/pre>\n<p>I messed up the endpoints in the device descriptor and after correcting this, things started to work as well.<\/p>\n<h3>Current Status<\/h3>\n<p>It seems to work quite nicely now. Here is a simple <strong>Arduino example microphone test sketch<\/strong>:<\/p>\n<pre><code>#include \"Adafruit_TinyUSB.h\"\n\nAdafruit_USBD_Audio usb;\n\nsize_t readCB(uint8_t* data, size_t len, Adafruit_USBD_Audio&amp; ref) {\n  int16_t* data16 = (int16_t*)data;\n  size_t samples = len \/ sizeof(int16_t);\n  size_t result = 0;\n  \/\/ generate random stereo data\n  for (int j = 0; j &lt; samples; j+=2) {\n    data16[j] = random(-32000, 32000);\n    data16[j+1] = random(-32000, 32000);;\n    result += sizeof(int16_t)*2;\n  }\n  return result;\n}\n\nvoid setup() {\n  Serial.begin(115200);\n\n  \/\/ Start USB device as Microphone\n  usb.setReadCallback(readCB);\n  usb.begin(44100, 2, 16);\n\n  if (TinyUSBDevice.mounted()) {\n    TinyUSBDevice.detach();\n    delay(10);\n    TinyUSBDevice.attach();\n  }\n}\n\nvoid loop() {\n  \/\/ optionally use LED do display status\n  usb.updateLED();\n}\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity-300x207.png\" alt=\"\" width=\"100%\" height=\"207\" class=\"alignnone size-medium wp-image-6359\" srcset=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity-300x207.png 300w, https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity-768x530.png 768w, https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity.png 947w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<h2>Dependencies<\/h2>\n<p><a href=\"https:\/\/github.com\/pschatzmann\/Adafruit_TinyUSB_Arduino\">https:\/\/github.com\/pschatzmann\/Adafruit_TinyUSB_Arduino<\/a><\/p>\n<p>Consult the Wiki to try it out in your environment.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When I first had a look at implementing an Audio USB device for the RP2040 with TinyUSB, I could make things work, but taking up the task to make this work in Arduino was too big. Then Adafruit released their TinyUSB for Arduino that was quite nicely integrated into the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6359,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[20,22],"tags":[48],"class_list":["post-6358","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-machine-sound","tag-tinyusb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TinyUSB: Audio on an RP2040 in Arduino - Phil Schatzmann<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TinyUSB: Audio on an RP2040 in Arduino - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"When I first had a look at implementing an Audio USB device for the RP2040 with TinyUSB, I could make things work, but taking up the task to make this work in Arduino was too big. Then Adafruit released their TinyUSB for Arduino that was quite nicely integrated into the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-13T11:10:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-18T08:27:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity.png\" \/>\n\t<meta property=\"og:image:width\" content=\"947\" \/>\n\t<meta property=\"og:image:height\" content=\"653\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"TinyUSB: Audio on an RP2040 in Arduino\",\"datePublished\":\"2024-10-13T11:10:36+00:00\",\"dateModified\":\"2024-10-18T08:27:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/\"},\"wordCount\":640,\"commentCount\":11,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Audacity.png\",\"keywords\":[\"TinyUSB\"],\"articleSection\":[\"Arduino\",\"Machine Sound\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/\",\"name\":\"TinyUSB: Audio on an RP2040 in Arduino - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Audacity.png\",\"datePublished\":\"2024-10-13T11:10:36+00:00\",\"dateModified\":\"2024-10-18T08:27:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Audacity.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Audacity.png\",\"width\":947,\"height\":653},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/10\\\/13\\\/tinyusb-audio-on-an-rp2040-in-arduino\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TinyUSB: Audio on an RP2040 in Arduino\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TinyUSB: Audio on an RP2040 in Arduino - Phil Schatzmann","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/","og_locale":"en_US","og_type":"article","og_title":"TinyUSB: Audio on an RP2040 in Arduino - Phil Schatzmann","og_description":"When I first had a look at implementing an Audio USB device for the RP2040 with TinyUSB, I could make things work, but taking up the task to make this work in Arduino was too big. Then Adafruit released their TinyUSB for Arduino that was quite nicely integrated into the [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/","og_site_name":"Phil Schatzmann","article_published_time":"2024-10-13T11:10:36+00:00","article_modified_time":"2024-10-18T08:27:06+00:00","og_image":[{"width":947,"height":653,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity.png","type":"image\/png"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"TinyUSB: Audio on an RP2040 in Arduino","datePublished":"2024-10-13T11:10:36+00:00","dateModified":"2024-10-18T08:27:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/"},"wordCount":640,"commentCount":11,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity.png","keywords":["TinyUSB"],"articleSection":["Arduino","Machine Sound"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/","url":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/","name":"TinyUSB: Audio on an RP2040 in Arduino - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity.png","datePublished":"2024-10-13T11:10:36+00:00","dateModified":"2024-10-18T08:27:06+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/10\/Audacity.png","width":947,"height":653},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/10\/13\/tinyusb-audio-on-an-rp2040-in-arduino\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"TinyUSB: Audio on an RP2040 in Arduino"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6358","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=6358"}],"version-history":[{"count":32,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6358\/revisions"}],"predecessor-version":[{"id":6391,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6358\/revisions\/6391"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/6359"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=6358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=6358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=6358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}