|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
09.07.2010, 11:00 | #1 |
Пользователь
Регистрация: 08.07.2010
Сообщений: 16
|
Простой Wave проигрыватель
Написал очень простой Wave проигрыватель
|
09.07.2010, 11:03 | #2 |
Пользователь
Регистрация: 08.07.2010
Сообщений: 16
|
Для работы со звуковухой используется всё тот же алгоритм, как и с любым другим устройством.
Инициализировать драйвер звуковой. Установить свои параметры. Воспроизвести или записать звуковые данные. Помахать ручкой и закрыть драйвер. |
09.07.2010, 11:04 | #3 |
Пользователь
Регистрация: 08.07.2010
Сообщений: 16
|
а вот собственно и сам код:
|
09.07.2010, 11:04 | #4 |
Пользователь
Регистрация: 08.07.2010
Сообщений: 16
|
#include "stdafx.h"
#include "windows.h" #include "mmsystem.h" #include "stdio.h" #include "string.h" #include <iostream> using namespace std; #pragma comment(lib, "winmm.lib") #define BLOCK_SIZE 8000//размер отдельного блока typedef struct//the "RIFF" chunk descriptor { BYTE riff[4];//четырехбуквенный код FOURCC, который идентифицирует данные, хранящиеся во фрагменте DWORD size;// размер области данных в байтах (без учета размера самого заголовка) BYTE wave[4]; } _WAVEDESCR; typedef struct { BYTE id[4]; DWORD size; SHORT format;// Формат звуковых данных. Мы будем использовать в основном WAVE_FORMAT_PCM SHORT channels;//Количество каналов (1- моно, 2 - стерео). DWORD sampleRate;//Частота дискретизации (возможны значения 8000, 11025. 22050 и 44100). DWORD byteRate;//Количество байт в секунду. Для WAVE_FORMAT_PCM это является результатом sampleRate* blockAlign SHORT blockAlign;//Выравнивание блока. Для WAVE_FORMAT_PCM равен bitsPerSample/8* channels SHORT bitsPerSample;//Количество бит в одной выборке. Для WAVE_FORMAT_PCM может быть 8 или 16 } _WAVEFORMATEX; HWAVEOUT m_hWaveout;//сюда будет записан указатель на устройство воспроизведения. BOOL Open(SHORT channels, DWORD sampleRate, SHORT bitsPerSample)//открываем звуковое устройство { //передаём ему данные о формате BOOL bResult = TRUE; SHORT format = WAVE_FORMAT_PCM; SHORT blockAlign = channels << 1; WAVEFORMATEX wfex;//структуру типа WAVEFORMATEX, в которой описан формат воспроизводимых звуковых данных wfex.wFormatTag = format; wfex.nChannels = channels; wfex.nSamplesPerSec = sampleRate; wfex.nAvgBytesPerSec = blockAlign * sampleRate; wfex.nBlockAlign = blockAlign; wfex.wBitsPerSample = bitsPerSample; wfex.cbSize = 0;// комментарии //WAVE_MAPPER- звуковое устройство по умолчанию if ( waveOutOpen(&m_hWaveout, WAVE_MAPPER, &wfex,0,0, CALLBACK_NULL) != MMSYSERR_NOERROR)//открываем звуковое устройство по умолчанию { m_hWaveout = NULL; bResult = FALSE; } return bResult; } void main() { FILE * f; _WAVEDESCR m_Descriptor;//дескриптор устройства _WAVEFORMATEX m_Format; WAVEHDR *m_WaveHeader;//динамически выделяемый массив заголовков для передачи драйверу устройства LPBYTE *m_lpData;//массив указателей на начало каждого из блоков(делим на блоки ,чтобы не загружать на устройство сразу большой фаил) memset(&m_Descriptor, 0, sizeof(_WAVEDESCR));//забиваем нулями memset(&m_Format, 0, sizeof(_WAVEFORMATEX)); f=fopen("yblackbird.wav","rb"); //f=fopen("123.wav","rb"); //открываем файлик //f=fopen("Серега - King Ring.wav","rb"); //f=fopen("amerika.wav","rb"); if ( f==0 ) { printf("Do not open this file!!! - %s\n","123.wav"); return; } fread(&m_Descriptor, sizeof(_WAVEDESCR), 1, f);//загружаем дескриптор if (strncmp((LPCSTR)m_Descriptor.wave, "WAVE", 4) == 0)// проверяем является ли наш формат wave { fread(&m_Format, sizeof(_WAVEFORMATEX), 1, f); cout << "Good" << "\n"; } if ((strncmp((LPCSTR)m_Format.id, "fmt ", 4) == 0) && (m_Format.format == 1))//находим подзаголовок "fmt " { BYTE id[4]; DWORD size; fread(id, sizeof(BYTE), 4, f);//считываем его fread(&size, sizeof(DWORD), 1, f); cout<<"size "<<size<<"\n"; //DWORD offset = ftell(f);//Функция ftell получает текущую позицию указателя на файл //(если он есть), связанного с потоком stream. Позиция выражается //как смещение offset от начала потока stream. int m(0); m = size/BLOCK_SIZE;// находим на сколько блоков мы разобъём данные if(m < 1) { m = 1; } m_lpData = new LPBYTE[m];//массив указателей на область в памяти для каждого блока данных m_WaveHeader = new WAVEHDR[m] ;// массив заголовков для каждого блока данных for(int k(0) ; k < m ; k++) { memset(&(m_WaveHeader[k]), 0, sizeof(WAVEHDR));// забиваем нулями m_lpData[k] = 0; } int i(0); for(DWORD readSize(0) ; ((readSize < m_Descriptor.size)&&(i<m)) ;readSize=readSize+BLOCK_SIZE)//считываем данные в блоки { m_lpData[i] = (LPBYTE)malloc(BLOCK_SIZE*sizeof(BY TE));// выделяем область в памяти для каждого блока fread(m_lpData[i], sizeof(BYTE), BLOCK_SIZE, f);//считываем туда данные m_WaveHeader[i].lpData = (LPSTR)m_lpData[i];//забиваем наши данные в заголовок m_WaveHeader[i].dwBufferLength = BLOCK_SIZE; m_WaveHeader[i].dwFlags = WHDR_INQUEUE;//все заголовки соссоят в очереди на устройстве i++; } //-------------------------------------- if (Open(m_Format.channels, m_Format.sampleRate, m_Format.bitsPerSample))//открываем устройство { for(int j(0) ; j < m ; j++) { waveOutPrepareHeader(m_hWaveout, &(m_WaveHeader[j]), sizeof(WAVEHDR)); //отправляем j-ый заголовок на устройство waveOutWrite(m_hWaveout, &(m_WaveHeader[j]), sizeof(WAVEHDR));//начинаем проигрывать кусочки waveOutUnprepareHeader(m_hWaveout, &(m_WaveHeader[j]), sizeof(WAVEHDR));//отчищаем заголовок } } } waveOutClose(m_hWaveout);// закрыть драйвер fclose(f); } |
09.07.2010, 11:07 | #5 |
Пользователь
Регистрация: 08.07.2010
Сообщений: 16
|
Надеюсь кому нибудь будет полезен,потому что в инете сам не мог ничего найти
|
09.07.2010, 11:38 | #6 |
Не
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
|
ну крут, чо... только этот топик для вопросов. Проги в другом месте
p.s странно, что ты ничего не нашел в интернете: http://www.google.ru/search?sourceid...player+c%2B%2B куча ссылок там..., время поиска, включая набор вопроса, 10 секунд =) и, кстати, еще кое-что... зачем делать 5 постов подряд, если можно сделать один?) Последний раз редактировалось NiCola999; 09.07.2010 в 11:42. |
09.07.2010, 11:52 | #7 |
Пользователь
Регистрация: 08.07.2010
Сообщений: 16
|
здесь реализован программный интерфейс низкого уровня,им удобно пользоваться в случае необходимости иметь непосредственный доступ к буферам,содержащим мультимедиа-данные...
|
09.07.2010, 11:57 | #8 |
Не
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
|
ну молодец, че)
хотя не знаю на счет низкого уровня, на 3ей ссылке в гугле тоже вроде не высокий уровень функций) |
09.07.2010, 12:31 | #9 |
Пользователь
Регистрация: 08.07.2010
Сообщений: 16
|
да я опирался на исходники этой программы,но там не реализовано потоковое воспроизведение ,а следовательно файлы большого размера не проигрываются
|
23.03.2011, 17:52 | #10 |
Регистрация: 09.03.2011
Сообщений: 4
|
В какой программе этот проигрыватель написан?
и подскажите как его запустить. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Запись звука с микрофон в wave файл | iankov | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 31.05.2011 17:50 |
Конвектор mp3 в wave | maxandmin | Общие вопросы C/C++ | 2 | 08.07.2010 18:47 |
Google wave | Роман Радер | Свободное общение | 9 | 12.11.2009 23:26 |
mp3 to wave | berfilm | Мультимедиа в Delphi | 2 | 18.09.2009 12:40 |
Wave файлы | SERG1980 | Общие вопросы Delphi | 5 | 30.08.2007 08:03 |