11#include < pybind11/pybind11.h>
2+ #include < pybind11/functional.h>
23#include < pybind11/stl.h>
34#include < pybind11/iostream.h>
45#include < pybind11/operators.h>
56
67#include < media/SoundPlayer.h>
8+ #include < media/Sound.h>
79
810namespace py = pybind11;
911using namespace BPrivate ;
1012
11- void define_SoundPlayer (py::module_& m)
13+ PYBIND11_MODULE (SoundPlayer, m)
1214{
13- m.attr (" SoundPlayNode" ) =py::cast (SoundPlayNode);
15+ // m.attr("SoundPlayNode") = py::cast(SoundPlayNode);
1416
15- py::class_<sound_error, std::exception>(m," sound_error" )
17+ /* py::class_<sound_error, std::exception>(m, "sound_error")
1618.def(py::init<const char *>(), "", py::arg("string"))
1719.def("what", &sound_error::what, "")
18- ;
20+ ;*/
21+
22+ py::register_exception<sound_error>(m," sound_error" );
23+ class sound_error :public std ::exception {
24+ public:
25+ explicit sound_error (const char * msg) : message(msg) {}
26+ const char *what ()const noexcept override {
27+ return message;
28+ }
29+ private: const char * message;
30+ };
31+ /* In python you can write: except sound_player.sound_error as e: print(f"Caught sound_error: {e.what()}")*/
32+
33+ py::enum_<BSoundPlayer::sound_player_notification>(m," sound_player_notification" ," " )
34+ .value (" B_STARTED" , BSoundPlayer::sound_player_notification::B_STARTED," " )
35+ .value (" B_STOPPED" , BSoundPlayer::sound_player_notification::B_STOPPED," " )
36+ .value (" B_SOUND_DONE" , BSoundPlayer::sound_player_notification::B_SOUND_DONE," " )
37+ .export_values ();
1938
2039py::class_<BSoundPlayer>(m," BSoundPlayer" )
21- .def (py::init<const char *, BufferPlayerFunc, EventNotifierFunc,void *>()," " ,py::arg (" name" )=NULL ,py::arg (" playerFunction" )=NULL ,py::arg (" eventNotifierFunction" )=NULL ,py::arg (" cookie" )=NULL )
22- .def (py::init<const media_raw_audio_format *,const char *, BufferPlayerFunc, EventNotifierFunc,void *>()," " ,py::arg (" format" ),py::arg (" name" )=NULL ,py::arg (" playerFunction" )=NULL ,py::arg (" eventNotifierFunction" )=NULL ,py::arg (" cookie" )=NULL )
23- .def (py::init<const media_node &,const media_multi_audio_format *,const char *,const media_input *, BufferPlayerFunc, EventNotifierFunc,void *>()," " ,py::arg (" toNode" ),py::arg (" format" )=NULL ,py::arg (" name" )=NULL ,py::arg (" input" )=NULL ,py::arg (" playerFunction" )=NULL ,py::arg (" eventNotifierFunction" )=NULL ,py::arg (" cookie" )=NULL )
40+ // .def(py::init<const char *, BufferPlayerFunc, EventNotifierFunc, void *>(), "", py::arg("name")=NULL, py::arg("playerFunction")=NULL, py::arg("eventNotifierFunction")=NULL, py::arg("cookie")=NULL)
41+ // .def(py::init<const media_raw_audio_format *, const char *, BufferPlayerFunc, EventNotifierFunc, void *>(), "", py::arg("format"), py::arg("name")=NULL, py::arg("playerFunction")=NULL, py::arg("eventNotifierFunction")=NULL, py::arg("cookie")=NULL)
42+ // .def(py::init<const media_node &, const media_multi_audio_format *, const char *, const media_input *, BufferPlayerFunc, EventNotifierFunc, void *>(), "", py::arg("toNode"), py::arg("format")=NULL, py::arg("name")=NULL, py::arg("input")=NULL, py::arg("playerFunction")=NULL, py::arg("eventNotifierFunction")=NULL, py::arg("cookie")=NULL)
43+
44+ .def (py::init<const char *, BSoundPlayer::BufferPlayerFunc, BSoundPlayer::EventNotifierFunc,void *>(),py::arg (" name" ) =nullptr ,py::arg (" playerFunction" ) =nullptr ,py::arg (" eventNotifierFunction" ) =nullptr ,py::arg (" cookie" ) =nullptr )
45+ .def (py::init<const media_raw_audio_format*,const char *, BSoundPlayer::BufferPlayerFunc, BSoundPlayer::EventNotifierFunc,void *>(),py::arg (" format" ),py::arg (" name" ) =nullptr ,py::arg (" playerFunction" ) =nullptr ,py::arg (" eventNotifierFunction" ) =nullptr ,py::arg (" cookie" ) =nullptr )
46+ .def (py::init<const media_node&,const media_multi_audio_format*,const char *,const media_input*, BSoundPlayer::BufferPlayerFunc, BSoundPlayer::EventNotifierFunc,void *>(),py::arg (" toNode" ),py::arg (" format" ) =nullptr ,py::arg (" name" ) =nullptr ,py::arg (" input" ) =nullptr ,py::arg (" playerFunction" ) =nullptr ,py::arg (" eventNotifierFunction" ) =nullptr ,py::arg (" cookie" ) =nullptr )
47+
2448.def (" InitCheck" , &BSoundPlayer::InitCheck," " )
2549.def (" Format" , &BSoundPlayer::Format," " )
2650.def (" Start" , &BSoundPlayer::Start," " )
2751.def (" Stop" , &BSoundPlayer::Stop," " ,py::arg (" block" )=true ,py::arg (" flush" )=true )
28- .def (" BufferPlayer" , &BSoundPlayer::BufferPlayer," " )
52+ // .def("BufferPlayer", &BSoundPlayer::BufferPlayer, "")
53+ // attempt1
54+ // .def("BufferPlayer", [](const BSoundPlayer& self) { return self.BufferPlayer(); },"")
55+ // attempt2
56+ .def (" BufferPlayer" , [](const BSoundPlayer& self) -> std::function<void (void *,void *,size_t ,const media_raw_audio_format&)> {
57+ BSoundPlayer::BufferPlayerFunc playerFunc = self.BufferPlayer ();
58+ return [playerFunc](void * cookie,void * buffer,size_t size,const media_raw_audio_format& format) {if (playerFunc) {playerFunc (cookie, buffer, size, format); } }; }," " )// TODO test this
2959.def (" SetBufferPlayer" , &BSoundPlayer::SetBufferPlayer," " ,py::arg (" " ))
30- .def (" EventNotifier" , &BSoundPlayer::EventNotifier," " )
60+ // .def("EventNotifier", &BSoundPlayer::EventNotifier, "")
61+ // attempt variadic impossible
62+ /* .def("EventNotifier", [](const BSoundPlayer& self) -> std::function<void(void*, BSoundPlayer::sound_player_notification, ...)> {
63+ BSoundPlayer::EventNotifierFunc notifierFunc = self.EventNotifier();
64+ return [notifierFunc](void* cookie, BSoundPlayer::sound_player_notification what, ...) { if (notifierFunc) { notifierFunc(cookie, what); } }; },"")*/
65+ .def (" EventNotifier" , [](const BSoundPlayer& self) -> std::function<void (void *, BSoundPlayer::sound_player_notification)> {
66+ BSoundPlayer::EventNotifierFunc notifierFunc = self.EventNotifier ();
67+ return [notifierFunc](void * cookie, BSoundPlayer::sound_player_notification what) {if (notifierFunc) {notifierFunc (cookie, what); } }; }," " )// TODO test this
3168.def (" SetNotifier" , &BSoundPlayer::SetNotifier," " ,py::arg (" eventNotifierFunction" ))
3269.def (" Cookie" , &BSoundPlayer::Cookie," " )
3370.def (" SetCookie" , &BSoundPlayer::SetCookie," " ,py::arg (" cookie" ))
@@ -50,7 +87,7 @@ py::class_<BSoundPlayer>(m, "BSoundPlayer")
5087.def (" HasData" , &BSoundPlayer::HasData," " )
5188.def (" SetHasData" , &BSoundPlayer::SetHasData," " ,py::arg (" hasData" ))
5289;
53-
90+ /*
5491py::class_<playing_sound>(m, "playing_sound")
5592.def_readwrite("next", &playing_sound::next, "")
5693.def_readwrite("current_offset", &playing_sound::current_offset, "")
@@ -69,7 +106,7 @@ py::class_<waiting_sound>(m, "waiting_sound")
69106.def_readwrite("id", &waiting_sound::id, "")
70107.def_readwrite("rate", &waiting_sound::rate, "")
71108.def_readwrite("volume", &waiting_sound::volume, "")
72- ;
109+ ;*/
73110
74111
75112}