Список форумов Форум Форум
Форум
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   medals.phpНаграды   РегистрацияРегистрация 
 ПрофильПрофиль   СудокуСудоку   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Вопросы-Ответы [различные проблемы с компом]
На страницу 1, 2, 3 ... 11, 12, 13  След.
 
Начать новую тему   Ответить на тему    Список форумов Форум -> Наука и технологии
Предыдущая тема :: Следующая тема  
Автор Сообщение
Gruz
Мастер-Флудер I
цитировать

Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 10:43 am    Заголовок сообщения: Вопросы-Ответы [различные проблемы с компом] Ответить с цитатой

Пишем всякие компьютерные ситуации, проблемы,
которые у вас были/есть или намечаются,
а так же их возможные решения.


Последний раз редактировалось: Gruz (Пт Дек 16, 2011 11:01 am), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
цитировать

Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 10:58 am    Заголовок сообщения: Waveform Audio Win32 API Ответить с цитатой

Запись звука через микрофон
-----------------------------------------

Waveform Audio Win32 API
Автор: Александр Галилов

Введение

Одной из наиболее важных частей Multimedia-API Windows 95/98/NT по праву может считаться Waveform Audio. Предоставляя наиболее широкие возможности по работе с оцифрованным звуком, эта группа функций таит в себе немало "подводных камней". Автор довольно много сил приложил к исследованию вопроса оптимального применения этих функций и хотел бы поделиться своими "открытиями" с читателями. Приводимые здесь примеры могут использоваться совершенно свободно, за исключением особо оговоренных случаев. Первая часть открывает небольшую серию статей, посвященных обработке звука в режиме реального времени (это когда время реакции системы на событие строго ограничено и не превышает заранее заданной величины - т.н. "жесткие" системы реального времени). Если Вы рассчитываете увидеть здесь разбор каких-то особенно сложных алгоритмов кодирования или сжатия звука - разочарую Вас. Далее применения быстрого преобразования Фурье пока ничего шибко математического не планируется. Обратите внимание, что вся информация почерпнута из Microsoft Multimedia Programmer's Reference, поэтому всячески рекомендую обращаться туда, тем более, что эти файлы включены в поставку Delphi 3, 4, 5.

В первой части рассматривается использование функций Waveform Audio Win32 API. Автор приводит описания наиболее важных, по его мнению, функций и рассматривает пример реализации программы, записывающей звук в WAV-файл в течение "неограниченного" времени. Приведенный в статье пример реализован на Delphi 4.

Часть 1

Оцифрованный звук может быть представлен самыми различными способами. В числе наиболее широко применяемого способа цифрового представления звука можно отметить формат PCM - pulse code modulation - импульсно-кодовая модуляция. В контексте нашей тематики под этим термином подразумевается такой способ кодирования данных, при котором каждая выборка (отсчет), произведенная аналого-цифровым преобразователем (здесь - в смысле звуковой карты), представляется в памяти в виде числа, пропорционального по своему значению мгновенной величине сигнала в момент выборки. Скорость выборок или, другими словами, частота выполнения отсчетов (частота дискретизации), прямо связана с максимальной частотой поступающего аналогового сигнала. Если сигнал имеет гармоническую природу и ограничен в некотором диапазоне частот, т.е. может быть представлен в виде конечного числа членов ряда Фурье, то для его корректной оцифровки, согласно теореме отсчетов, достаточно иметь частоту дискретизации вдвое превосходящей частоту максимальной гармоники сигнала.

Таким образом, если мы хотим без потери качества производить цифровую запись скажем, телефонного разговора, частота сигнала которого находится в диапазоне 300..3400 Гц, нам вполне достаточно установить частоту дискретизации 8000 отсчетов/сек. Величина 8000 выбрана из соображений совместимости с различными звуковыми картами и драйверами, поскольку для некоторых из них это является наименьшим возможным значением частоты дискретизации сигнала. Если же Вы хотите записывать радиопередачи в диапазоне FM (88 - 108 MHz), то необходимо выбрать частоту дискретизации 12500*2=25000 отсчетов/сек, т.к. звуковой диапазон FM-станции 12.5 килогерц.

Как Вы уже наверное догадались, запись с компакт-диска для сохранения качества нужно производить с частотой дискретизации 44100 выборок/секунду. Замечу, что это вовсе не гарантирует качество звучание записи "как на CD-ROM". Звуковая карта вносит некоторые искажения в любом случае. Как правило, это напрямую связано со стоимостью карты. Более дорогие обычно обеспечивают лучшее качество.

Теперь более подробно рассмотрим некоторые из функций, позволяющие работать со звуком.

Прежде всего, рассмотрим функцию waveInGetNumDevs:
Код:
// функция возвращает количество устройств ввода,
// поддерживающих оцифровку звукового сигнала.
// Если функция вернула 0, то таких устройств в системе нет.

function waveInGetNumDevs: UINT; stdcall;





Функция waveInGetDevCaps позволяет получить характеристики указанных устройств.
Код:
function waveInGetDevCaps(
  hwi: HWAVEIN;
  lpCaps: PWaveInCaps;
  uSize: UINT
  ): MMRESULT; stdcall;




Здесь:

hwi - идентификатор открытого функцией waveInOpen (см. ниже) устройства или порядковый номер неоткрытого устройства в диапазоне от 0 до значения, возвращаемого функцией waveInGetNumDevs, уменьшенного на 1;

lpCaps - адрес структуры (записи) TWAVEINCAPS; uSize - размер в байтах структуры TWAVEINCAPS.
Код:
type
  TWaveInCaps = record
    wMid: Word;
    wPid: Word;
    vDriverVersion: MMVERSION;
    szPname: array[0..MAXPNAMELEN - 1] of AnsiChar;
    dwFormats: DWORD;
    wChannels: Word;
    wReserved1: Word;
  end;




Структура TWAVEINCAPS описывает параметры заданного устройства. Т.е. после вызова функции waveInGetDevCaps поля структуры содержат следующие значения:

wMid: Word - идентификатор производителя;
wPid: Word - идентификатор продукции производителя;
vDriverVersion: MMVERSION - версия драйвера;
szPname: array[0..MAXPNAMELEN-1] of AnsiChar - наименование продукта (строка заканчивается символом с кодом 0);
dwFormats: DWORD - стандартные форматы данных, поддерживаемые устройством:
Код:
WAVE_FORMAT_1M08 11.025 kHz, mono, 8-bit
WAVE_FORMAT_1M16 11.025 kHz, mono, 16-bit
WAVE_FORMAT_1S08 11.025 kHz, stereo, 8-bit
WAVE_FORMAT_1S16 11.025 kHz, stereo, 16-bit
WAVE_FORMAT_2M08 22.05 kHz, mono, 8-bit
WAVE_FORMAT_2M16 22.05 kHz, mono, 16-bit
WAVE_FORMAT_2S08 22.05 kHz, stereo, 8-bit
WAVE_FORMAT_2S16 22.05 kHz, stereo, 16-bit
WAVE_FORMAT_4M08 44.1 kHz, mono, 8-bit
WAVE_FORMAT_4M16 44.1 kHz, mono, 16-bit
WAVE_FORMAT_4S08 44.1 kHz, stereo, 8-bit
WAVE_FORMAT_4S16 44.1 kHz, stereo, 16-bit




Обратите внимание на то, что подавляющее большинство (если не все) звуковые карты поддерживают промежуточные режимы записи-воспроизведения. Т.е. вполне возможно на карте с максимальной частотой дискретизации 44100 выборок/сек производить запись со скоростью 16000 выборок/сек, хотя это и не сообщается по запросу waveInGetDevCaps.

wChannels: Word - количество входных каналов (1-моно, 2-стерео)
wReserved1: Word - зарезервировано

Функция waveInGetErrorText возвращает текстовое описание возникших в ходе выполнения ошибок.
Код:
function waveInGetErrorText(
  mmrError: MMRESULT;
  lpText: PChar;
  uSize: UINT
  ): MMRESULT; stdcall;




