From 3233e7fa409708925659e13b4564c55cb604c7ec Mon Sep 17 00:00:00 2001 From: "Dipl.-Ing. Jonas Stienen" <jst@akustik.rwth-aachen.de> Date: Tue, 29 Aug 2017 23:06:04 +0200 Subject: [PATCH] Fixing bugs in python binding methods --- examples/jupyter/va_scene_controller.ipynb | 191 +++++++++++++++++++++ src/vasingletonmethods.hpp | 16 +- 2 files changed, 199 insertions(+), 8 deletions(-) create mode 100644 examples/jupyter/va_scene_controller.ipynb diff --git a/examples/jupyter/va_scene_controller.ipynb b/examples/jupyter/va_scene_controller.ipynb new file mode 100644 index 0000000..bdd2c3c --- /dev/null +++ b/examples/jupyter/va_scene_controller.ipynb @@ -0,0 +1,191 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# VA scene controller\n", + "This is a simple example and utility notebook that demonstrates the use of scene control mechanisms." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prerequisites\n", + "You can ignore this part, it is for preparation purposes only." + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append( '../../Lib/site-packages' )\n", + "import ipywidgets as widgets\n", + "import va\n", + "if not va.connect() :\n", + " raise 'Could not connect to VA server on localhost'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### Listeners" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6f9ed2a29aa04c22996c8baa64f67a8f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "A Jupyter Widget" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "listener_ids = va.get_listener_ids()\n", + "listeners_dict = {}\n", + "for listener_id in listener_ids :\n", + " listeners_dict.update( { va.get_listener_name( listener_id ) : listener_id } )\n", + "\n", + "listeners_dropdown_menu = widgets.Dropdown( \n", + " options = listeners_dict,\n", + " description = 'Listeners' )\n", + "if listener_ids :\n", + " first_listener_pos = va.get_listener_position( listener_ids[ 0 ] )\n", + "\n", + "def on_listener_update( w ) :\n", + " listener_id = listeners_dropdown_menu.value\n", + " if listener_id :\n", + " listener_pos = [ listeners_input_pos_x.value, listeners_input_pos_y.value, listeners_input_pos_z.value ]\n", + " va.set_listener_position( listener_id, listener_pos )\n", + "\n", + "listeners_input_pos_x = widgets.FloatText( description = 'X' )\n", + "listeners_input_pos_y = widgets.FloatText( description = 'Y' )\n", + "listeners_input_pos_z = widgets.FloatText( description = 'Z' )\n", + "\n", + "listener_update_button = widgets.Button( description = 'Update' )\n", + "listener_update_button.on_click( on_listener_update )\n", + "\n", + "def on_listener_select( d ) :\n", + " if d.type == 'change' and type( d.new ) is str :\n", + " listener_id = listeners_dropdown_menu.options[ d.new ] \n", + " listener_pos = va.get_listener_position( listener_id )\n", + " listeners_input_pos_x.value = listener_pos[ 0 ]\n", + " listeners_input_pos_y.value = listener_pos[ 1 ]\n", + " listeners_input_pos_z.value = listener_pos[ 2 ]\n", + " \n", + "listeners_dropdown_menu.observe( on_listener_select )\n", + "\n", + "listeners_input_widget_box = widgets.HBox( [ listeners_dropdown_menu, listeners_input_pos_x, listeners_input_pos_y, listeners_input_pos_z, listener_update_button ] )\n", + "display( listeners_input_widget_box )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### Sources" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "826b9adcf6084a80b9894ccd81081eb6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "A Jupyter Widget" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sound_source_ids = va.get_sound_source_ids()\n", + "sound_sources_dict = {}\n", + "for source_id in sound_source_ids :\n", + " sound_sources_dict.update( { va.get_sound_source_name( source_id ) : source_id } )\n", + "\n", + "sound_sources_dropdown_menu = widgets.Dropdown( \n", + " options = sound_sources_dict,\n", + " description = 'Sound sources' )\n", + "if sound_source_ids :\n", + " first_sound_source_pos = va.get_sound_source_position( sound_source_ids[ 0 ] )\n", + "\n", + "def on_sound_source_update( w ) :\n", + " sound_source_id = sound_sources_dropdown_menu.value\n", + " if sound_source_id :\n", + " sound_source_pos = [ sound_source_input_pos_x.value, sound_source_input_pos_y.value, sound_source_input_pos_z.value ]\n", + " va.set_sound_source_position( sound_source_id, sound_source_pos )\n", + "\n", + "sound_source_input_pos_x = widgets.FloatText( description = 'X' )\n", + "sound_source_input_pos_y = widgets.FloatText( description = 'Y' )\n", + "sound_source_input_pos_z = widgets.FloatText( description = 'Z' )\n", + "\n", + "sound_source_update_button = widgets.Button( description = 'Update' )\n", + "sound_source_update_button.on_click( on_sound_source_update )\n", + "\n", + "def on_sound_source_select( d ) :\n", + " if d.type == 'change' and type( d.new ) is str :\n", + " sound_source_id = sound_sources_dropdown_menu.options[ d.new ] \n", + " sound_source_pos = va.get_sound_source_position( sound_source_id )\n", + " sound_source_input_pos_x.value = sound_source_pos[ 0 ]\n", + " sound_source_input_pos_y.value = sound_source_pos[ 1 ]\n", + " sound_source_input_pos_z.value = sound_source_pos[ 2 ]\n", + " \n", + "sound_sources_dropdown_menu.observe( on_sound_source_select )\n", + "\n", + "sound_source_input_widget_box = widgets.HBox( [ sound_sources_dropdown_menu, sound_source_input_pos_x, sound_source_input_pos_y, sound_source_input_pos_z, sound_source_update_button ] )\n", + "display( sound_source_input_widget_box )" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/vasingletonmethods.hpp b/src/vasingletonmethods.hpp index 73bfd9b..eddf92e 100644 --- a/src/vasingletonmethods.hpp +++ b/src/vasingletonmethods.hpp @@ -26,10 +26,10 @@ static PyObject* va_not_implemented( PyObject*, PyObject* ) static void RequireCoreAvailable() { if( !g_pVANetClient ) - VA_EXCEPT2( CVAException::NETWORK_ERROR, "VA client not available, please connect first" ); + VA_EXCEPT2( NETWORK_ERROR, "VA client not available, please connect first" ); if( !g_pVANetClient->GetCoreInstance() ) - VA_EXCEPT2( CVAException::NETWORK_ERROR, "VA client available, but access to VA interface failed. Please reconnect." ); + VA_EXCEPT2( NETWORK_ERROR, "VA client available, but access to VA interface failed. Please reconnect." ); }; std::string SaveStringToUnicodeConversion( const std::string& sInputString ) @@ -112,7 +112,7 @@ CVAStruct ConvertPythonDictToVAStruct( PyObject* pInDict ) PyObject* pValue = PyList_GetItem( pValueList, i ); char* pcKeyName = nullptr; if( !PyArg_Parse( pKey, "s", &pcKeyName ) ) - VA_EXCEPT2( CVAException::INVALID_PARAMETER, "Invalid key '" + std::string( pcKeyName ) + "'" ); + VA_EXCEPT2( INVALID_PARAMETER, "Invalid key '" + std::string( pcKeyName ) + "'" ); if( Py_None == pValue ) { @@ -134,7 +134,7 @@ CVAStruct ConvertPythonDictToVAStruct( PyObject* pInDict ) { char* pcStringValue = nullptr; if( !PyArg_Parse( pValue, "s", &pcStringValue ) ) - VA_EXCEPT2( CVAException::INVALID_PARAMETER, "Invalid string value at key '" + std::string( pcKeyName ) + "': " + std::string( pcStringValue ) ); + VA_EXCEPT2( INVALID_PARAMETER, "Invalid string value at key '" + std::string( pcKeyName ) + "': " + std::string( pcStringValue ) ); oReturn[ pcKeyName ] = std::string( pcStringValue ); } else if( PyDict_Check( pValue ) ) @@ -1854,7 +1854,7 @@ static PyObject* va_get_rendering_modules( PyObject*, PyObject* ) for( size_t i = 0; i < voInfos.size(); i++ ) { CVAAudioRendererInfo& oInfo( voInfos[ i ] ); - PyObject* pInfo = Py_BuildValue( "{s:b,s:s,s:s}", + PyObject* pInfo = Py_BuildValue( "{s:b,s:s,s:s, s:s}", "enabled", oInfo.bEnabled, "class", SaveStringToUnicodeConversion( oInfo.sClass ).c_str(), "description", SaveStringToUnicodeConversion( oInfo.sDescription ).c_str(), @@ -1906,7 +1906,7 @@ static PyObject* va_set_rendering_module_muted( PyObject*, PyObject** ppArgs, Py VAPY_REQUIRE_CONN_TRY; static const char * const _keywords[] = { "id", "muted", NULL }; - static _PyArg_Parser _parser = { "i|b:set_rendering_module_muted", _keywords, 0 }; + static _PyArg_Parser _parser = { "s|b:set_rendering_module_muted", _keywords, 0 }; char* pcID = nullptr; bool bMuted = true; if( !_PyArg_ParseStack( ppArgs, nArgs, pKeywordNames, &_parser, &pcID, &bMuted ) ) @@ -1947,7 +1947,7 @@ static PyObject* va_get_reproduction_modules( PyObject*, PyObject* ) for( size_t i = 0; i < voInfos.size(); i++ ) { CVAAudioReproductionInfo& oInfo( voInfos[ i ] ); - PyObject* pInfo = Py_BuildValue( "{s:b,s:s,s:s}", + PyObject* pInfo = Py_BuildValue( "{s:b,s:s,s:s,s:s}", "enabled", oInfo.bEnabled, "class", SaveStringToUnicodeConversion( oInfo.sClass ).c_str(), "description", SaveStringToUnicodeConversion( oInfo.sDescription ).c_str(), @@ -1999,7 +1999,7 @@ static PyObject* va_set_reproduction_module_muted( PyObject*, PyObject** ppArgs, VAPY_REQUIRE_CONN_TRY; static const char * const _keywords[] = { "id", "muted", NULL }; - static _PyArg_Parser _parser = { "i|b:set_reproduction_module_muted", _keywords, 0 }; + static _PyArg_Parser _parser = { "s|b:set_reproduction_module_muted", _keywords, 0 }; char* pcID = nullptr; bool bMuted = true; if( !_PyArg_ParseStack( ppArgs, nArgs, pKeywordNames, &_parser, &pcID, &bMuted ) ) -- GitLab