tynet-lichat/stevenchan - IRC Chatlog
Search
8:57:08
gingerale
Ah, hm.. This isn't good. I had forgotten to mark my work hours since the hours for last month's pay. The usual date by which I'd need them is 15th of a month.
8:58:17
gingerale
And I currently don't have enough to last more than to the end of the month, so.. I don't have enough for rent and such unless I take all of my savings out. Or increase my debit card's limit to something like 3000 eur.
13:41:52
PincerAttack
Before I forget again, I wanted to ask you something. Sister wanted a drawing from you for her birthday, if it's possible.
13:50:09
shinmera
WHAT https://news.xbox.com/en-us/2022/01/18/welcoming-activision-blizzard-to-microsoft-gaming/
13:50:09
Colleen
news.xbox.com/en-us/2022/01... Website (HTML), Title: Welcoming the Incredible Teams and Legendary Franchises of Activision Blizzard to Microsoft Gaming -
13:50:09
Colleen
news.xbox.com/en-us/2022/01... Website (HTML), Title: Welcoming the Incredible Teams and Legendary Franchises of Activision Blizzard to Microsoft Gaming -
14:57:40
suntmc
i want to make the ESP32 receive audio via bluetooth (via A2DP). there's that guy who made a simplified library using Espressif's stuff
14:58:02
suntmc
like, it's really convenient to set up and it works. but...as soon as you want to do something a bit more, it does not work anymore
14:59:24
suntmc
'virtual void BluetoothA2DPSink::execute_avrc_command(int)' is protected within this context
15:01:16
suntmc
how do you access virtual functions? like, i can execute _some_ functions from that header file, but not all
15:07:29
suntmc
WELP. guess i fork the code and put in a volume up and volume down command wrapper. fucking stupid
15:07:33
shinmera
A 'virtual' function means it has dynamic dispatch -- which method gets invoked depends on the runtime type. So if the declared type is class A, but the instance is of B ( a subclass of A), then the method defined on B is invoked, not A.
15:08:16
shinmera
For non-virtual functions the dispatch is static and determined entirely by the declared type of the variable.
15:08:41
suntmc
i really appreciate you trying to explain this, but you explain one thing i do not understand with other things i do not understand
15:10:00
shinmera
Classes in this style carry two things: data in the form of fields, and functions, in the form of methods.
15:11:14
shinmera
Now, when you call a function on an instance of a class, the system has to figure out which actual method to call, as the subclass might also define a method with the same name and arguments that "overrides" the parent's
15:11:38
shinmera
In python, everything is done via "dynamic dispatch" wherein the method is figured out by what class your instance is actually from
15:12:03
shinmera
In C++ by default everything is done via "static dispatch" wherein the method is figured out by what type you declared your instance to be, rather than what it is actually created from.
15:12:19
shinmera
That is, *unless* you declare the method as virtual, in which case it does dynamic dispatch.
15:14:15
suntmc
https://github.com/pschatzmann/ESP32-A2DP/blob/4cfe05624a6b6b1abbd783fcff0ee9ccb1978579/src/BluetoothA2DPSink.h
15:14:15
Colleen
github.com/pschatzmann/ESP3... Website (HTML), Title: ESP32-A2DP/BluetoothA2DPSink.h at 4cfe05624a6b6b1abbd783fcff0ee9ccb1978579 · pschatzmann/ESP32-A2DP ·
15:14:15
Colleen
github.com/pschatzmann/ESP3... Website (HTML), Title: ESP32-A2DP/BluetoothA2DPSink.h at 4cfe05624a6b6b1abbd783fcff0ee9ccb1978579 · pschatzmann/ESP32-A2DP ·
15:16:17
suntmc
so, basically all I need to do to get sound output is create a class instance (right word?) by using BluetoothA2DPSink MySink;
15:16:50
suntmc
then, i can just configure the pins it has to use as output and other sound related settings and then start it with MySink.begin();. pretty simple
15:17:35
suntmc
the problem arises when I want to change the volume not using my phone but a push button connected to the ESP
15:18:41
suntmc
there is a public function 'MySink.set_volume(int volume);' to set it. the problem is, this does not set the volume on my phone. with A2DP, the phone sends and receives data using AVCR. stuff like track position, meta data etc. but also it accepts commands like next track etc.
15:19:18
suntmc
so if i set the volume (going from 0 - 127) using set_volume, it'll set it locally. it overrides whatever volume the phone was set to
15:20:06
suntmc
if i set it to roughly 50%, the phone is still on whatever it was set before. but then the max volume is 50%. When i turn up my phone, 100% there will still be 50%, since it's limited locally on the ESP
15:20:48
suntmc
i've checked Espressif's docs and they support basically all AVCR commands. there's one that's 'volume up'. all i need to do is make that button send this command to the phone
15:21:33
suntmc
the frustrating part is, that guy implemented public methods like virtual void pause(); that do this, except with another command of course
15:22:24
suntmc
pause() is public and the other method is protected. i guess it's easiest to just write a public method into the source code
15:22:41
shinmera
All you need to do for that is to create a subclass of BluetoothA2DPSink, add a new public method that invokes that function, and then call your new public method from your main thing.
15:24:10
suntmc
https://github.com/pschatzmann/ESP32-A2DP/blob/33dbcc80bd3f95c6b23e3219c82e56442c89422f/src/BluetoothA2DPSink.cpp#:~:text=void%20BluetoothA2DPSink%3A%3A-,play,-()%7B
15:24:10
Colleen
github.com/pschatzmann/ESP3... Website (HTML), Title: ESP32-A2DP/BluetoothA2DPSink.cpp at 33dbcc80bd3f95c6b23e3219c82e56442c89422f · pschatzmann/ESP32-A2DP
15:24:10
Colleen
github.com/pschatzmann/ESP3... Website (HTML), Title: ESP32-A2DP/BluetoothA2DPSink.cpp at 33dbcc80bd3f95c6b23e3219c82e56442c89422f · pschatzmann/ESP32-A2DP
15:24:35
suntmc
if you check here in the .cpp file, couldn't i just copy the play function, rename it and make a vol_up one?
15:25:02
shinmera
Sure you could. But it would require changing the original source code. You can do what you want without having to do that.
15:25:58
suntmc
ok so creating a new class would be a way to solve the problem without me having to rewrite the original source?
15:27:25
shinmera
class MySink : public BluetoothA2DPSink { public: virtual void dec_volume(); virtual void inc_volume(); } void MySink::dec_volume(){ execute_avrc_command(ESP_AVRC_PT_CMD_whatever); } .. same for inc_volume
15:44:56
suntmc
welp. next problem. but that's maybe an API problem. it doesn't increase the volume, sadly
16:40:16
suntmc
seems windows sends in 48000Hz instead of 44100, like it says in the sound settings. weird
16:45:40
suntmc
i just set the arduino to a specific frequency instead of letting it decide because apparently the BT controller in windows reports something else to the device than what it actually sends?
16:48:18
shinmera
Also Windows drivers will Not do any resampling for you, so if you don't provide exactly what the device wants it's just Fuck You
18:32:34
suntmc
so turns out, updating to the ESP-IDF that contains the whole apis and shit also enabled absolute volume control, which the iphone supports. but whatever bullshit i tired to code does not work. but now the 'set_volume' command just works without issues. i never tried it again after updating to the latest IDF
18:53:41
shinmera
Gingy and I regularly have days where we spend all our time on something completely trivial.
18:56:59
gingerale
I finally cooked a meal I meant to make my dinner yesterday. Creamy salmon soup with root vegetables and fennel.
18:57:31
gingerale
A bit too much butter and lemon juice but I didn't want to leave half a lemon in the fridge.
19:38:19
suntmc
everything's working now. even tried a speaker. no idea if the video i took of it is ever gonna finish uploading