mmrError - код ошибки;
lpText - адрес с которого будет размещена нуль-терминированная строка-описание;
uSize - размер участка памяти, на который ссылается lpText;

Ниже приведен пример процедуры, выводящей сведения об устройствах аудиоввода.
Код:
uses Windows, MMSystem;
type
  TModeDescr = record
    mode: DWORD; // код режима работы
    descr: string[32]; // словесное описание
  end;

const
  // массив содержит сопоставления режима работы и словесного описания
  modes: array[1..12] of TModeDescr = ((mode: WAVE_FORMAT_1M08; descr:
    '11.025 kHz, mono, 8-bit'),
    (mode: WAVE_FORMAT_1M16; descr: '11.025 kHz, mono, 16-bit'),
    (mode: WAVE_FORMAT_1S08; descr: '11.025 kHz, stereo, 8-bit'),
    (mode: WAVE_FORMAT_1S16; descr: '11.025 kHz, stereo, 16-bit'),
    (mode: WAVE_FORMAT_2M08; descr: '22.05 kHz, mono, 8-bit'),
    (mode: WAVE_FORMAT_2M16; descr: '22.05 kHz, mono, 16-bit'),
    (mode: WAVE_FORMAT_2S08; descr: '22.05 kHz, stereo, 8-bit'),
    (mode: WAVE_FORMAT_2S16; descr: '22.05 kHz, stereo, 16-bit'),
    (mode: WAVE_FORMAT_4M08; descr: '44.1 kHz, mono, 8-bit'),
    (mode: WAVE_FORMAT_4M16; descr: '44.1 kHz, mono, 16-bit'),
    (mode: WAVE_FORMAT_4S08; descr: '44.1 kHz, stereo, 8-bit'),
    (mode: WAVE_FORMAT_4S16; descr: '44.1 kHz, stereo, 16-bit'));

procedure ShowInfo;
var
  WaveNums, i, j: integer;
  WaveInCaps: TWaveInCaps;
    // структура в которую помещается информация об устройстве
begin
  WaveNums := waveInGetNumDevs;
  if WaveNums > 0 then // если в системе есть устройства аудиоввода,то
  begin
    for i := 0 to WaveNums - 1 do
      // получаем характеристики всех имеющихся устройств
    begin
      waveInGetDevCaps(i, @WaveInCaps, sizeof(TWaveInCaps));
      // добавляем наименование устройства
      MainForm.Memo.Lines.Add(PChar(@WaveInCaps.szPname));
      for j := 1 to High(modes) do
      begin
        // выводим поддерживаемые устройством режимы работы
        if (modes[j].mode and WaveInCaps.dwFormats) = modes[j].mode then
          Memo.Lines.Add(modes[j].descr);
      end;
    end;
  end;
end;



Рис 1. Сведения, выводимые процедурой ShowInfo.

Теперь Вы можете определить количество устройств аудиоввода Waveform audio и поддерживаемые ими режимы. Далее рассмотрим еще несколько функций, непосредственно обеспечивающих работу с звуковыми устройствами.

Функция waveInOpen открывает имеющееся устройство ввода Waveform audio для оцифровки сигнала.
Код:
function waveInOpen(
  lphWaveIn: PHWAVEIN;
  uDeviceID: UINT;
  lpFormatEx: PWaveFormatEx;
  dwCallback,
  dwInstance,
  dwFlags: DWORD
  ): MMRESULT; stdcall;




Здесь

lphWaveIn - указатель на идентификатор открытого Waveform audio устройства. Идентификатор используется после того, как устройство открыто, в других функциях Waveform audio;

uDeviceID - номер открываемого устройства (см. waveInGetNumDevs). Это может быть также идентификатор уже открытого ранее устройства. Вы можете использовать значение WAVE_MAPPER для того, чтобы функция автоматически выбрала совместимое с требуемым форматом данных устройство;

