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

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)sun.c 1.2 99/12/19 Copyright 1998,1999 Heiko Eissfeldt */
  2. #ifndef lint
  3. static char     sccsid[] =
  4. "@(#)sun.c 1.2 99/12/19 Copyright 1998,1999 Heiko Eissfeldt";
  5. #endif
  6. /***
  7.  * CopyPolicy: GNU Public License 2 applies
  8.  * Copyright (C) by Heiko Eissfeldt
  9.  *
  10.  *
  11.  * ---------------------------------------------------------------------
  12.  *  definitions for sun pcm output
  13.  * ---------------------------------------------------------------------
  14.  */
  15. #include "config.h"
  16. #include "mytype.h"
  17. #include <stdio.h>
  18. #if defined (HAVE_UNISTD_H) && (HAVE_UNISTD_H == 1)
  19. #include <sys/types.h>
  20. #include <unistd.h>
  21. #endif
  22. #include "byteorder.h"
  23. #include "sndfile.h"
  24. typedef struct SUNHDR {
  25.   unsigned int magic; /* dns. a la .snd */
  26.   unsigned int data_location; /* offset to data */
  27.   unsigned int size; /* # of data bytes */
  28.   unsigned int format; /* format code */
  29.   unsigned int sample_rate; /* in Hertz */
  30.   unsigned int channelcount; /* 1 for mono, 2 for stereo */
  31.   char info[8]; /* comments */
  32. } SUNHDR;
  33. static SUNHDR sunHdr;
  34. static int InitSound __PR(( int audio, long channels, unsigned long rate, long nBitsPerSample, unsigned long expected_bytes ));
  35. static int InitSound ( audio, channels, rate, nBitsPerSample, expected_bytes)
  36. int audio;
  37. long channels;
  38. unsigned long rate;
  39. long nBitsPerSample;
  40. unsigned long expected_bytes;
  41. {
  42.   unsigned long format = nBitsPerSample > 8 ? 0x03 : 0x02;
  43.   sunHdr.magic         = cpu_to_le32(UINT4_C(0x646e732e));
  44.   sunHdr.data_location = cpu_to_be32(0x20);
  45.   sunHdr.size          = cpu_to_be32(expected_bytes);
  46.   sunHdr.format        = cpu_to_be32(format);
  47.   sunHdr.sample_rate   = cpu_to_be32(rate);
  48.   sunHdr.channelcount  = cpu_to_be32(channels);
  49.   return write (audio, &sunHdr, sizeof (sunHdr));
  50. }
  51. static int ExitSound __PR(( int audio, unsigned long nBytesDone ));
  52. static int ExitSound ( audio, nBytesDone )
  53. int audio;
  54. unsigned long nBytesDone;
  55. {
  56.   sunHdr.size = cpu_to_be32(nBytesDone);
  57.   /* goto beginning */
  58.   if (lseek(audio, 0L, SEEK_SET) == -1) {
  59.     return 0;
  60.   }
  61.   return write (audio, &sunHdr, sizeof (sunHdr));
  62. }
  63. static unsigned long GetHdrSize __PR(( void ));
  64. static unsigned long GetHdrSize( )
  65. {
  66.   return sizeof( sunHdr );
  67. }
  68. struct soundfile sunsound =
  69. {
  70. InitSound, /* init header method */
  71. ExitSound, /* exit header method */
  72. GetHdrSize, /* report header size method */
  73. 1 /* needs big endian samples */
  74. };