Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с памятью, Не у меня... а у программы :) 
V
    Опции темы
GuManOiD
  Дата 15.2.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

Репутация: нет
Всего: нет



Написал следующего содержания класс:
Код

unit WaveFormStream;

interface

uses SysUtils, Classes, MMSystem, Dialogs;

const
  ChunkIDSize = 4;
  RIFF_SIGNATURE = 'RIFF';
  WAVE_SIGNATURE = 'WAVE';

type
  TWaveChunkID = array [1..ChunkIDSize] of Char;

  TWaveHeader = record
    RIFF : TWaveChunkID;  //MUST BE "RIFF"
    FileSize : Cardinal;
    WAVE : TWaveChunkID;  //MUST BE "WAVE"
  end;

  TWaveChunkHeader = record
    ChunkID : TWaveChunkID;
    ChunkSize : Cardinal;
  end;

  TWaveData = array of Byte;

  TWaveFormStream = class(TMemoryStream)
    constructor Create;
    destructor Destroy; override;

    private
      FChecked : Boolean;
      FReaded : Boolean;
      FDataPosition : Int64;
      FDataSize : Cardinal;
      FFmtPosition : Int64;
      function IsWave : Boolean;
    public
      WaveHeader : TWaveHeader;
      WaveFormatChunk : TWaveData;

      function ReadWave : Boolean;
      function SendDataBlockTo (ADest : TStream) : Int64;
  end;

implementation

constructor TWaveFormStream.Create;
begin
  inherited Create;
  FChecked := False;
  FReaded := False;
end;

destructor TWaveFormStream.Destroy;
begin
  if Assigned(WaveFormatChunk) then
    FreeMem(WaveFormatChunk);
end;

function TWaveFormStream.SendDataBlockTo (ADest : TStream) : Int64;
begin
  Seek(FDataPosition, soFromBeginning);
  Result := ADest.CopyFrom((Self as TWaveFormStream), FDataSize);
end;

function TWaveFormStream.ReadWave : Boolean;
var
  bufChunkHeader : TWaveChunkHeader;
  OldPosition : Int64;
begin
  Result := False;

  if IsWave then begin
    FillChar(bufChunkHeader, SizeOf(bufChunkHeader), 0);
    { BEGIN LOOP: SEARCHING READING CHUNKS }
    repeat
      Seek(bufChunkHeader.ChunkSize, soFromCurrent);
      OldPosition := Position+SizeOf(bufChunkHeader);

      ReadBuffer(bufChunkHeader,SizeOf(bufChunkHeader));

      if bufChunkHeader.ChunkID = 'fmt ' then begin
        FFmtPosition := Position;
        GetMem(WaveFormatChunk, bufChunkHeader.ChunkSize);
        ReadBuffer(WaveFormatChunk, bufChunkHeader.ChunkSize);
        Seek(OldPosition, soFromBeginning);
      end else if bufChunkHeader.ChunkID = 'data' then begin
        FDataPosition := Position;
        FDataSize := bufChunkHeader.ChunkSize;
        Break;
      end;

    until false;
    { END LOOP: SEARCHING READING CHUNKS }
    FReaded := True;
    Result := True;
  end;
end;

function TWaveFormStream.IsWave : Boolean;
begin
  Result := False;

  ReadBuffer(WaveHeader, SizeOf(WaveHeader));
  with WaveHeader do
    if (WAVE <> WAVE_SIGNATURE) or (RIFF <> RIFF_SIGNATURE) then
      Exit;

  FChecked := True;
  Result := True;
end;

end.


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

Долго думал о том в какой раздел поместить (Звук или Общие), но пришел к тому, что вопрос больше общий... к звуку относится только цель написания.

Так вот проблема в следующем:
При попытке чтения некоторых WAVE с форматом аудио не PCM (например Mpeg Layer-3) на строке
Код

if bufChunkHeader.ChunkID = 'fmt ' then

на 2-м прохождении цикла, вываливается с Access vialation at adress XXXXxXXXX, write of adress XXXXxXXXX
PM MAIL   Вверх
Alexeis
Дата 16.2.2007, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



строки 
87-88
Код

        GetMem(WaveFormatChunk, bufChunkHeader.ChunkSize);
        ReadBuffer(WaveFormatChunk, bufChunkHeader.ChunkSize);

ReadBuffer - принимает не указатель на память а переменную произвольного типа т.е. будет верно

ReadBuffer(WaveFormatChunk^, bufChunkHeader.ChunkSize);

Кстати я писал почти такой же модуль вот темка http://forum.vingrad.ru/index.php?showtopic=89826






--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GuManOiD
Дата 16.2.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

Репутация: нет
Всего: нет



Спасибо 
Я спутал, TWaveData = Pointer
+ ReadBuffer как ты и сказал

Цитата

Кстати я писал почти такой же модуль вот темка http://forum.vingrad.ru/index.php?showtopic=89826


1. Я принципиально не смотрю чужой код и примеры (изобретаю велик в общем smile)
2. Мне не требуется содержание структур Wave, важны только сами блоки в файле для воспроизведения

Это сообщение отредактировал(а) GuManOiD - 16.2.2007, 16:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.