lpFormatEx - указатель на структуру типа TWaveFormatEx
Код:
type
  TWaveFormatEx = packed record
    wFormatTag: Word; { format type }
    nChannels: Word; { number of channels (i.e. mono, stereo, etc.) }
    nSamplesPerSec: DWORD; { sample rate }
    nAvgBytesPerSec: DWORD; { for buffer estimation }
    nBlockAlign: Word; { block size of data }
    wBitsPerSample: Word; { number of bits per sample of mono data }
    cbSize: Word; { the count in bytes of the size of }
  end;





В этой структуре значения полей следующее:

wFormatTag - формат Waveform audio. Мы будем использовать значение WAVE_FORMAT_PCM (это означает импульсно-кодовая модуляция) другие возможные значения смотрите в заголовочном файле MMREG.H;
nChannels - количество каналов. Обычно 1 (моно) или 2(стерео);
nSamplesPerSec - частота дискретизации. Для формата PCM - в классическом смысле, т.е. количество выборок в секунду. Согласно теореме отсчетов должна вдвое превышать частоту оцифровываемого сигнала. Обычно находится в диапазоне от 8000 до 44100 выборок в секунду;
nAvgBytesPerSec - средняя скорость передачи данных. Для PCM равна nSamplesPerSec*nBlockAlign;
nBlockAlign - для PCM равен (nChannels*wBitsPerSample)/8;
wBitsPerSample - количество бит в одной выборке. Для PCM равно 8 или 16;
cbSize - равно 0. Подробности в Microsoft Multimedia Programmer's Reference;

dwCallback - адрес callback-функции, идентификатор окна или потока, вызываемого при наступлении события;
dwInstance - пользовательский параметр в callback-механизме. Сам по себе не используется
dwFlags - флаги для открываемого устройства:
CALLBACK_EVENT dwCallback-параметр - код сообщения (an event handle);
CALLBACK_FUNCTION dwCallback-параметр - адрес процедуры-обработчика;
CALLBACK_NULL dwCallback-параметр не используется;
CALLBACK_THREAD dwCallback-параметр - идентификатор потока команд;
CALLBACK_WINDOW dwCallback-параметр - идентификатор окна;
WAVE_FORMAT_DIRECT если указан этот флаг, ACM-драйвер не выполняет преобразование данных;
WAVE_FORMAT_QUERY функция запрашивает устройство для определения,
поддерживает ли оно указанный формат, но не открывает его;



В случае использование Callback процедуры она имеет следующий вид:
Код:
procedure waveInProc(hwi: HWAVEIN; uMsg, dwInstance,
  dwParam1, dwParam2: DWORD); stdcall;
begin
  // что-то делаем
end;





Параметры процедуры имеют следующее значение:
hwi - идентификатор связанного с функцией открытого устройства;
uMsg - Waveform audio сообщение. Может принимать значения:

WIM_CLOSE посылается, когда устройство закрывается функцией waveInClose;
WIM_DATA устройство завершило передачу данных в блок памяти, установленный процедурой waveInAddBuffer;
WIM_OPEN сообщение посылается если устройство открыто функцией waveInOpen;

dwInstance - данные, определенные пользователем при вызове waveInOpen;
dwParam1, dwParam2 - параметры сообщения.

Необходимо заметить, что в Microsoft Multimedia Programmer's Reference написано, что из callback-процедуры нельзя вызывать никаких системных функций кроме: EnterCriticalSection, LeaveCriticalSection, midiOutLongMsg, midiOutShortMsg, OutputDebugString, PostMessage, PostThreadMessage, SetEvent, timeGetSystemTime, timeGetTime, timeKillEvent, и timeSetEvent , поскольку это вызывает deadlock. Я столкнулся с весьма серьезным препятствием из-за этого ограничения, и решил все-таки рискнуть. В ходе небольших экспериментов я выяснил, что данное ограничение не распространяется на группу waveInAddBuffer, waveInReset и waveInClose, и возможно, некоторые другие. Не было проблем и с использованием функций Reset, BlockWrite, BlockRead, CloseFile. Говоря более точно, я так и не обнаружил возникновения deadlock, какие бы функции не вызывал изнутри waveInProc. Самое главное - не инициировать бесконечный рекурсивный вызов waveInProc. Для этого необходимо хорошо продумать обработчики поступающих в waveInProc сообщений. Вообще, рекомендую использовать механизм оконных сообщений вместо callback. Это позволяет избежать ненужных экспериментов и возможной неработоспособности программы в других версиях ОС. Более подробно реализация этого механизма приведена в примере.

