{"id":2801,"date":"2023-08-19T12:28:00","date_gmt":"2023-08-19T04:28:00","guid":{"rendered":"https:\/\/gergely.imreh.net\/blog\/?p=2801"},"modified":"2023-08-19T12:28:05","modified_gmt":"2023-08-19T04:28:05","slug":"making-a-usb-mute-button-for-online-meetings","status":"publish","type":"post","link":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/","title":{"rendered":"Making a USB Mute Button for Online Meetings"},"content":{"rendered":"\n<p>I use Google Meet every day for (potentially hours of) online meetings at work, so it&#8217;s very easy to notice when things change and for example new features are available. Recently I&#8217;ve found a new &#8220;Call Control&#8221; section in the settings that promised a lot of fun, <a href=\"https:\/\/support.google.com\/meet\/answer\/12562325?hl=en\">connecting USB devices to control my calls<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><img decoding=\"async\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/Screenshot-2023-08-19-at-07.05.34.png\" alt=\"Screenshot of the Google Meet Settings menu during calls, showing the call control menu and a call-out to connect my USB device.\" class=\"wp-image-2803\"\/><figcaption class=\"wp-element-caption\">Google Meet Settings menu during a call, witht the Call control section<\/figcaption><\/figure>\n\n\n\n<p>As someone who enjoys (or drawn to, or sort-of obscessed with) <a href=\"https:\/\/gergely.imreh.net\/blog\/category\/maker\/\">hacking on hardware<\/a>, this was a nice call of action: let&#8217;s cobble together a custom USB button that can do some kind of call control<sup data-fn=\"7509dd7d-2867-4955-808e-d9bd3a9e8cd4\" class=\"fn\"><a href=\"#7509dd7d-2867-4955-808e-d9bd3a9e8cd4\" id=\"7509dd7d-2867-4955-808e-d9bd3a9e8cd4-link\">1<\/a><\/sup>: say muting myself in the call, showing mute status, hanging up, etc.<\/p>\n\n\n\n<p>This kicked off such a deep rabbit hole that I barely made it back up to the top, but one that seeded a crazy amount of future opportunities. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>And as a shortcut, there&#8217;s a <a href=\"#demo\">demo<\/a> below to showcase where I got to.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Finding suitable hardware<\/h2>\n\n\n\n<p>This step was harder than I&#8217;ve expected, given that I have drawers and drawers of gadgets, but I&#8217;m likely a bit out of practice, and also out of date. What I was looking for is<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Being able to show up as a USB device (must)<\/li>\n\n\n\n<li>Have built in button (optional) or easy connectivity of buttons without breadboard for now<\/li>\n\n\n\n<li>Have built in LED (optional) or some other way of showing 1 bit of information<\/li>\n<\/ul>\n\n\n\n<p>This doesn&#8217;t sound hard, right?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ReSpeaker<\/h3>\n\n\n\n<p>The first option that came up was Seeed Studio&#8217;s <a href=\"https:\/\/wiki.seeedstudio.com\/ReSpeaker_Core\/\">ReSpeaker Core<\/a> that I had two of at hand: Arduino Leonardo compatibility, touch sensors for buttons, and an LED ring (the &#8220;Pixel Ring&#8221;). Turns out that they have been <em>discontinued<\/em> &#8211; which should be fine for now; but also my models are two different <em>pre-release prototypes<\/em> Seeed gave away for testers. Thus they are not quite like the final version, have different hardware on board here and there, so an experimental experience is expected.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/respeaker_core_prototypes-1024x572.jpg\" alt=\"Photo of two ReSpeaker Core boards\" class=\"wp-image-2809\"\/><figcaption class=\"wp-element-caption\">ReSpeaker core samples to work with<\/figcaption><\/figure>\n\n\n\n<p>The earlier prototype only has touch sensors on one side, the pixel ring lights up, but I couldn&#8217;t control it with <a href=\"https:\/\/github.com\/respeaker\/respeaker_arduino_library\">Seeed&#8217;s ReSpeaker Arduino library<\/a>. The later prototype has two sides of sensors (effectively two buttons), but the lights don&#8217;t seem to work<sup data-fn=\"17ce950a-5b32-45de-8a5c-2464146a1840\" class=\"fn\"><a href=\"#17ce950a-5b32-45de-8a5c-2464146a1840\" id=\"17ce950a-5b32-45de-8a5c-2464146a1840-link\">2<\/a><\/sup>. Regardless this <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Aside: alternatives considered<\/h3>\n\n\n\n<p>It was illuminating to see how much abandoned, obsolete, discontinued, or not quite useful hardware boards do I have.<\/p>\n\n\n\n<p>One is RFDuino, that I got from <a href=\"https:\/\/www.kickstarter.com\/projects\/1608192864\/rfduino-iphone-bluetooth-40-arduino-compatible-boa\/\">Kickstarter<\/a>, I&#8217;m yet to use, and all the project&#8217;s websites have already disappeared &#8211; fortunately not the <a href=\"https:\/\/github.com\/RFduino\/RFduino\">code repo<\/a>. This would have been a more complex solution anyways, but wireless! Use one RFDuino to expose a USB Telephony device, and communicate wirelessly to another that operates the light and button on battery. Pretty cool. Also, it might not have worked if the chip used cannot do the cruicial &#8220;expose a USB [device]&#8221; part of the plan.<\/p>\n\n\n\n<p>Other option that popped up was an <a href=\"https:\/\/store.arduino.cc\/products\/arduino-nano\">Arduino Nano<\/a> + my own made <a href=\"https:\/\/www.tindie.com\/products\/imrehg\/grovehat-for-arduino-nano\/\">GroveHat<\/a> + a <a href=\"https:\/\/wiki.seeedstudio.com\/Grove-Button\/\">Grove Button<\/a>. Except, the Nano definitely cannot be a custom USB device, so there goes nothing.<\/p>\n\n\n\n<p>Besides these, I&#8217;ve found plenty of:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>single board computers (old or obsolete),<\/li>\n\n\n\n<li>FPGAs (never used, and would be a whole different project to implement something on them), and <\/li>\n\n\n\n<li>other microcontrollers that all have interesting specialties, but don&#8217;t tick the mandatory boxes&#8230;<\/li>\n<\/ul>\n\n\n\n<p>These boards might not be right for now, but definitely there are projects in store for them (if only thre&#8217;s time).<\/p>\n\n\n\n<p>Back to ReSpeaker then&#8230;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Plugging in the USB<\/h2>\n\n\n\n<p>The next thing is to figure out what&#8217;s really happening when an USB device is plugged in and it shows the operating system that it can do certain things. That is, how does Meet know that there&#8217;s a compatible device to connect to?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The USB HID docs<\/h3>\n\n\n\n<p>This is answered by the <a href=\"https:\/\/www.usb.org\/hid\">USB Human Interface Devices (HID)<\/a> specs &#8212; one that is pretty complicated, has a lot of legacy bits, and need a different kind of mindset. In a nutshell, though, with my current, partial understanding:<\/p>\n\n\n\n<p>On connection the device sends a &#8220;report&#8221; to the OS that details on what can it do, including:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>what kind (or kinds!) of device it is?<\/li>\n\n\n\n<li>what functionality of the kind is available in this particular implementation?<\/li>\n\n\n\n<li>what&#8217;s the data layout to pass control information back-and-forth for this implementation?<\/li>\n<\/ul>\n\n\n\n<p>In our example, a very minimal setup would would be:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I&#8217;m a Telephony Device (Usage page <code>0x0B<\/code>)<\/li>\n\n\n\n<li>I implement a generic &#8220;Phone&#8221; (Usage ID <code>0x01<\/code>)<\/li>\n\n\n\n<li>I have capability to do a &#8220;Phone Mute&#8221; (Usage ID <code>0x2F<\/code>)<\/li>\n\n\n\n<li>Here&#8217;s the 1 bit of a 1 byte payload that conveys that phone mute status<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/Screenshot-2023-08-19-at-07.55.31-1024x920.png\" alt=\"Screenshot of the beginning of the Telephony Device section from the HID Usage Tables\" class=\"wp-image-2808\"\/><figcaption class=\"wp-element-caption\">Getting started with Telephony devices from the HID Usage Tables<\/figcaption><\/figure>\n\n\n\n<p>This course does not take into account other functionality, e.g.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I can also hang up &#8211; Hook Switch, Usage ID <code>0x20<\/code>;<\/li>\n\n\n\n<li>I have status LEDs &#8211; that&#8217;s a whole fun of redefining functions on the LED Page <code>0x08<\/code>;<\/li>\n<\/ul>\n\n\n\n<p>and so on. But for the time being this should be enough.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/Screenshot-2023-08-19-at-06.59.56-1024x924.png\" alt=\"The Call Control usages abd their description from the HID Usage Tables document\" class=\"wp-image-2806\"\/><figcaption class=\"wp-element-caption\">Call Control functionality for Telefony devices<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Device implementation<\/h3>\n\n\n\n<p>Fortunately we can stand on the shoulders of giants, that is the <a href=\"https:\/\/github.com\/NicoHood\/HID\">Arduino HID Project<\/a> which implemented a bunch of different devices. And even though a &#8220;phone&#8221; like this is not among them, we can make some reasonable guesses how it would work.<\/p>\n\n\n\n<p>Having said that, from a forum post that was also trying to do something similar (but based on the TinyUSB library):<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>HID report descriptor is very difficult thing to come up by oneself. You should google around, or dump report descriptor from existing device to copy\/follow it.<\/p>\n<cite><a href=\"https:\/\/github.com\/hathach\/tinyusb\/discussions\/667#discussioncomment-392454\">hathach @ TinyUSB discussion 667<\/a><\/cite><\/blockquote>\n\n\n\n<p>Okay, then do not come up with this stuff, instead let&#8217;s look for tools. The USB HID homepage links to the <a href=\"https:\/\/github.com\/microsoft\/hidtools\">Microsoft HID Tools<\/a> to generate HID reports from a TOML-like language. Except it needs C# and I just wasn&#8217;t ready to dive in a side-quest to install &amp; learn a new toolchain.<\/p>\n\n\n\n<p>So being lazy this way, a bit more sleuthing turned up <a href=\"https:\/\/web.archive.org\/web\/20210614160735\/https:\/\/blog.noser.com\/first-steps-with-an-usb-hid-report\/\">someone&#8217;s example HID report<\/a> for a device very close to what I&#8217;m trying to do, hurray!<\/p>\n\n\n\n<p>I took this and started to poke around the HID project to see how other devices are implemented. Troubleshooting by using the ReSpeaker&#8217;s touch to adjust screen brightness up \/ down (as a &#8220;Consumer Device&#8221;) was also pretty neat! In the end I took the system buttons example and run with that one.<\/p>\n\n\n\n<p>Having said that, the HID report is really just the interface. The devil is in how to implement actually creating the data packages that passes data according to the report definition. And this is the case when I wish I knew more C++ but copy-paste and some guesswork will have to do.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/Screenshot-2023-08-19-at-08.48.30-1024x519.png\" alt=\"Screenshot of the Phone HID report definition code\" class=\"wp-image-2814\"\/><figcaption class=\"wp-element-caption\">Our minimal viable mute button&#8217;s HID report (<a href=\"https:\/\/github.com\/imrehg\/HID\/blob\/1851b68b008111734287f6ce4f894173ad21bb3f\/src\/MultiReport\/Phone.cpp#L26C1-L41C1\">source<\/a>)<\/figcaption><\/figure>\n\n\n\n<p>The current result lives in the &#8220;<a href=\"https:\/\/github.com\/imrehg\/HID\/tree\/phone\">phone&#8221; branch of my HID Project fork<\/a>, check for the &#8220;Phone&#8221; bits in &#8220;src\/HID-APIs&#8221; and &#8220;MultiReport&#8221; folders, if interested.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Minimal viable mute<\/h2>\n\n\n\n<p>The implementation from this point on was pretty straightforward &#8211; since we cut back the scope so much&#8230;<\/p>\n\n\n\n<p>The code to run on the ReSpeaker then just has to do the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>when touching one side, send a report with &#8220;Phone Mute&#8221; on<\/li>\n\n\n\n<li>when touching the other, send a report with &#8220;Phone Mute&#8221; off<\/li>\n<\/ul>\n\n\n\n<p>And this is sort of simple<sup data-fn=\"c40b4257-a075-44fc-aefb-e036c5cb3543\" class=\"fn\"><a href=\"#c40b4257-a075-44fc-aefb-e036c5cb3543\" id=\"c40b4257-a075-44fc-aefb-e036c5cb3543-link\">3<\/a><\/sup> :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"870\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/arduino-code-for-phone-mute-events-1024x870.png\" alt=\"Screenshot of the Arduino code to send the right mute events\" class=\"wp-image-2821\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/arduino-code-for-phone-mute-events-1024x870.png 1024w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/arduino-code-for-phone-mute-events-500x425.png 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/arduino-code-for-phone-mute-events-768x653.png 768w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/arduino-code-for-phone-mute-events.png 1198w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Sending data on touch events in the simplest way<\/figcaption><\/figure>\n\n\n\n<p id=\"demo\">For the full use case there would be a lot more complexity for both reading and writing data from the host, controlling multiple peripherals (LEDs and buttons) and the whole logic around it. But for now, it&#8217;s good enough for a demo:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"A custom USB HID mute button for Google Meet\" width=\"580\" height=\"435\" src=\"https:\/\/www.youtube.com\/embed\/Mz-B7sYGLUI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">A very quick demo<\/figcaption><\/figure>\n\n\n\n<p>The code repository is available on Github at <a href=\"https:\/\/github.com\/imrehg\/arduino-usb-phone-hid\">imrehg\/arduino-usb-phone-hid<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Notes and Future work<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">The specs<\/h3>\n\n\n\n<p>It&#8217;s great that stuff from 20+ years ago still works mostly the same way. The <a href=\"https:\/\/www.usb.org\/sites\/default\/files\/hut1_4.pdf\">latest 1.4 version<\/a> of the HID Tables is nicely formatted, has a lot more device typed defined, but has much less support text. Originally I&#8217;ve read the <a href=\"https:\/\/www.usb.org\/sites\/default\/files\/documents\/hut1_12v2.pdf\">1.12v2 version<\/a> as that showed up in my search. Back then in 2004 they had an &#8220;examples&#8221; section (see the Telephone at Appendix 10!) which is useful to grok more of the fundamentals. <\/p>\n\n\n\n<p>The newer version also has some devices types that looked suitable, but weren&#8217;t really: Generic Desktop Page (<code>0x01<\/code>) and <code>0xE0-E2<\/code> Usage IDs for Call Active LED, Call Mute Toggle, and Call Mute LED respectively. These didn&#8217;t seem to work with Meet, so it might be interesting to try implementing a device that does both and try other online call software.<\/p>\n\n\n\n<p>I should also have read the spec more before diving into hacking on the HID implementation fork, as there&#8217;s a lot more information in the <a href=\"https:\/\/www.usb.org\/document-library\/device-class-definition-hid-111\">HID Device Class Definition<\/a>, including how to construct the values for many of the fields (I&#8217;m looking at you &#8220;<code>INPUT (Cnst,Var,Abs)<\/code>&#8220;). RTFM is and remains a solid advice &#8211; and not just when one thinks there&#8217;s time.<\/p>\n\n\n\n<p>Also regarding the specs: some of them I only find in the Internet Archive&#8217;s <a href=\"https:\/\/web.archive.org\/\">Wayback Machine<\/a>. If you encounter a good source that should be kept, always add it to the Wayback Machine and preserve it for your future selves and others!<\/p>\n\n\n\n<p>This exploration of USB HID pulled on so many threads, and left so much unfinished, that it&#8217;s a fertile ground for the future, even more than most previous projects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">More call functionality<\/h3>\n\n\n\n<p>The most obvious thing is to implement the whole setup with the buttons. I&#8217;ve tried Hook Switch to hang up a call, that works too. Could add status lights, maybe throw in some &#8220;Active Call&#8221; LEDs, or so on. This requires better understanding how data is sent over the wire for USB and how to handle incoming data. The Arduino examples rarely seem to use the &#8220;Output&#8221; fields (ie. incoming data, output from the host&#8217;s point of view, but maybe <a href=\"https:\/\/github.com\/hathach\/tinyusb\">TinyUSB<\/a> does ?<\/p>\n\n\n\n<p>For this, it would be nice to find a different hardware platform that would make this more seamless (so I can concentrate on the software side more). If that platform would lend itself to be reproduced or made stand alone, that would be even nicer: imaging brining my little call control box that can be used with other computers easily as well&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implement more USB HID devices<\/h3>\n\n\n\n<p>The <a href=\"https:\/\/github.com\/NicoHood\/HID\">Arduino HID project<\/a> has a bunch of devices implemented, but there are an infinite numbers that could be added. Unfortunately for Arduino it is harder to add more device types as an add-on to this library versus the current &#8220;forked&#8221; approach<sup data-fn=\"d18cdbdc-1733-40b6-a512-81c55a158ce0\" class=\"fn\"><a href=\"#d18cdbdc-1733-40b6-a512-81c55a158ce0\" id=\"d18cdbdc-1733-40b6-a512-81c55a158ce0-link\">4<\/a><\/sup>, so new decices should be in the main project, eventually.<\/p>\n\n\n\n<p>So far there&#8217;s no Telephony device implemented there and it would be nice to find the right level of abstraction that works. The library doesn&#8217;t implement specific HID table pages, but specific usages or a subset of a usage. Thus like always, the hardest part would likely be setting the right interface (the right specs and &#8220;API&#8221;) for a new device to implement both the HID reports and the functions that manipulate what&#8217;s being sent and when.<\/p>\n\n\n\n<p>On the other hand, that does sound like a fun experiment, and I&#8217;d look forward to adding 3D Game Controllers (Game Controls Page <code>0x05<\/code>), Environmental Sensors (Sensors Page <code>0x20<\/code>, Usage ID <code>0x30-3B<\/code>), &#8230; or even a Submarine Simulation Device (Simulation Device page <code>0x02<\/code>, usage id <code>0x05<\/code>). These are stuff I go to Hackerspaces for&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">WebHID for internet plus USB<\/h3>\n\n\n\n<p>While debugging this HID device behaviour, I found also <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/WebHID_API\">WebHID<\/a> that brings such devices to the web. This feature seems to be behind Meet&#8217;s and other phone systems like <a href=\"https:\/\/www.3cx.com\/blog\/docs\/webhid-headset-integration\/\">3CX<\/a> expanding USB support outside of the OS and into the browser. And no, <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1835412\">Firefox does not support it<\/a>, furthermore <a href=\"https:\/\/mozilla.github.io\/standards-positions\/#webhid\">declined supporting it<\/a>.<\/p>\n\n\n\n<p>Nonetheless it&#8217;s very cool that (if I upskill a bit), I can create a web page that would help me debug such HID development:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HID\/requestDevice\">request devices<\/a> that are filtered in various ways (vendor, product is standard, but usage page and explicit usage is the main key). This is likely what Meet does as well, &#8220;just gimme devices with Telephony usage page (or Phone usage? Need to check exactly) <\/li>\n\n\n\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HIDDevice\/collections\">read the HID report collections<\/a> sent by the device, so the results can be debugged, and<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HIDInputReportEvent\">read device input events<\/a> that we can then either log for debugging or in an application react to to it<\/li>\n<\/ul>\n\n\n\n<p>This opens a lot more mashup opportunities by the dozen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Finally<\/h2>\n\n\n\n<p>Unlike most other projects I had where I&#8217;m focused on one specific outcome, this turned out to be more focusing on getting a new toolkit (custom USB devices) up and running, so I can think about a wider <em>types<\/em> of projects to do. In that sense, this feels a big success, even if I know how little I know about programming outside of my day-to-day environment. But ignorance is not a bliss.<\/p>\n\n\n\n<p>And now, going on mute.<\/p>\n\n\n<ol class=\"wp-block-footnotes\"><li id=\"7509dd7d-2867-4955-808e-d9bd3a9e8cd4\">Many moons past I used to use a Jabra Evolve 80, that has <a href=\"https:\/\/www.manualslib.com\/manual\/1021017\/Jabra-Evolve-80.html?page=16#manual\">a USB accessory<\/a> controlling call features, so I did have first hand example of what sort of experience I&#8217;d like. <a href=\"#7509dd7d-2867-4955-808e-d9bd3a9e8cd4-link\" aria-label=\"Jump to footnote reference 1\">\u21a9\ufe0e<\/a><\/li><li id=\"17ce950a-5b32-45de-8a5c-2464146a1840\">I&#8217;ve tried reviewing the <a href=\"https:\/\/github.com\/respeaker\/get_started_with_respeaker\/blob\/master\/files\/RespeakerCorev1.0_Schematic.pdf\">hardware schematics<\/a>, looking into the <a href=\"https:\/\/github.com\/respeaker\/respeaker_arduino_library\/blob\/4e04f8c72fa53beeb27dacd8d729a90f79202db7\/pixels.cpp\">pixel ring control functions<\/a>, and given that the LEDs seems standard I&#8217;ve also attempted to use the <a href=\"http:\/\/fastled.io\/\">FastLED library<\/a> to drive them instead, so far nothing. I still bet on hardware differences from final schematic + my inability to debug it, but it can be faulty hardware just as well. Needs more effort &#8211; in the future. <a href=\"#17ce950a-5b32-45de-8a5c-2464146a1840-link\" aria-label=\"Jump to footnote reference 2\">\u21a9\ufe0e<\/a><\/li><li id=\"c40b4257-a075-44fc-aefb-e036c5cb3543\">The Arduino code became more &#8220;simple&#8221; once I realised that things set up this way do not need debouncing for the touch sensors. In other cases that would be essential, there&#8217;s sooo much flaky signal to use those terminals as momentary switches or similar. <a href=\"#c40b4257-a075-44fc-aefb-e036c5cb3543-link\" aria-label=\"Jump to footnote reference 3\">\u21a9\ufe0e<\/a><\/li><li id=\"d18cdbdc-1733-40b6-a512-81c55a158ce0\">At least I don&#8217;t know how nicely extend a library for C++, if that&#8217;s even possible. Keen to learn, though. <a href=\"#d18cdbdc-1733-40b6-a512-81c55a158ce0-link\" aria-label=\"Jump to footnote reference 4\">\u21a9\ufe0e<\/a><\/li><\/ol>","protected":false},"excerpt":{"rendered":"<p>Since Google Meet teases us to add a USB device to controll calls, let&#8217;s learn how to teach an Arduino clone to act like a phone mute button, and thus ultimately being capable to act like an infinite variety of peripheral devices.<\/p>\n","protected":false},"author":1,"featured_media":2832,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"[{\"content\":\"Many moons past I used to use a Jabra Evolve 80, that has <a href=\\\"https:\/\/www.manualslib.com\/manual\/1021017\/Jabra-Evolve-80.html?page=16#manual\\\">a USB accessory<\/a> controlling call features, so I did have first hand example of what sort of experience I'd like.\",\"id\":\"7509dd7d-2867-4955-808e-d9bd3a9e8cd4\"},{\"content\":\"I've tried reviewing the <a href=\\\"https:\/\/github.com\/respeaker\/get_started_with_respeaker\/blob\/master\/files\/RespeakerCorev1.0_Schematic.pdf\\\">hardware schematics<\/a>, looking into the <a href=\\\"https:\/\/github.com\/respeaker\/respeaker_arduino_library\/blob\/4e04f8c72fa53beeb27dacd8d729a90f79202db7\/pixels.cpp\\\">pixel ring control functions<\/a>, and given that the LEDs seems standard I've also attempted to use the <a href=\\\"http:\/\/fastled.io\/\\\">FastLED library<\/a> to drive them instead, so far nothing. I still bet on hardware differences from final schematic + my inability to debug it, but it can be faulty hardware just as well. Needs more effort - in the future.\",\"id\":\"17ce950a-5b32-45de-8a5c-2464146a1840\"},{\"content\":\"The Arduino code became more \\\"simple\\\" once I realised that things set up this way do not need debouncing for the touch sensors. In other cases that would be essential, there's sooo much flaky signal to use those terminals as momentary switches or similar.\",\"id\":\"c40b4257-a075-44fc-aefb-e036c5cb3543\"},{\"content\":\"At least I don't know how nicely extend a library for C++, if that's even possible. Keen to learn, though.\",\"id\":\"d18cdbdc-1733-40b6-a512-81c55a158ce0\"}]"},"categories":[111,8],"tags":[88,240,192,133,239],"class_list":["post-2801","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-maker","category-prog","tag-arduino","tag-c","tag-seeed-studio","tag-usb","tag-usb-hid"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Making a USB Mute Button for Online Meetings - ClickedyClick<\/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:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Making a USB Mute Button for Online Meetings - ClickedyClick\" \/>\n<meta property=\"og:description\" content=\"Since Google Meet teases us to add a USB device to controll calls, let&#039;s learn how to teach an Arduino clone to act like a phone mute button, and thus ultimately being capable to act like an infinite variety of peripheral devices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/\" \/>\n<meta property=\"og:site_name\" content=\"ClickedyClick\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/gergely.imreh\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/gergely.imreh\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-19T04:28:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-19T04:28:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/usb-hid-device-muter.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2389\" \/>\n\t<meta property=\"og:image:height\" content=\"972\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Gergely Imreh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@imrehg\" \/>\n<meta name=\"twitter:site\" content=\"@imrehg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gergely Imreh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/\"},\"author\":{\"name\":\"Gergely Imreh\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"headline\":\"Making a USB Mute Button for Online Meetings\",\"datePublished\":\"2023-08-19T04:28:00+00:00\",\"dateModified\":\"2023-08-19T04:28:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/\"},\"wordCount\":2169,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"image\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/usb-hid-device-muter.jpg\",\"keywords\":[\"arduino\",\"C++\",\"Seeed Studio\",\"USB\",\"USB HID\"],\"articleSection\":[\"Maker\",\"Programming\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/\",\"name\":\"Making a USB Mute Button for Online Meetings - ClickedyClick\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/usb-hid-device-muter.jpg\",\"datePublished\":\"2023-08-19T04:28:00+00:00\",\"dateModified\":\"2023-08-19T04:28:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/usb-hid-device-muter.jpg\",\"contentUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/usb-hid-device-muter.jpg\",\"width\":2389,\"height\":972,\"caption\":\"And, like that, he's gone.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2023\\\/08\\\/making-a-usb-mute-button-for-online-meetings\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Making a USB Mute Button for Online Meetings\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/\",\"name\":\"ClickedyClick\",\"description\":\"Life in real, complex and digital.\",\"publisher\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\",\"name\":\"Gergely Imreh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"caption\":\"Gergely Imreh\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\"},\"description\":\"Physicist, hacker. Enjoys avant-guarde literature probably a bit too much. Open source advocate and contributor, both for software and hardware. Follow these posts on the Fediverse by @gergely@gergely.imreh.net\",\"sameAs\":[\"https:\\\/\\\/gergely.imreh.net\\\/\",\"https:\\\/\\\/www.facebook.com\\\/gergely.imreh\",\"https:\\\/\\\/www.instagram.com\\\/imrehg\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/gergelyimreh\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@GergelyImreh\"],\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/author\\\/gergely\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Making a USB Mute Button for Online Meetings - ClickedyClick","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:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/","og_locale":"en_GB","og_type":"article","og_title":"Making a USB Mute Button for Online Meetings - ClickedyClick","og_description":"Since Google Meet teases us to add a USB device to controll calls, let's learn how to teach an Arduino clone to act like a phone mute button, and thus ultimately being capable to act like an infinite variety of peripheral devices.","og_url":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/","og_site_name":"ClickedyClick","article_publisher":"https:\/\/www.facebook.com\/gergely.imreh","article_author":"https:\/\/www.facebook.com\/gergely.imreh","article_published_time":"2023-08-19T04:28:00+00:00","article_modified_time":"2023-08-19T04:28:05+00:00","og_image":[{"width":2389,"height":972,"url":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/usb-hid-device-muter.jpg","type":"image\/jpeg"}],"author":"Gergely Imreh","twitter_card":"summary_large_image","twitter_creator":"@imrehg","twitter_site":"@imrehg","twitter_misc":{"Written by":"Gergely Imreh","Estimated reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/#article","isPartOf":{"@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/"},"author":{"name":"Gergely Imreh","@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"headline":"Making a USB Mute Button for Online Meetings","datePublished":"2023-08-19T04:28:00+00:00","dateModified":"2023-08-19T04:28:05+00:00","mainEntityOfPage":{"@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/"},"wordCount":2169,"commentCount":2,"publisher":{"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"image":{"@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/#primaryimage"},"thumbnailUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/usb-hid-device-muter.jpg","keywords":["arduino","C++","Seeed Studio","USB","USB HID"],"articleSection":["Maker","Programming"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/","url":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/","name":"Making a USB Mute Button for Online Meetings - ClickedyClick","isPartOf":{"@id":"https:\/\/gergely.imreh.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/#primaryimage"},"image":{"@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/#primaryimage"},"thumbnailUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/usb-hid-device-muter.jpg","datePublished":"2023-08-19T04:28:00+00:00","dateModified":"2023-08-19T04:28:05+00:00","breadcrumb":{"@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/#primaryimage","url":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/usb-hid-device-muter.jpg","contentUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2023\/08\/usb-hid-device-muter.jpg","width":2389,"height":972,"caption":"And, like that, he's gone."},{"@type":"BreadcrumbList","@id":"https:\/\/gergely.imreh.net\/blog\/2023\/08\/making-a-usb-mute-button-for-online-meetings\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gergely.imreh.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Making a USB Mute Button for Online Meetings"}]},{"@type":"WebSite","@id":"https:\/\/gergely.imreh.net\/blog\/#website","url":"https:\/\/gergely.imreh.net\/blog\/","name":"ClickedyClick","description":"Life in real, complex and digital.","publisher":{"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gergely.imreh.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0","name":"Gergely Imreh","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","caption":"Gergely Imreh"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g"},"description":"Physicist, hacker. Enjoys avant-guarde literature probably a bit too much. Open source advocate and contributor, both for software and hardware. Follow these posts on the Fediverse by @gergely@gergely.imreh.net","sameAs":["https:\/\/gergely.imreh.net\/","https:\/\/www.facebook.com\/gergely.imreh","https:\/\/www.instagram.com\/imrehg\/","https:\/\/www.linkedin.com\/in\/gergelyimreh\/","https:\/\/www.youtube.com\/@GergelyImreh"],"url":"https:\/\/gergely.imreh.net\/blog\/author\/gergely\/"}]}},"_links":{"self":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2801","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/comments?post=2801"}],"version-history":[{"count":31,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2801\/revisions"}],"predecessor-version":[{"id":2840,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2801\/revisions\/2840"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/media\/2832"}],"wp:attachment":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/media?parent=2801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/categories?post=2801"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/tags?post=2801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}