deferred.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:4k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.   **********************************************************************
  3.   *
  4.   *     Copyright 1999, 2000 Creative Labs, Inc.
  5.   *
  6.   **********************************************************************
  7.   *
  8.   *     Date                 Author               Summary of changes
  9.   *     ----                 ------               ------------------
  10.   *     October 20, 1999     Andrew de Quincey    Rewrote and extended
  11.   *                          Lucien Murray-Pitts  original incomplete 
  12.   *                                               driver.
  13.   *
  14.   *     April 18, 1999       Andrew Veliath       Original Driver
  15.   *                                               implementation
  16.   *
  17.   **********************************************************************
  18.   *
  19.   *     This program is free software; you can redistribute it and/or
  20.   *     modify it under the terms of the GNU General Public License as
  21.   *     published by the Free Software Foundation; either version 2 of
  22.   *     the License, or (at your option) any later version.
  23.   *
  24.   *     This program is distributed in the hope that it will be useful,
  25.   *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.   *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.   *     GNU General Public License for more details.
  28.   *
  29.   *     You should have received a copy of the GNU General Public
  30.   *     License along with this program; if not, write to the Free
  31.   *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  32.   *     USA.
  33.   *
  34.   **********************************************************************
  35.   */
  36. #include <linux/errno.h>
  37. #include <dxr2.h>
  38. #include <zivaDS.h>
  39. #include <pcm1723.h>
  40. /**
  41.  *
  42.  * Queues a deferred command for executing whilst a data transfer is NOT in progress...
  43.  * interrupts for the handler which executes this queue should be disabled before entering...
  44.  *
  45.  * @param instance DXR2 instance
  46.  * @param code Command code to queue (one of DXR2_QUEUE_*)
  47.  * @param arg0 arg0 for the above
  48.  * @param arg1 arg1 for the above
  49.  * @param arg2 arg2 for the above
  50.  *
  51.  * @return 0 on success, <0 on failure
  52.  *
  53.  */
  54. extern int dxr2_queue_deferred(dxr2_t* instance, int code, int arg0, int arg1, int arg2)
  55. {
  56.   // check we've not run out of space
  57.   if (instance->deferredCount > DXR2_MAX_DEFERRED_COMMANDS) {
  58.     
  59.     return(-ENOMEM);
  60.   }
  61.   
  62.   // store the data
  63.   instance->deferredQueue[instance->deferredCount][0] = code;
  64.   instance->deferredQueue[instance->deferredCount][1] = arg0;
  65.   instance->deferredQueue[instance->deferredCount][2] = arg1;
  66.   instance->deferredQueue[instance->deferredCount][3] = arg2;
  67.   
  68.   // increment counter
  69.   instance->deferredCount++;
  70. }
  71. /**
  72.  *
  73.  * Executes the deferred command queue
  74.  * Should be called by an interrupt handler.
  75.  *
  76.  * @param instance DXR2 instance
  77.  *
  78.  * @return 0 on success, <0 on failure
  79.  *
  80.  */
  81. extern int dxr2_process_deferred_queue(dxr2_t* instance)
  82. {
  83.   int i;
  84.   // OK, process each element of the queue
  85.   for(i=0; i< instance->deferredCount; i++) {
  86.     
  87.     switch(instance->deferredQueue[i][0]) {
  88.     case DXR2_QUEUE_PAUSED:
  89.       zivaDS_pause(instance->zivaDSInstance);
  90.       break;
  91.       
  92.     case DXR2_QUEUE_SETVOLUME:
  93.       zivaDS_set_audio_volume(instance->zivaDSInstance, instance->deferredQueue[i][1]);
  94.       break;
  95.     case DXR2_QUEUE_ENABLESUBPICTURE:
  96.       zivaDS_enable_subpicture(instance->zivaDSInstance, instance->deferredQueue[i][1]);
  97.       break;
  98.     case DXR2_QUEUE_SCANMODE:
  99.       zivaDS_scan_mode(instance->zivaDSInstance, instance->deferredQueue[i][1], instance->deferredQueue[i][2]);
  100.       break;
  101.     case DXR2_QUEUE_SELECTSTREAM:
  102.       zivaDS_select_stream(instance->zivaDSInstance, instance->deferredQueue[i][1], instance->deferredQueue[i][2]);
  103.       break;
  104.     case DXR2_QUEUE_SETMUTESTATUS:
  105.       pcm1723_set_mute_mode(instance->pcm1723Instance, instance->deferredQueue[i][1]);
  106.       break;
  107.     case DXR2_QUEUE_HIGHLIGHT:
  108.       zivaDS_highlight(instance->zivaDSInstance, instance->deferredQueue[i][1], instance->deferredQueue[i][2]);
  109.       break;
  110.     }
  111.   }
  112.    
  113.   // OK, queue is done
  114.   instance->deferredCount = 0;
  115.   // OK!
  116.   return(0);
  117. }