Assists music production by grouping standalone programs into sessions. Community version of "Non Session Manager".
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
3.6KB

  1. /*******************************************************************************/
  2. /* Copyright (C) 2008 Jonathan Moore Liles */
  3. /* */
  4. /* This program is free software; you can redistribute it and/or modify it */
  5. /* under the terms of the GNU General Public License as published by the */
  6. /* Free Software Foundation; either version 2 of the License, or (at your */
  7. /* option) any later version. */
  8. /* */
  9. /* This program is distributed in the hope that it will be useful, but WITHOUT */
  10. /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
  11. /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
  12. /* more details. */
  13. /* */
  14. /* You should have received a copy of the GNU General Public License along */
  15. /* with This program; see the file COPYING. If not,write to the Free Software */
  16. /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  17. /*******************************************************************************/
  18. #include "Clip.H"
  19. #include "Timeline.H"
  20. #include <sndfile.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. Clip::Clip ( void ) : _peaks( this )
  24. {
  25. _filename = NULL;
  26. _length = 0;
  27. }
  28. /* Clip::Clip ( const char *filename ) : _peaks( this ) */
  29. /* { */
  30. /* _filename = filename; */
  31. /* SNDFILE *in; */
  32. /* SF_INFO si; */
  33. /* memset( &si, 0, sizeof( si ) ); */
  34. /* if ( ! ( in = sf_open( filename, SFM_READ, &si ) ) ) */
  35. /* { */
  36. /* printf( "couldn't open file\n" ); */
  37. /* return; */
  38. /* } */
  39. /* if ( si.channels != 1 ) */
  40. /* { */
  41. /* printf( "error: incompatible format\n" ); */
  42. /* return; */
  43. /* } */
  44. /* if ( si.samplerate != timeline.sample_rate ) */
  45. /* { */
  46. /* printf( "error: samplerate mismatch!\n" ); */
  47. /* return; */
  48. /* } */
  49. /* _length = si.frames; */
  50. /* sf_close( in ); */
  51. /* _peaks.open(); */
  52. /* } */
  53. Clip *
  54. Clip::from_file ( const char *filename )
  55. {
  56. SNDFILE *in;
  57. SF_INFO si;
  58. Clip *c = NULL;
  59. memset( &si, 0, sizeof( si ) );
  60. if ( ! ( in = sf_open( filename, SFM_READ, &si ) ) )
  61. {
  62. printf( "couldn't open file\n" );
  63. return NULL;
  64. }
  65. if ( si.channels != 1 )
  66. {
  67. printf( "error: incompatible format\n" );
  68. goto invalid;
  69. }
  70. if ( si.samplerate != timeline.sample_rate )
  71. {
  72. printf( "error: samplerate mismatch!\n" );
  73. goto invalid;
  74. }
  75. c = new Clip;
  76. c->_filename = filename;
  77. c->_length = si.frames;
  78. sf_close( in );
  79. c->_peaks.open();
  80. return c;
  81. invalid:
  82. sf_close( in );
  83. return NULL;
  84. }
  85. bool
  86. Clip::open ( void )
  87. {
  88. SF_INFO si;
  89. memset( &si, 0, sizeof( si ) );
  90. if ( ! ( _in = sf_open( _filename, SFM_READ, &si ) ) )
  91. return false;
  92. return true;
  93. }
  94. void
  95. Clip::close ( void )
  96. {
  97. sf_close( _in );
  98. }
  99. void
  100. Clip::seek ( nframes_t offset )
  101. {
  102. sf_seek( _in, offset, SEEK_SET );
  103. }
  104. nframes_t
  105. Clip::read ( sample_t *buf, nframes_t len )
  106. {
  107. return sf_read_float ( _in, buf, len );
  108. }
  109. /** read samples from /start/ to /end/ into /buf/ */
  110. nframes_t
  111. Clip::read ( sample_t *buf, nframes_t start, nframes_t end )
  112. {
  113. open();
  114. seek( start );
  115. nframes_t len = read( buf, end - start );
  116. close();
  117. return len;
  118. }