Установка скорости записи с помощью IMAPI2 - PullRequest
4 голосов
/ 11 апреля 2011

Кто-нибудь знает, как установить скорость записи CD / DVD (например, 4x, 10x) с помощью IMAPI2?

Кроме того, сначала мне нужно получить скорости, поддерживаемые носителем.Как я могу получить их?

Ответы [ 2 ]

1 голос
/ 14 ноября 2013
  1. Чтобы установить скорость записи, вы можете использовать метод IDiscFormat2Data :: SetWriteSpeed ​​ из интерфейса IDiscFormat2Data . Он позволяет запрашивать максимальную скорость, поддерживаемую оптическим носителем, или указывать требуемую скорость записи.

  2. Чтобы получить поддерживаемые скорости записи для записывающего устройства и текущего носителя, вы можете использовать метод IDiscFormat2Data :: get_SupportedWriteSpeeds

  3. Чтобы проверить текущую скорость записи, у вас есть метод IDiscFormat2Data :: get_CurrentWriteSpeed ​​.



Эти методы используют секторы в секунду вместо 4x, 10x и т. Д. Вы можете конвертировать из одного в другой, используя следующие константы:

  • IMAPI_SECTOR_SIZE Количество байтов в секторе.
  • IMAPI_SECTORS_PER_SECOND_AT_1X_CD Базовая скорость вращения диска, измеренная в секторах в секунду.
  • IMAPI_SECTORS_PER_SECOND_AT_1X_DVD Базовая скорость вращения DVD, измеренная в секторах в секунду.
  • IMAPI_SECTORS_PER_SECOND_AT_1X_BD Базовая скорость вращения диска Blu-ray, измеренная в секторах в секунду.

из заголовка imapi2.h:

#define IMAPI_SECTORS_PER_SECOND_AT_1X_CD      75
#define IMAPI_SECTORS_PER_SECOND_AT_1X_DVD     680
#define IMAPI_SECTORS_PER_SECOND_AT_1X_BD      2195
#define IMAPI_SECTORS_PER_SECOND_AT_1X_HD_DVD  4568
0 голосов
/ 07 марта 2019

Microsoft первоначально выпустила интерфейс IMAPI для C #.У него было много проблем.Вы можете прочитать больше об этом здесь .Поэтому я использую этот исходный код (написанный Эриком Хадданом для Code Project) вместо копии, выпущенной Microsoft.Таким образом, вы можете увидеть некоторые отличия в отношении документации.

Прежде чем вы начнете взаимодействовать со скоростью записи (получить / установить), вам нужно выполнить некоторые начальные действия, такие как настройка рекордера.Я предполагаю, что вы знаете все это и пропускаете это в этом ответе, чтобы сократить длину.

Чтобы установить скорость записи, вам необязательно сначала получить поддерживаемые скорости записи:

private string[] GetSupportedWriteSpeeds()
{
    string[] list = new string[msftDiscFormat2Data.SupportedWriteSpeedDescriptors.Length];
    for(int i = 0; i < msftDiscFormat2Data.SupportedWriteSpeedDescriptors.Length; i++)
    {
        IWriteSpeedDescriptor objIWriteSpeedDescriptor = (IWriteSpeedDescriptor)msftDiscFormat2Data.SupportedWriteSpeedDescriptors[i];
        list[i] = objIWriteSpeedDescriptor.WriteSpeed.ToString();
    }
    return list;
}

Затем, основываясь на полученных выше поддерживаемых значениях, вы можете установить скорость записи:

private void SetWriteSpeed(int requestedSectorsPerSecond, bool rotationTypeIsPureCAV)
{
    /*selectedWritingSpeed
        Unit = Disc sectors per second.
        Values: -
        -1 = "Default OR Fastest" as documented in IMAPI documentation.
        [ANY VALUE] = Actual writing speed to set.
    */
    msftDiscFormat2Data.SetWriteSpeed(requestedSectorsPerSecond, rotationTypeIsPureCAV);
}

В указанном выше методе параметр requestedSectorsPerSecond - это индекс массива строк (скорость записи), который вы получили из предыдущего метода.Вы можете установить тип вращения (чистый CAV) на false.

Следующее от Microsoft :

RequestedSectorsPerSecond

Запрошеноскорость записи измеряется в секторах диска в секунду.

Значение 0xFFFFFFFF (-1) запрашивает, чтобы запись осуществлялась с использованием самой быстрой поддерживаемой скорости для носителя.Это значение по умолчанию.

RotationTypeIsPureCAV

Требуемый тип управления скоростью вращения.Установите значение VARIANT_TRUE, чтобы запросить тип управления скоростью вращения с постоянной угловой скоростью (CAV).Установите VARIANT_FALSE, чтобы использовать другой тип управления скоростью вращения, который поддерживает рекордер.По умолчанию используется VARIANT_FALSE.

Имена объектов, использованных в приведенном выше коде, соответствуют самому IMAPI.Вот почему я не добавляю больше описания об интерфейсе IMAPI.Более подробную информацию уже дает другой ответ от @ rmp.

...