sndfile-play-beos.cpp
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:3k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 2001 Marcus Overhagen <marcus@overhagen.de>
  3. **  
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU General Public License as published by
  6. ** the Free Software Foundation; either version 2 of the License, or
  7. ** (at your option) any later version.
  8. ** 
  9. ** This program is distributed in the hope that it will be useful,
  10. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ** GNU General Public License for more details.
  13. ** 
  14. ** You should have received a copy of the GNU General Public License
  15. ** along with this program; if not, write to the Free Software 
  16. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. #include <stdio.h>
  19. #include  <Application.h>
  20. #include  <SoundPlayer.h>
  21. #include  <string.h>
  22. #include <sndfile.h>
  23. #define BUFFER_LEN 1024
  24. /*------------------------------------------------------------------------------
  25. ** BeOS functions for playing a sound.
  26. */
  27. #if defined (__BEOS__)
  28. struct shared_data
  29. {
  30. BSoundPlayer *player;
  31. SNDFILE *sndfile;
  32. SF_INFO sfinfo;
  33. sem_id finished;
  34. };
  35. static void 
  36. buffer_callback(void *theCookie, void *buf, size_t size, const media_raw_audio_format &format) 
  37. {
  38. shared_data *data = (shared_data *)theCookie;
  39. short *buffer = (short *)buf;
  40. int count = size / sizeof(short);
  41. int m, readcount;
  42. if (!data->player->HasData())
  43. return;
  44. readcount = sf_read_short(data->sndfile, buffer, count);
  45. if (readcount == 0) 
  46. { data->player->SetHasData(false);
  47. release_sem(data->finished);
  48. }
  49. if (readcount < count) 
  50. { for (m = readcount ; m < count ; m++)
  51. buffer [m] = 0 ;
  52. }
  53. if (data->sfinfo.pcmbitwidth < 16) 
  54. { for (m = 0 ; m < count ; m++)
  55. buffer [m] *= 256 ;
  56. }
  57. }
  58. static void
  59. beos_play (int argc, char *argv [])
  60. {
  61. shared_data data;
  62. status_t status;
  63. int k;
  64. /* BSoundPlayer requires a BApplication object */
  65. BApplication app("application/x-vnd.MarcusOverhagen-sfplay");
  66. for (k = 1 ; k < argc ; k++)
  67. { printf ("Playing %sn", argv [k]) ;
  68. if (! (data.sndfile = sf_open_read (argv [k], &data.sfinfo)))
  69. { sf_perror (NULL) ;
  70. continue ;
  71. } ;
  72. if (data.sfinfo.channels < 1 || data.sfinfo.channels > 2)
  73. { printf ("Error : channels = %d.n", data.sfinfo.channels) ;
  74. sf_close (data.sndfile) ;
  75. continue ;
  76. } ;
  77. data.finished = create_sem(0,"finished");
  78. media_raw_audio_format format = 
  79. {  data.sfinfo.samplerate,
  80. data.sfinfo.channels,
  81. media_raw_audio_format::B_AUDIO_SHORT,
  82. B_HOST_IS_LENDIAN ? B_MEDIA_LITTLE_ENDIAN : B_MEDIA_BIG_ENDIAN,
  83. BUFFER_LEN * sizeof(short)
  84. };
  85. BSoundPlayer player(&format,"player",buffer_callback,NULL,&data);
  86. data.player = &player;
  87. if ((status = player.InitCheck()) != B_OK) 
  88. {
  89. printf ("Error : BSoundPlayer init failed, %s.n", strerror(status)) ;
  90. delete_sem(data.finished);
  91. sf_close (data.sndfile) ;
  92. continue ;
  93. }
  94. player.SetVolume(1.0);
  95. player.Start();
  96. player.SetHasData(true);
  97. acquire_sem(data.finished);
  98. player.Stop();
  99. delete_sem(data.finished);
  100. sf_close (data.sndfile) ;
  101. } ;
  102. } /* beos_play */
  103. #endif
  104. /*==============================================================================
  105. ** Main function.
  106. */
  107. int 
  108. main (int argc, char *argv [])
  109. {
  110. if (argc < 2)
  111. { printf ("Usage : %s <input sound file>nn", argv [0]) ;
  112. return 1 ;
  113. } ;
  114. beos_play (argc, argv) ;
  115. return 0 ;
  116. } /* main */