Advertisement
Guest User

Untitled

a guest
Aug 21st, 2015
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 26.49 KB | None | 0 0
  1. // Блок, содержащий коды ошибок
  2. #define  EFOPEN -1  // ошибка открытия файла
  3. #define  EFREAD 11  // ошибка чтения файла
  4. #define   EHEAD -2  // ошибка заголовка
  5. #define    EGEN 9   // ошибка gen ?
  6. #define  ENOARG 3   // ошибка номера аргумента
  7. #define EACSDND 4   // ошибка ... sound ???
  8. #define ENUDATA 0   // ошибка номера данных
  9.  
  10. // Блок, содержащий сообщения, выводимые при соответствующих ошибках
  11. #define   MEHEAD "Unavailable .WAV"         // Недоступный wav файл
  12. #define    MEGEN "Error!"               // Ошибка
  13. #define   MEEXIT "Press any key to exit..."     // Нажмите любую клавишу, чтобы выйти
  14. #define MENUDATA "No data in file"          // Данные отсутствуют в файле
  15.  
  16. // отображаем инструкции для запуска и восспроизведения файла
  17. #define  MENOARG "Use next:\nplaywav <WAVFILE> [clock multiplier] [w] - play file <WAVFILE>\n\
  18. :if w - show waveform graph only\n\
  19. :clock multiplier - 650000 by default"
  20.  
  21. /*
  22.     Одна хитрая вещь, связанная с секциями файла RIFF, состоит в том, что адреса начала секций должны быть выровнены на размер слова (2 байта). Это означает, что общий размер секции должен быть кратен 2. Если секция содержит нечетное число байт данных (невыравненное до 2 байт), то добавляется дополнительный нулевой байт данных в конец данных секции. Этот дополнительный байт не учитывается в размере секции заголовка, таким образом программа всегда должна учитывать выравнивание для расчета смещения начала следующей секции.
  23. */
  24.  
  25. // ??? Блок, содержащий необходимые константы для распознавания wav-файла по его заголовку   // кажись, это смещения в памяти для чанков
  26. #define   RIFFID 0x46464952     // RIFF константа, которая обозначает тип  Содержит символы “RIFF”
  27. #define   FORMAT 0x45564157     // WAVE что означает этот "FORMAT"?      Содержит символы “wave” 
  28. #define    FMTID 0x20746d66     // fmt      Содержит символы “fmt”
  29. #define   DATAID 0x61746164     // data     Содержит символы “data”
  30. #define   FACTID 0x74636166     // "fact"  Секция fact содержит информацию о содержимом WAV-файла, зависящую от кода компрессии. Она требуется для всех форматов WAVE со сжатием, и требуется, если данные сигнала содержатся внутри секции списка (LIST) "wavl", но не требуется для несжатого формата PCM WAVE (код компрессии 1), который содержит аудиоданные в секции "data".
  31.  
  32. #define PCMAUDIO 1
  33. // PCM/uncompressed
  34. //PCM Audio (импульсно-кодовая модуляция) (Pulse Code Modulation) = 1 обозначает, что совершается линейное квантование амплитуды
  35. // Аудио формат, полный список можно получить здесь. Для PCM = 1 (то есть, Линейное квантование). Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
  36.  
  37. /*
  38.     Приведем таблицу основных форматов сжатия wav-файлов:
  39.     Код  Описание
  40.     0 (0x0000)  Unknown
  41.     1 (0x0001)  PCM/uncompressed
  42.     2 (0x0002)  Microsoft ADPCM
  43.     6 (0x0006)  ITU G.711 a-law
  44.     7 (0x0007)  ITU G.711 µ-law
  45.     17 (0x0011) IMA ADPCM
  46.     20 (0x0016) ITU G.723 ADPCM (Yamaha)
  47.     49 (0x0031) GSM 6.10
  48.     64 (0x0040) ITU G.721 ADPCM
  49.     80 (0x0050) MPEG
  50.     65,536 (0xFFFF) Experimental
  51.    
  52.     Общеиспользуемые коды сжатия
  53.     (Common Wave Compression Codes)
  54. */
  55.  
  56. #define TOPHEADSIZE 44          // размер заголовока (кол-во байт, используемых для заголовка) смещение на 44 байт является началом блока, содержащего аудио-данные (непосредственно, музыка The actual sound data.)
  57. #define SIZEOFEXTENSION 0       // ???? разобраться подробнее  !!! размер расширения ??? размер всех дополнительных байт формата, необходимых для поддержки специфических форматов звука, если он не содержит несжатых данных PCM
  58.  
  59. #define  FMTPCMSIZE 16          // ??? fmt pulse code modulation размер )(размер фмт импульсно-кодовой модуляции) ???
  60. /*
  61. 16        4   Subchunk1Size    16 for PCM.  This is the size of the
  62.                                rest of the Subchunk which follows this number.
  63. */
  64.  
  65. #define FMTFACTSIZE 18          // fmt — unix-утилита, переформатирует каждый абзац в файле(ах) и выводит на стандартный вывод.  ????
  66. #define SPKPORT 0x61            // Определение порта спикера, клавиатуры и некоторых других устройств (61-й порт)
  67. #define ONESECOND 650000        // Одна секунда ???
  68.  
  69. // playmode values
  70. #define    ARGPLAY 1            // аргумент (воспроизведения воспроизведение в стандартном режиме с частотой по умолчанию)
  71. #define ARGSETTIME 2            // аргумент (Установка времени устанавливаем частоту или время) ???
  72.  
  73. /*
  74. http://microsin.net/programming/ARM/struct-and-typedef-struct-difference.html
  75.  
  76. В чем разница между struct и typedef struct?   Печать
  77. Добавил(а) microsin  
  78. Давайте попробуем разобраться, в чем разница между двумя определениями структур (далее перевод [1]):
  79.  
  80. struct Foo { ... };
  81. и
  82.  
  83. typedef struct { ... } Foo;
  84. [C++]
  85.  
  86. С точки зрения объявления переменных Foo на языке C++ нет разницы, как определить Foo. После того, как Foo была определена либо через struct, либо через typedef struct, можно объявлять переменные Foo так:
  87.  
  88. Foo bar;
  89. Однако между struct и typedef struct различие есть, и оно тонкое. Дело в том, что struct определяет новый тип. В отличие от этого typedef struct никакого типа не определяет, он только создает ссылку (alias) с именем Foo (ни в коем случае не новый тип) на неименованный тип struct.
  90.  
  91. Спецификатор typedef. Имя, заданное с участием спецификатора typedef, становится специальным именем. В области действия этой декларации typedef-имя синтаксически эквивалентно ключевому слову и именам типа, связанного с идентификатором. Таким образом, typedef-name является синонимом другого типа. Так что typedef-имя НЕ СОЗДАЕТ НОВЫЙ ТИП, как это делается при декларации класса или enum.
  92.  
  93. Если декларация определяет неименованный класс (или перечисление enum), первое typedef-имя, заданное в декларации, типа класса (или типа enum) используется для обозначения типа класса (или типа enum) только для целей линковки.
  94. */
  95.  
  96. // В языке С, если не использовать typedef, то придется при каждом объявлении переменной данного типа приписывать слева слово "struct"
  97.  
  98. /*
  99. Таким образом, тонкие отличия есть только в C++, и это пережиток от языка C, где применение struct и typedef struct имеет значение. На языке C есть два разных пространств имен типов: пространство имен тегов struct/union/enum, и пространство имен typedef. Если Вы просто напишете в программе:
  100.  
  101. struct Foo { ... };
  102. Foo x;
  103. то получите ошибку компиляции, потому что Foo определен только в пространстве имен тегов. Вы должны декларировать переменную x так:
  104.  
  105. struct Foo x;
  106. В любой момент, когда Вы хотите обратиться к Foo, Вы всегда должны вызывать struct Foo. Это быстро раздражает, тогда Вы можете добавить typedef:
  107.  
  108. struct Foo { ... };
  109. typedef struct Foo Foo;
  110. Теперь оба выражения, и struct Foo (в пространстве имен тегов) и просто Foo (в пространстве имен typedef), относятся к одному и тому же, и Вы можете свободно декларировать объекты с типом Foo без ключевого слова struct.
  111.  
  112. Конструкция
  113.  
  114. typedef struct Foo { ... } Foo;
  115. Является просто объединением декларации структуры и typedef.
  116.  
  117. И, наконец, конструкция
  118.  
  119. typedef struct { ... } Foo;
  120. декларирует безымянную структуру, и создает для нее typedef. Так что для такой конструкции у Вас нет имени Foo в пространстве имен тегов, имя Foo есть только в пространстве имен typedef. Это означает, что предварительное декларирование невозможно. Если Вы хотите применить предварительное декларирование, то нужно задать имя для пространства имен тегов.
  121.  
  122. */
  123.  
  124. /*
  125.         WAVE – это формат хранения оцифрованных аудио данных. Данный формат поддерживает данные различной битности, с различной частотой выборки и числом каналов. Данный формат весьма популярен на платформах стандарта IBM PC (и совместимых с ним).
  126.         Этот формат подразумевает хранение аудио данных в особых блоках, которые называют чанками (chunks).
  127.  
  128.        
  129.         Форматы данных
  130.         ID = array[1..4] of Char; - идентификатор чанка.
  131.        
  132.        
  133.         Все данные хранятся в виде 8-ми битовых чисел, расположенных таким образом, что младшая часть слова данных записывается первой (little-endian)
  134.         Byte    :  | байт 0 |.
  135.         Word  :  | байт 0 | байт 1 |
  136.         Integer : | байт 0 | байт 1 | байт 2 | | байт 3 |
  137.        
  138.         /*
  139.        
  140.        
  141.             Секция fact содержит информацию о содержимом WAV-файла, зависящую от кода компрессии. Она требуется для всех форматов WAVE со сжатием, и требуется, если данные сигнала содержатся внутри секции списка (LIST) "wavl", но не требуется для несжатого формата PCM WAVE (код компрессии 1), который содержит аудиоданные в секции "data".
  142.  
  143.             Смещение    Размер    Описание    Величина
  144.             0x00    4   Chunk ID    "fact" (0x66616374)
  145.             0x04    4   Chunk Data Size зависит от формата
  146.             0x08    Данные, зависящие от формата (Format Dependant Data)
  147.            
  148.             Формат секции Fact
  149.  
  150.             Данные, зависящие от формата (Format Dependant Data)
  151.             В настоящий момент задано только одно поле для данных, зависящих от формата. Это единственное 4-байтное значение, которое указывает число выборок в секции данных аудиосигнала. Эта величина может использоваться вместе с количеством выборок в секунду (Samples Per Second value) указанном в секции формата - для вычисления продолжительности звучания сигнала в секундах.
  152.  
  153.             По мере появления новых форматов WAVE секция fact будет расширена с добавлением полей после поля числа выборок. Программы могут использовать размер секции fact для определения, какие поля представлены в секции.
  154. */
  155.  
  156.  
  157. // Блок структур/типов данных, необхоидмых для работы с wav-файлом
  158. // OK!
  159. typedef struct {        // Структура верхней части заголовка wav-файла. Эта часть называется riff. Она содержит следующие поля:
  160.     int id;             // id-номер. Он должен быть равен стандартному идентификатору "RIFF" или в шестнадцатиричной сис-ме 0x46464952
  161.     int size;           // Это оставшийся размер цепочки, начиная с этой позиции. Иначе говоря, это размер файла – 8, то есть, исключены поля chunkId и chunkSize.
  162.     int format;         // Содержит символы “WAVE” или в 16-тиричной 0x45564157
  163. } whriff;               // wave head riff
  164.  
  165. // OK!
  166. typedef struct {        // Структура, следующая за riff-ом. Текущая структура называется fmt - format. Она содержит в себе следующие поля:
  167.     int id;                     // id-номер     Содержит символы “fmt “ или в 16-тиричной 0x20746d66 (обозначает как бы начало-заголовок данного раздела)
  168.     int size;                   // 16 для формата PCM. Это оставшийся размер подцепочки заголовка, начиная с этой позиции.
  169.     short int audioformat;      // аудио-формат    Аудио формат, полный список можно получить здесь: http://audiocoding.ru/assets/meta/2008-05-22-wav-file-structure/wav_formats.txt. Для PCM = 1 (то есть, Линейное квантование). Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
  170.     short int numchannels;      // Количество каналов. Моно = 1, Стерео = 2 и т.д.
  171.     int samplerate;             // скорость выдачи выборок (самплов). По-другому - частота дискретизации. 8000 Гц, 44100 Гц и т.д.
  172.     int byterate;               // количество бит, используемых для хранения одной секунды мультимедийного контента/Количество байт, переданных за секунду воспроизведения.
  173.     short int blockalign;       // Количество байт для одного сэмпла, включая все каналы.
  174.     short int bitspersample;    // кол-во бит на один сампл/Количество бит в сэмпле. Так называемая “глубина” или точность звучания. 8 бит, 16 бит и т.д.
  175. } whfmt;                        // wave head format (структура, описывающая основные параметры wav-файла, которые хранятся в заголовке)
  176.  
  177. typedef struct { // ??? что это за аргумент  // можно ли его удалить???
  178.     short int sizeofext;        // размер какого текста ???
  179.     int id;                     // id-номер чего ???
  180.     int size;                   // размер чего ????
  181.     int samplelength;           // длина сэмпла ???
  182. } whfact;                       // wave head fact????
  183.  
  184. // Для чего эта структура????
  185. typedef struct {   
  186.     int id;                 // id-номер   ??
  187.     int size;               // размер         ??
  188.     int samplelength;       // длина сэмпла ???
  189. } whfact2;                  // ????? что такое fact??
  190.  
  191. typedef struct {
  192.     int id;             // id-номер
  193.     int size;           // размер
  194. } whdata;               // возможно wav head data
  195.  
  196. typedef struct {
  197.     whriff riff;        // wave hear riff ???
  198.     whfmt fmt;          // wave head format ????
  199.     whdata data;        // wave head data -> data
  200. } wavpcm;               // wav pulse code modulation
  201.  
  202. typedef struct {   // ????
  203.     whriff riff;            // wave hear riff ???
  204.     whfmt fmt;              // wave head format ????
  205.     whfact fact;
  206.     whdata data;            // wave head data ????
  207. } wavfact;  // // название структуры вконце
  208.  
  209. typedef struct {
  210.     whriff riff;        // wave head riff ???
  211.     whfmt fmt;          // wave head format  ???
  212.     whfact2 fact;
  213.     whdata data;
  214. } wavfact2;  // название структуры вконце
  215.  
  216. // http://stackoverflow.com/questions/13114241/c-union-struct-explanation
  217. // http://www.codingunit.com/cplusplus-tutorial-structures-typedef-and-unions
  218. // https://en.wikipedia.org/wiki/Typedef     // union  
  219.  
  220.  
  221. typedef struct {                    // Объединение  (одновременно может хранить значение только одного поля, значения всех остальных полей теряются)
  222.     wavpcm pcm;                 // wav pulse code modulation ?????
  223. } wavhead;                      // заголовок wav-файла
  224.  
  225. /*
  226.     union {
  227.         members;
  228.     }
  229.     name of current union
  230. */
  231.  
  232. /*
  233. http://programmersclub.ru/19/
  234. ОБЪЕДИНЕНИЯ
  235.  
  236. Из урока 18 вы узнали, как группировать связанную информацию в одной переменной с помощью структур C++. По мере усложнения вашим программам могут потребоваться разные способы просмотра части информации. Кроме того, программе может потребоваться работать с двумя или несколькими значениями, используя при этом только одно значение в каждый момент времени. В таких случаях для хранения данных ваши программы могут использовать объединения. В данном уроке вы изучите, как создавать и использовать объединения для хранения информации. Как вы узнаете, объединения очень похожи на структуры, описанные в уроке 18. Прежде чем вы закончите этот урок, вы освоите следующие основные концепции:
  237.  
  238. Объединения C++ очень похожи на структуры, за исключением того, как C++ хранит их в памяти; кроме того, объединение может хранить значение только для одного элемента в каждый момент времени.
  239. Объединение представляет собой структуру данных, подобную структуре C++, и состоит из частей, называемых элементами.
  240. Объединение определяет шаблон, с помощью которого программы далее объявляют переменные.
  241. Для обращения к определенному элементу объединения ваши программы используют оператор C++ точку.
  242. Чтобы изменить значения элемента объединения внутри функции, ваша программа должна передать переменную объединения в функцию с помощью адреса.
  243. Анонимное объединение представляет собой объединение, у которого нет имени (тэга).
  244. Как вы узнаете, объединения очень похожи на структуры C++, однако способ, с помощью которого C++ хранит объединения, отличается от способа, с помощью которого C++ хранит структуры.
  245.  
  246. КАК C++ ХРАНИТ ОБЪЕДИНЕНИЯ
  247.  
  248. Внутри ваших программ объединения C++ очень похожи на структуры. Например, следующая структура определяет объединение с именем distance, содержащее два элемента:
  249.  
  250. union distance
  251.  
  252. {
  253.    int miles;
  254.    long meters;
  255. };
  256.  
  257. Как и в случае со структурой, описание объединения не распределяет память. Вместо этого описание предоставляет шаблон для будущего объявления переменных. Чтобы объявить переменную объединения, вы можете использовать любой из следующих форматов:
  258.  
  259. union distance
  260.  
  261. {
  262.    union distance
  263.  
  264.    {
  265.       int miles; int miles;
  266.       long meters; long meters;
  267.    } japan, germany, franee;
  268. };
  269. distance japan, germany, franee;
  270.  
  271. Как видите, данное объединение содержит два элемента: miles и meters. Эти объявления создают переменные, которые позволяют вам хранить расстояния до указанных стран. Как и для структуры, ваша программа может присвоить значение любому элементу. Однако в отличие от структуры значение может быть присвоено только одному элементу в каждый момент времени. Когда вы объявляете объединение, компилятор C++ распределяет память для хранения самого большого элемента объединения. В случае объединения distance компилятор распределяет достаточно памяти для хранения значения типа long, как показано на рис. 19.
  272.  
  273. Рис. 19. C++ распределяет память, достаточную для хранения только самого большого элемента объединения.
  274.  
  275. Предположим, что ваша программа присваивает значение элементу miles, как показано ниже:
  276.  
  277. japan.miles = 12123;
  278.  
  279. Если далее ваша программа присваивает значение элементу meters, значение, присвоенное элементу miles, теряется.
  280.  
  281. Следующая программа USEUNION.CPP иллюстрирует использование объединения distance. Сначала программа присваивает значение элементу
  282.  
  283. miles и выводит это значение. Затем программа присваивает значение элементу meters. При этом значение элемента miles теряется:
  284.  
  285. #include <iostream.h>
  286.  
  287. void main(void)
  288.  
  289. {
  290.    union distance
  291.  
  292.    {
  293.       int miles;
  294.       long meters;
  295.    } walk;
  296.  
  297.    walk.miles = 5;
  298.    cout << "Пройденное расстояние в милях " << walk.miles << endl;
  299.    walk.meters = 10000;
  300.    cout << "Пройденное расстояние в метрах " << walk.meters << endl;
  301. }
  302.  
  303. Как видите, программа обращается к элементам объединения с помощью точки, аналогичная запись использовалась при обращении к элементам структуры в уроке 18.
  304. */
  305.  
  306. // Заголовки функций (allow run this functions from any place in .c file. For example, playwav64.c
  307. void ShowErr(char, char*);          // Вывод ошибки (результат функции - число, аргументы - число и указатель на число (или символы))
  308. char TopHeadCheck(wavhead*, whriff**, whfmt**); // проверка вершины заголовка
  309. int DataHeadCheck(wavhead*, whriff*, whfmt*, whdata**, char);  // Проверка заголовка данных ???
  310. int FileRead(FILE**, char*, int);                  // Чтение файла
  311. void SetRawKbd(char);                       // установить необработанное...
  312. char CheckArgs(short int);                  // Проврека каких-то аргументов
  313. short int InitIOPorts(char);                    // Инициализация портов ввода-вывода
  314. int InitWavFile(FILE**, char*, wavhead*, whfmt**);          // Какая-то инциализация wav-файла
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement