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

DVD

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  *  ring_buffer.c
  4.  *
  5.  * Copyright (C) Aaron Holtzman - May 1999
  6.  *
  7.  *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
  8.  *
  9.  *  ac3dec is free software; you can redistribute it and/or modify
  10.  *  it under the terms of the GNU General Public License as published by
  11.  *  the Free Software Foundation; either version 2, or (at your option)
  12.  *  any later version.
  13.  *   
  14.  *  ac3dec is distributed in the hope that it will be useful,
  15.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  *  GNU General Public License for more details.
  18.  *   
  19.  *  You should have received a copy of the GNU General Public License
  20.  *  along with GNU Make; see the file COPYING.  If not, write to
  21.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  22.  *
  23.  */
  24. //FIXME separate the typedefs from ac3.h
  25. typedef signed short sint_16;
  26. #include <unistd.h>
  27. #include "ring_buffer.h"
  28. #define BUFFER_SIZE 1024
  29. #define NUM_BUFFERS 256
  30. #define INC_INDEX(x) (((x) + 1) % NUM_BUFFERS)
  31. // The buffer that was just written into
  32. static volatile int write_index;
  33. // The buffer that was just read from
  34. static volatile int read_index;
  35. static sint_16 ring_buf[NUM_BUFFERS][BUFFER_SIZE];
  36. void
  37. rb_init(void)
  38. {
  39. write_index = 0;
  40. read_index = 0;
  41. }
  42. sint_16* rb_begin_read(void)
  43. {
  44. if(read_index == write_index)
  45. return 0;
  46. return ring_buf[INC_INDEX(read_index)];
  47. }
  48. void rb_end_read(void)
  49. {
  50. read_index = INC_INDEX(read_index);
  51. }
  52. sint_16* rb_begin_write(void)
  53. {
  54. if(read_index == INC_INDEX(write_index))
  55. return 0;
  56. return ring_buf[INC_INDEX(write_index)];
  57. }
  58. void rb_end_write(void)
  59. {
  60. write_index = INC_INDEX(write_index);
  61. }