Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2010, 11:00   #1
maxandmin
Пользователь
 
Регистрация: 08.07.2010
Сообщений: 16
Радость Простой Wave проигрыватель

Написал очень простой Wave проигрыватель
maxandmin вне форума Ответить с цитированием
Старый 09.07.2010, 11:03   #2
maxandmin
Пользователь
 
Регистрация: 08.07.2010
Сообщений: 16
По умолчанию

Для работы со звуковухой используется всё тот же алгоритм, как и с любым другим устройством.
Инициализировать драйвер звуковой.
Установить свои параметры.
Воспроизвести или записать звуковые данные.
Помахать ручкой и закрыть драйвер.
maxandmin вне форума Ответить с цитированием
Старый 09.07.2010, 11:04   #3
maxandmin
Пользователь
 
Регистрация: 08.07.2010
Сообщений: 16
По умолчанию

а вот собственно и сам код:
maxandmin вне форума Ответить с цитированием
Старый 09.07.2010, 11:04   #4
maxandmin
Пользователь
 
Регистрация: 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);
}
maxandmin вне форума Ответить с цитированием
Старый 09.07.2010, 11:07   #5
maxandmin
Пользователь
 
Регистрация: 08.07.2010
Сообщений: 16
По умолчанию

Надеюсь кому нибудь будет полезен,потому что в инете сам не мог ничего найти
maxandmin вне форума Ответить с цитированием
Старый 09.07.2010, 11:38   #6
NiCola999
Не
Участник клуба
 
Регистрация: 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.
NiCola999 вне форума Ответить с цитированием
Старый 09.07.2010, 11:52   #7
maxandmin
Пользователь
 
Регистрация: 08.07.2010
Сообщений: 16
По умолчанию

здесь реализован программный интерфейс низкого уровня,им удобно пользоваться в случае необходимости иметь непосредственный доступ к буферам,содержащим мультимедиа-данные...
maxandmin вне форума Ответить с цитированием
Старый 09.07.2010, 11:57   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ну молодец, че)
хотя не знаю на счет низкого уровня, на 3ей ссылке в гугле тоже вроде не высокий уровень функций)
NiCola999 вне форума Ответить с цитированием
Старый 09.07.2010, 12:31   #9
maxandmin
Пользователь
 
Регистрация: 08.07.2010
Сообщений: 16
По умолчанию

да я опирался на исходники этой программы,но там не реализовано потоковое воспроизведение ,а следовательно файлы большого размера не проигрываются
maxandmin вне форума Ответить с цитированием
Старый 23.03.2011, 17:52   #10
Vetaly
 
Регистрация: 09.03.2011
Сообщений: 4
По умолчанию

В какой программе этот проигрыватель написан?
и подскажите как его запустить.
Vetaly вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись звука с микрофон в 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