Функция waveInPrepareHeader выполняет подготовку буфера для операции загрузки данных:
Код:
function waveInPrepareHeader(
  hWaveIn: HWAVEIN;
  lpWaveInHdr: PWaveHdr;
  uSize: UINT
  ): MMRESULT; stdcall;




Здесь:
hWaveIn - идентификатор открытого устройства;
lpWaveInHdr - адрес структуры WaveHdr:
Код:
type
  TWaveHdr = record
    lpData: PChar; { pointer to locked data buffer }
    dwBufferLength: DWORD; { length of data buffer }
    dwBytesRecorded: DWORD; { used for input only }
    dwUser: DWORD; { for client's use }
    dwFlags: DWORD; { assorted flags}
    dwLoops: DWORD; { loop control counter }
    lpNext: PWaveHdr; { reserved for driver }
    reserved: DWORD; { reserved for driver }
  end;




lpData - адрес буфера для загрузки данных;
dwBufferLength - длина буфера в байтах;
dwBytesRecorded - для режима загрузки данных определяет количество загруженных в буфер байт;
dwUser - пользовательские данные
dwFlags - флаги. Могут иметь следующие значения:

WHDR_DONE устанавливается драйвером при завершении загрузки буфера данными;
WHDR_PREPARED устанавливается системой. Показывает готовность буфера к загрузке данных;
WHDR_INQUEUE устанавливается системой когда буфер установлен в очередь;

dwLoops - используется только при воспроизведении. При записи звука всегда 0;
lpNext - зарезервировано;
reserved - зарезервировано;
uSize - размер структуры WaveHdr в байтах;

Функция waveInPrepareHeader вызывается только один раз для каждого устанавливаемого в очередь загрузки буфера. Существует функция waveInUnprepareHeader, с такими же параметрами, которая освобождает ресурсы системы по сопровождению выделенного под загрузку блока. waveInUnprepareHeader должна быть вызвана до удаления выделенного под буфер загрузки блока памяти.

Функция waveInAddBuffer ставит в очередь на загрузку данными буфер памяти. Когда буфер заполнен, система уведомляет об этом приложение (см. выше waveInOpen).
Код:
function waveInAddBuffer(
  hWaveIn: HWAVEIN;
  lpWaveInHdr: PWaveHdr;
  uSize: UINT
  ): MMRESULT; stdcall;




Здесь:
hWaveIn - идентификатор открытого Waveform audio устройства ввода;
lpWaveInHdr - адрес структуры TWaveHdr;
uSize - размер WaveHdr в байтах;

Функция waveInReset останавливает операцию загрузки данных. Все текущие буферы отмечаются как обработанные и приложение уведомляется о завершении загрузки данных (см. waveInOpen).
Код:
function waveInReset(
  hWaveIn: HWAVEIN
  ): MMRESULT; stdcall;




Здесь:
hWaveIn - идентификатор открытого Waveform audio устройства.

Функция waveInClose закрывает открытое устройство ввода:
Код:
function waveInClose(
  hWaveIn: HWAVEIN
  ): MMRESULT; stdcall;




hWaveIn - идентификатор открытого устройства;

MMRESULT может принимать следующие значения:
MMSYSERR_NOERROR нет ошибок;
MMSYSERR_ALLOCATED указанный ресурс уже выделен;
MMSYSERR_BADDEVICEID указанный идентификатор устройства вне диапазона;
MMSYSERR_NODRIVER отсутствует драйвер устройства;
MMSYSERR_NOMEM невозможно выделить или зафиксировать блок памяти;
WAVERR_BADFORMAT попытка открытия с неподдерживаемым форматом данных;
MMSYSERR_INVALHANDLE параметром является недопустимый идентификатор;
WAVERR_STILLPLAYING указанный буфер все еще в очереди;
WAVERR_UNPREPARED буфер не был подготовлен;



Пример реализации описанного в статье механизма (Delphi 3) Вы можете скачать здесь (17.7 K)
http://delphiworld.narod.ru/base/archives/rec.zip


Последний раз редактировалось: Gruz (Пт Дек 16, 2011 11:05 am), всего редактировалось 3 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rasty
Crackpot
цитировать



Репутация: +89/–10    

Зарегистрирован: 23.05.2006
Сообщения: 24386

Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 11:01 am    Заголовок сообщения: Re: Вопросы-Ответы [различные проблемы с компом] Ответить с цитатой

Gruz писал(а):
Пишем всякие компьютерные ситуации, проблемы,
которые у вас были/есть или намечаются,
а так же их возможные решения.


В категории Цифровые технологии есть тема Вопросы по PC и другое

Но раз уж тема в программировании, то вот мой первый вопрос. Как усовершенствовать буфер обмена в Win XP SP1? Чтобы вся копируемая текстовая информация не стирала предыдущую информацию а добавлялась в конец с переносом строки?

С февраля с блокнотом мучаюсь, когда сайт заполняю.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rasty
Crackpot
цитировать



Репутация: +89/–10    

Зарегистрирован: 23.05.2006
Сообщения: 24386

Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 11:03 am    Заголовок сообщения: Ответить с цитатой

Delphi
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rasty
Crackpot
цитировать



Репутация: +89/–10    

Зарегистрирован: 23.05.2006
Сообщения: 24386

Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 11:21 am    Заголовок сообщения: Ответить с цитатой

А может хрен с ним, на Делфи перебраться. Дался мне тот c++
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
цитировать

Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 11:34 am    Заголовок сообщения: Ответить с цитатой

новую прогу написать?
Вот, может ты это имеешь ввиду?

"Необходимо из одного документа скопировать двадцать отрывков в другой документ. Чтобы это сделать, придется двадцать раз повторить вышеперечисленные три пункта.
Было бы намного удобнее сначала скопировать сразу все отрывки в буфер, а затем один раз перейдя в другой документ поместить туда эти отрывки.

Стандартный буфер обмена Windows этого делать не умеет. Зато это умеют специальные программы - менеджеры буфера обмена.

Программ, позволяющих восстанавливать из буфера обмена множество занесенных в него данных, существует много. Я не буду делать обзор этих программ, а возьму на себя смелость и представлю вам только одну из них – бесплатную и русскоязычную.

Это программа CLCL 1.1.2, скачать которую можно здесь.
http://www.chaynikam.net/counter/counter.php?book=26

CLCL — простая программа (даже не требующая установки) для восстановления данных из буфера обмена. Она находится в системном трее (правый нижний угол экрана) и сохраняет в свой журнал занесенные в буфер обмена текстовые и графические фрагменты. Таких фрагментов может быть очень много и при необходимости любой из них можно вставить в документ, выбрав его из списка. Кроме этого существует ряд других настроек программы, с которыми думаю, вы сможете без труда разобраться самостоятельно."
http://www.chaynikam.net/view_articles.php?id=11
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
цитировать

Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 11:35 am    Заголовок сообщения: Ответить с цитатой

Точняк!
Все равно восн на API и то, и другое работает, а скорость почти одинакова
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rasty
Crackpot
цитировать



Репутация: +89/–10    

Зарегистрирован: 23.05.2006
Сообщения: 24386

Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 11:44 am    Заголовок сообщения: Re: Waveform Audio Win32 API Ответить с цитатой

CLCL 1.1.2. Попробую

Gruz писал(а):
Точняк!
Все равно восн на API и то, и другое работает, а скорость почти одинакова


Program q; Begin End Все это вгоняет меня в депрессию

Gruz писал(а):

Код:

          Memo.Lines.Add(modes[j].descr);
      end;
    end;
  end;
end;


Кстати, перед end, until и else ставить оператор ; незачем.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
цитировать

Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 11:48 am    Заголовок сообщения: Ответить с цитатой

Согласен, но уже автоматически не замечаю.
може сначала использовать скобки { } а потом Поиск-Замена на Begin End? Или через дополнительную прогу?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rasty
Crackpot
цитировать



Репутация: +89/–10    

Зарегистрирован: 23.05.2006
Сообщения: 24386

Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 11:51 am    Заголовок сообщения: Re: Waveform Audio Win32 API Ответить с цитатой

Gruz писал(а):
В контексте нашей тематики под этим термином подразумевается такой способ кодирования данных, при котором каждая выборка (отсчет), произведенная аналого-цифровым преобразователем (здесь - в смысле звуковой карты), представляется в памяти в виде числа, пропорционального по своему значению мгновенной величине сигнала в момент выборки.


Вот где-то с этого момента нихрена не понятно. Что это за число такое. Куда это число попадает? В массив или в переменную какую-то? Как из этого числа получить частоту и интенсивность звука?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
цитировать

Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 12:01 pm    Заголовок сообщения: Ответить с цитатой

Слишком мудренно объясняют, насколько я понял это величина звука, слово, т. е. или Integer или Word.
Частота выборки стандартная 44100 в сек (+ стерео канал).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rasty
Crackpot
цитировать



Репутация: +89/–10    

Зарегистрирован: 23.05.2006
Сообщения: 24386

Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 12:02 pm    Заголовок сообщения: Ответить с цитатой

Gruz писал(а):
Согласен, но уже автоматически не замечаю.
може сначала использовать скобки { } а потом Поиск-Замена на Begin End? Или через дополнительную прогу?




Помню, что в универе у нас самые популярные вопросы были: "Где находится модуль graph.tpu" и "Почему у меня модуль graph.tpu находится в папке units, но компилятор его все равно не видит?". Первый вопрос можно было решить, а вот второй был нерешаемым - приходилось пересаживаться на другой комп и там программировать в TP.

А вот в basic там все просто было. Не надо было искать этот графический модуль, подключать его в "uses graph;". Написал pset(100, 100),rgb и все работает.

Код:
10 FOR I=0 TO 100
20 PSET (I,I)
30 NEXT


Кстати, а как в Delphi работать с графическими примитивами? Нарисовать линию, или точку.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rasty
Crackpot
цитировать



Репутация: +89/–10    

Зарегистрирован: 23.05.2006
Сообщения: 24386

Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 12:05 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
в виде числа

Gruz писал(а):
Word.




Gruz писал(а):
Частота выборки стандартная 44100 в сек (+ стерео канал).


Не догоняю. 44100 в сек - это сколько герц?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
цитировать

Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 12:16 pm    Заголовок сообщения: Ответить с цитатой

плоховато объясняю, но общая схема приблизительно такая:
инициализируем устройство (задаем параметры разные, в том числе и в каком типе производить запись)
создаем буфер, и передаем указатель в ф-цию записи
тут момент, что буфер может заполнится, до того как мы произведем какие-то действия с данными, ведь запись в него идет в отдельном процессе, так что рассчитываем длину буфера где то в 10-15 сек.
корректно закрываем устройство (иначе могут быть глюки)

44100 -- это массив типа Int (word), из 44100 елементов (+еще один канал, если нужно стерео) -- по иксу время, по Y -- уровень сигнала (громкость)

44100 гц -- соотв от 0 до 44 кгц -- очень достаточно для передачи всего диапазона звуков, каждый раз в 1 сек записывается в буфер это кол-во информации, в соответствии с параметрами инициализации, которые мы задали.

зы -- можно проиграть этот буфер и за 2 сек, тогда соотв частота понизится.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
цитировать

Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Пт Дек 16, 2011 12:21 pm    Заголовок сообщения: Ответить с цитатой

через объект Canvas -- все то же самое -- Line(x1, y1, x2, y2)
точки
Canvas.pixels[x,y]:=RGB(0,0,0);
круги соотв и т д.

или через класс Image, да хоть через API )))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Имя
Сообщение

Смайлики
Дополнительные смайлики

 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Форум -> Наука и технологии Часовой пояс: GMT
На страницу 1, 2, 3 ... 11, 12, 13  След.
Страница 1 из 13

 
Перейти:  
Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB