home *** CD-ROM | disk | FTP | other *** search
/ NEXT Generation 27 / NEXT27.iso / pc / demos / emperor / dx3.exe / SDK / SAMPLES / DSSHOW3D / LSNRINFO.CPP < prev    next >
C/C++ Source or Header  |  1996-08-28  |  12KB  |  417 lines

  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include <mmsystem.h>
  4. #include <dsound.h>
  5. #include <commctrl.h>
  6.  
  7. #include "DSShow3D.h"
  8. #include "debug.h"
  9. #include "GVars.h"
  10. #include "LsnrInfo.h"
  11.  
  12.  
  13. ListenerInfo::ListenerInfo()
  14.     {
  15.     m_hDistanceEdit = m_hDopplerEdit = m_hRolloffEdit = NULL;
  16.     m_hXSlider = m_hYSlider = m_hZSlider = NULL;
  17.     m_hXText = m_hYText = m_hZText = NULL;
  18.  
  19.     m_vPos.x = m_vPos.y = m_vPos.z = (D3DVALUE)0.0;
  20.     }
  21.  
  22.  
  23. ListenerInfo::~ListenerInfo()
  24.     {
  25.     }
  26.  
  27.  
  28. BOOL ListenerInfo::OnInitDialog( HWND hDlg, WPARAM wParam )
  29.     {
  30.     m_hDistanceEdit = GetDlgItem( hDlg, IDC_LISTENER_DISTANCEFACTOR_EDIT );
  31.     m_hDopplerEdit = GetDlgItem( hDlg, IDC_LISTENER_DOPPLERFACTOR_EDIT );
  32.     m_hRolloffEdit = GetDlgItem( hDlg, IDC_LISTENER_ROLLOFFFACTOR_EDIT );
  33.  
  34.     m_hXSlider = GetDlgItem( hDlg, IDC_LISTENER_X_SLIDER );
  35.     m_hYSlider = GetDlgItem( hDlg, IDC_LISTENER_Y_SLIDER );
  36.     m_hZSlider = GetDlgItem( hDlg, IDC_LISTENER_Z_SLIDER );
  37.  
  38.     m_hXText = GetDlgItem( hDlg, IDC_LISTENER_X_TEXT );
  39.     m_hYText = GetDlgItem( hDlg, IDC_LISTENER_Y_TEXT );
  40.     m_hZText = GetDlgItem( hDlg, IDC_LISTENER_Z_TEXT );
  41.  
  42.     // Initialize the distance factor to metres
  43.     Edit_SetText( m_hDistanceEdit, "1.0" );
  44.     Edit_SetText( m_hRolloffEdit, "1.0" );
  45.  
  46.     gp3DListener->SetPosition( D3DVAL(0.0f), D3DVAL(0.0f), D3DVAL(-10.0f), DS3D_IMMEDIATE );
  47. //    gp3DListener->CommitDeferredSettings();
  48.  
  49.     SetSliders();
  50.  
  51.     return TRUE;
  52.     }
  53.  
  54.  
  55. void ListenerInfo::UpdateUI( void )
  56.     {
  57.     UpdateXSliderUI( 0, TRUE );
  58.     UpdateYSliderUI( 0, TRUE );
  59.     UpdateZSliderUI( 0, TRUE );
  60.     }
  61.  
  62.  
  63. BOOL ListenerInfo::OnCommand( WPARAM wParam, LPARAM lParam )
  64.     {
  65.     char    szEdit[16];
  66.  
  67.     if( HIWORD(wParam) == EN_CHANGE )
  68.     {
  69.     if( (HWND)lParam == m_hDistanceEdit )
  70.         {
  71.         Edit_GetText( m_hDistanceEdit, szEdit, sizeof(szEdit));
  72.  
  73.         ASSERT( NULL != gp3DListener );
  74.         DPF( 3, "Setting Distance Factor: %s", szEdit );
  75.         gp3DListener->SetDistanceFactor(D3DVAL(atof(szEdit)), DS3D_IMMEDIATE );
  76.         }
  77.     else if((HWND)lParam == m_hDopplerEdit )
  78.         {
  79.         Edit_GetText( m_hDopplerEdit, szEdit, sizeof(szEdit));
  80.  
  81.         ASSERT( NULL != gp3DListener );
  82.         DPF( 3, "Setting Doppler Factor: %s", szEdit );
  83.         gp3DListener->SetDopplerFactor(D3DVAL(atof(szEdit)), DS3D_IMMEDIATE );
  84.         }
  85.     else if((HWND)lParam == m_hRolloffEdit )
  86.         {
  87.         Edit_GetText( m_hRolloffEdit, szEdit, sizeof(szEdit));
  88.  
  89.         ASSERT( NULL != gp3DListener );
  90.         DPF( 3, "Setting Rolloff Factor: %s", szEdit );
  91.         gp3DListener->SetRolloffFactor(D3DVAL(atof(szEdit)), DS3D_IMMEDIATE );
  92.         }
  93.     }
  94.     return FALSE;
  95.     }
  96.  
  97.  
  98. ///////////////////////////////////////////////////////////////////////////////
  99. // OnHScroll()
  100. //
  101. //    Main message handler for the WM_HSCROLL message.  this function basically
  102. // figures out which horizontal scrolling control is responsible for sending
  103. // the message and passes on handling to an appropriate function for handling.
  104. //
  105. BOOL ListenerInfo::OnHScroll( WORD wNotification, LONG lPos, HWND hControl )
  106.     {
  107.     if( !hControl )
  108.     return FALSE;
  109.     
  110.     if( hControl == m_hXSlider )
  111.     {
  112.     HandleXSliderScroll( wNotification, lPos );
  113.     return TRUE;
  114.     }
  115.     else if( hControl == m_hYSlider )
  116.     {
  117.     HandleYSliderScroll( wNotification, lPos );
  118.     return TRUE;
  119.     }
  120.     else if( hControl == m_hZSlider )
  121.     {
  122.     HandleZSliderScroll( wNotification, lPos );
  123.     return TRUE;
  124.     }
  125.     else
  126.     return FALSE;
  127.     }
  128.  
  129.  
  130. void ListenerInfo::OnDestroy( void )
  131.     {
  132.     }
  133.  
  134.  
  135. BOOL CALLBACK ListenerInfoDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
  136.     {
  137.     PLISTENERINFO   pli;
  138.  
  139.     switch( message )
  140.     {
  141.     case WM_INITDIALOG:
  142.         ASSERT( lParam != NULL );
  143.         pli = (PLISTENERINFO)lParam;
  144.         SetWindowLong( hDlg, DWL_USER, (LONG)pli );
  145.  
  146.         if( !pli->OnInitDialog( hDlg, wParam ))
  147.         DestroyWindow( hDlg );
  148.         return TRUE;
  149.  
  150.     case WM_HSCROLL:
  151.         pli = (PLISTENERINFO)GetWindowLong( hDlg, DWL_USER );
  152.         ASSERT( NULL != pli );
  153.         return !pli->OnHScroll( LOWORD(wParam), (LONG)HIWORD(wParam), (HWND)lParam );
  154.  
  155.     case WM_COMMAND:
  156.         pli = (PLISTENERINFO)GetWindowLong( hDlg, DWL_USER );
  157.         // It's possible to get child notifications before the
  158.         // INITDIALOG message, so we'll handle a NULL class item
  159.         // here a less stringently
  160.         if( !pli )
  161.         return FALSE;
  162.         return !pli->OnCommand( wParam, lParam );
  163.  
  164.     case WM_DESTROY:
  165.         pli = (PLISTENERINFO)GetWindowLong( hDlg, DWL_USER );
  166.         ASSERT( NULL != pli );
  167.         pli->OnDestroy();
  168.         return TRUE;
  169.  
  170.     default:
  171.         return FALSE;
  172.     }
  173.     }
  174.  
  175.  
  176. ///////////////////////////////////////////////////////////////////////////////
  177. //
  178. //
  179. //
  180. //
  181. void ListenerInfo::SetSliders( void )
  182.     {
  183.     SendMessage( m_hXSlider, TBM_SETRANGEMIN, FALSE,
  184.     (LPARAM)(LISTENER_SLIDER_MIN + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  185.     SendMessage( m_hXSlider, TBM_SETRANGEMAX, FALSE,
  186.     (LPARAM)(LISTENER_SLIDER_MAX + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  187.     SendMessage( m_hXSlider, TBM_SETPAGESIZE, 0, LISTENER_SLIDER_FACTOR);
  188.  
  189.     SendMessage( m_hYSlider, TBM_SETRANGEMIN, FALSE,
  190.     (LPARAM)(LISTENER_SLIDER_MIN + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  191.     SendMessage( m_hYSlider, TBM_SETRANGEMAX, FALSE,
  192.     (LPARAM)(LISTENER_SLIDER_MAX + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  193.     SendMessage( m_hYSlider, TBM_SETPAGESIZE, 0, LISTENER_SLIDER_FACTOR);
  194.  
  195.     SendMessage( m_hZSlider, TBM_SETRANGEMIN, FALSE,
  196.     (LPARAM)(LISTENER_SLIDER_MIN + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  197.     SendMessage( m_hZSlider, TBM_SETRANGEMAX, FALSE,
  198.     (LPARAM)(LISTENER_SLIDER_MAX + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  199.     SendMessage( m_hZSlider, TBM_SETPAGESIZE, 0, LISTENER_SLIDER_FACTOR);
  200.  
  201.     UpdateUI();
  202.     }
  203.  
  204.  
  205. ///////////////////////////////////////////////////////////////////////////////
  206. //
  207. //
  208. //
  209. //
  210. void ListenerInfo::HandleXSliderScroll( WORD wNot, LONG lPos )
  211.     {
  212.     HRESULT hr;
  213.     BOOL fUpdate = TRUE;
  214.  
  215.     switch( wNot )
  216.     {
  217.     case TB_THUMBTRACK:
  218.         break;
  219.  
  220.     case TB_ENDTRACK:
  221.     case TB_LINEDOWN:
  222.     case TB_LINEUP:
  223.     case TB_PAGEDOWN:
  224.     case TB_PAGEUP:
  225.         lPos = SendMessage( m_hXSlider, TBM_GETPOS, 0, 0 );
  226.         break;
  227.  
  228.     default:
  229.         fUpdate = FALSE;
  230.     }
  231.     
  232.     if( fUpdate && NULL != gp3DListener )
  233.     {
  234.     m_vPos.x = D3DVAL(lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT;
  235.     DPF( 3, "Setting listener pos: (%i, %i, %i)", (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z );
  236.     if( FAILED( hr = gp3DListener->SetPosition( m_vPos.x, m_vPos.y,
  237.                         m_vPos.z, DS3D_IMMEDIATE )))
  238.         DPF( 0, "IDirectSound3DListener::SetPosition returned : %s", TranslateDSError(hr));
  239.     UpdateXSliderUI((lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT, FALSE );
  240.     }
  241.     }
  242.  
  243.  
  244. ///////////////////////////////////////////////////////////////////////////////
  245. //
  246. //
  247. //
  248. //
  249. void ListenerInfo::HandleYSliderScroll( WORD wNot, LONG lPos )
  250.     {
  251.     HRESULT hr;
  252.     BOOL fUpdate = TRUE;
  253.  
  254.     switch( wNot )
  255.     {
  256.     case TB_THUMBTRACK:
  257.         break;
  258.  
  259.     case TB_ENDTRACK:
  260.     case TB_LINEDOWN:
  261.     case TB_LINEUP:
  262.     case TB_PAGEDOWN:
  263.     case TB_PAGEUP:
  264.         lPos = SendMessage( m_hYSlider, TBM_GETPOS, 0, 0 );
  265.         break;
  266.  
  267.     default:
  268.         fUpdate = FALSE;
  269.     }
  270.     
  271.     if( fUpdate && NULL != gp3DListener )
  272.     {
  273.     m_vPos.y = D3DVAL(lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT;
  274.     DPF( 3, "Setting listener pos: (%i, %i, %i)", (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z );
  275.     if( FAILED( hr = gp3DListener->SetPosition( m_vPos.x, m_vPos.y,
  276.                         m_vPos.z, DS3D_IMMEDIATE )))
  277.         DPF( 0, "IDirectSound3DListener::SetPosition returned : %s", TranslateDSError(hr));
  278.     UpdateYSliderUI((lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT, FALSE );
  279.     }
  280.     }
  281.  
  282.  
  283. ///////////////////////////////////////////////////////////////////////////////
  284. //
  285. //
  286. //
  287. //
  288. void ListenerInfo::HandleZSliderScroll( WORD wNot, LONG lPos )
  289.     {
  290.     HRESULT hr;
  291.     BOOL fUpdate = TRUE;
  292.  
  293.     switch( wNot )
  294.     {
  295.     case TB_THUMBTRACK:
  296.         break;
  297.  
  298.     case TB_ENDTRACK:
  299.     case TB_LINEDOWN:
  300.     case TB_LINEUP:
  301.     case TB_PAGEDOWN:
  302.     case TB_PAGEUP:
  303.         lPos = SendMessage( m_hZSlider, TBM_GETPOS, 0, 0 );
  304.         break;
  305.  
  306.     default:
  307.         fUpdate = FALSE;
  308.     }
  309.     
  310.     if( fUpdate && NULL != gp3DListener )
  311.     {
  312.     m_vPos.z = D3DVAL(lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT;
  313.     DPF( 3, "Setting listener pos: (%i, %i, %i)", (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z );
  314.     if( FAILED( hr = gp3DListener->SetPosition( m_vPos.x, m_vPos.y,
  315.                         m_vPos.z, DS3D_IMMEDIATE )))
  316.         DPF( 0, "IDirectSound3DListener::SetPosition returned : %s", TranslateDSError(hr));
  317.     UpdateZSliderUI((lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT, FALSE );
  318.     }
  319.     }
  320.  
  321.  
  322. ///////////////////////////////////////////////////////////////////////////////
  323. // UpdateXSliderUI()
  324. //
  325. //    Update anything that displays the position of the X slider in some manner
  326. // to reflect the new position, either from the buffer or from the parameter.
  327. //
  328. void ListenerInfo::UpdateXSliderUI( LONG lForcePos, BOOL fFromInterface )
  329.     {
  330.     char    szText[8];
  331.     LONG    lPos;
  332.  
  333.     if( fFromInterface )
  334.         {
  335.     if( NULL != gp3DListener )
  336.         {
  337.         gp3DListener->GetPosition( &m_vPos );
  338.         lPos = (LONG)m_vPos.x;
  339.         }
  340.     else
  341.         lPos = 0;
  342.     }
  343.     else
  344.     lPos = lForcePos;
  345.  
  346.     SendMessage( m_hXSlider, TBM_SETPOS, (WPARAM)TRUE,
  347.             (LPARAM)(lPos + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  348.     wsprintf( szText, "%i", lPos );
  349.     Static_SetText( m_hXText, szText );
  350.     }
  351.  
  352.  
  353. ///////////////////////////////////////////////////////////////////////////////
  354. // UpdateYSliderUI()
  355. //
  356. //    Update anything that displays the position of the Y slider in some manner
  357. // to reflect the new position, either from the buffer or from the parameter.
  358. //
  359. void ListenerInfo::UpdateYSliderUI( LONG lForcePos, BOOL fFromInterface )
  360.     {
  361.     char    szText[8];
  362.     LONG    lPos;
  363.  
  364.     if( fFromInterface )
  365.         {
  366.     if( NULL != gp3DListener )
  367.         {
  368.         gp3DListener->GetPosition( &m_vPos );
  369.         lPos = (LONG)m_vPos.y;
  370.         }
  371.     else
  372.         lPos = 0;
  373.     }
  374.     else
  375.     lPos = lForcePos;
  376.  
  377.     SendMessage( m_hYSlider, TBM_SETPOS, (WPARAM)TRUE,
  378.             (LPARAM)(lPos + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  379.     wsprintf( szText, "%i", lPos );
  380.     Static_SetText( m_hYText, szText );
  381.     }
  382.  
  383.  
  384. ///////////////////////////////////////////////////////////////////////////////
  385. // UpdateZSliderUI()
  386. //
  387. //    Update anything that displays the position of the Z slider in some manner
  388. // to reflect the new position, either from the buffer or from the parameter.
  389. //
  390. void ListenerInfo::UpdateZSliderUI( LONG lForcePos, BOOL fFromInterface )
  391.     {
  392.     char    szText[8];
  393.     LONG    lPos;
  394.  
  395.     if( fFromInterface )
  396.         {
  397.     if( NULL != gp3DListener )
  398.         {
  399.         gp3DListener->GetPosition( &m_vPos );
  400.         lPos = (LONG)m_vPos.z;
  401.         }
  402.     else
  403.         lPos = 0;
  404.     }
  405.     else
  406.     lPos = lForcePos;
  407.  
  408.     SendMessage( m_hZSlider, TBM_SETPOS, (WPARAM)TRUE,
  409.             (LPARAM)(lPos + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR );
  410.     wsprintf( szText, "%i", lPos );
  411.     Static_SetText( m_hZText, szText );
  412.     }
  413.  
  414.  
  415.  
  416.  
  417.