loopback_device

回环设备(loop-backdevices)

回环设备('loopback device')允许用户以一个普通磁盘文件虚拟一个块设备。设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。(当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你这样使用一个普通文件。

回环设备以/dev/loop0、/dev/loop1等命名。每个设备可虚拟一个块设备。注意只有超级用户才有权限设置回环设备。

回环设备的使用与其它任何块设备相同。特别是,你可以在这个设备上创建文件系统并像普通的磁盘一样将它挂载在系统中。这样的一个将全部内容保存在一个普通文件中的文件系统,被称为虚拟文件系统(virtual file system)(译者注:这个用法并不常见。VFS 通常另有所指,如指代 Linux 内核中有关文件系统抽象的代码层次等)。

可以通过下列步骤创建一个虚拟文件系统并通过回环设备挂载:

创建一个用于承载虚拟文件系统的空文件。这个文件的大小将成为挂载后文件系统的大小。
创建指定大小文件的简单方法是通过 dd 命令。这个命令以块为单位(通常为 512 字节)从一个文件向另一个文件复制数据。/dev/zero 文件则是一个很好的数据来源。
要建立一个 10 MB 大的名为 disk-image 的文件可以通过以下命令:
% dd if=/dev/zeroof=/tmp/disk-image count=20480

20480+0 records in
20480+0 records out
% ls -l/tmp/disk-image
-rw-rw----    1 root      root      10485760 Mar   8 01:56 /tmp/disk-image
这个新建立的文件被填满了 0 字节。在挂载之前,必须在其上建立一个文件系统。这个过程会建立许多用于组织和存储文件的控制单元并构造根目录结构。
在这个磁盘映像之上可以构建任何类型的文件系统。以创建 ext2 文件系统为例(ext2 是 Linux 系统中最常见的文件系统),用 mke2fs 可以完成这个操作。因为这个命令通常是针对块设备进行操作,当对一个普通文件操作时它会要求确认:
% mke2fs -q/tmp/disk-image

mke2fs 1.18,11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
disk-image is not ablock special device.
Proceed anyway?(y,n) y
这里 -q 参数用于省略输出有关新建立文件系统的概要信息。如果你想看到这些信息,则请省略这个参数。
现在disk-image 文件包含了一个新建立的文件系统,正如一个被刚刚初始化完毕的 10 MB 大小的磁盘。
以一个环回设备挂载这个文件系统。方法是使用 mount 命令,指定磁盘文件为被挂载的设备。同时指定 loop=loopback-device 作为 -o 选项的参数,告诉 mount 命令使用哪个回环设备。
下面例子中的命令可用于挂载我们的 disk-image 文件系统。要记住的是只有超级用户可以使用环回设备。第一个命令将创建一个目录 /tmp/virtual-fs,这个目录将被用于挂载我们的文件系统。
% mkdir /tmp/virtual-fs

% mount -oloopback=/dev/loop0 /tmp/disk-image /tmp/virtual-fs
这时,这个设备应该已经被挂载,就如同一个普通的 10M 空间的磁盘一样。
% df -h/tmp/virtual-fs

Filesystem  Size Used Avail Use% Mounted on
/tmp/disk-image9.7M 13k 9.2M 0% /tmp/virtual-fs
你可以向任何其它磁盘一样使用这个设备:
% cd /tmp/virtual-fs

% echo 'Hello,world!' > test.txt
% ls -l
total 19
drwxr-xr-x2   root root 12288 Mar 8 02:00 lost+found
-rw-rw----1   root root     14 Mar 8 02:12 test.txt
% cat test.txt
Hello, world!
请注意lost+found 是一个由 mke2fs自动建立的文件夹一旦文件系统被破坏,部分数据被回复但没有与任何文件关联起来,将被放置在这个文件夹中。。
结束使用后,卸载这个文件系统:
% cd /tmp

% umount/tmp/virtual-fs
你可以删除disk-image,或者之后再次挂载并使用其中的文件。你甚至可以将这个文件复制到远程主机并在那里挂载、使用——文件系统的内容完全不会受到影响。
除了从新创建一个文件系统,还可以从一个现有的文件系统复制而得到一份映像。例如,可以通过普通的复制操作为一个 CD-ROM 创建一份映像。

如果系统中有一个 IDE 接口的 CD-ROM 驱动器,使用前面说过的设备名如 /dev/hda。如果 CD-ROM 是 SCSI 接口的话,设备文件名可能是 /dev/scd0 之类。系统中也可能包含一个符号链接 /dev/cdrom 指向实际的光驱。请参考 /etc/fstab (译者注: 手册)查看系统实际使用的光驱对应的设备。

接下来要做的仅仅是将这个设备复制为一个文件——得到的文件将是被存在硬盘上的、这个 CD-ROM 内容的完整映像。例如:

% cp /dev/cdrom/tmp/cdrom-image

取决于设备的速度和 CD-ROM的容量,这个操作可能需要几分钟的时间。最终的文件将会相当大,它的体积与这个 CD-ROM 的容量相同。

这时,你可以在系统中挂载这个光盘而无须插入原始的 CD-ROM 盘片。要挂载在 /mnt/cdrom 目录下:

mount -oloopback=/dev/loop0 /tmp/cdrom-image /mnt/cdrom

因为映像位于磁盘上,这个文件系统的速度将远胜于直接挂载自实际光驱的时候。请注意多数光盘使用的文件系统类型都是   iso9660

if (param.get(keySET_LOOPBACK_TYPE, value_str) == NO_ERROR) { param.remove(keySET_LOOPBACK_TYPE); // parse format like "SET_LOOPBACK_TYPE=1" / "SET_LOOPBACK_TYPE=1+0" int type_value = NO_LOOPBACK; int device_value = -1; sscanf(value_str.string(), "%d,%d", &type_value, &device_value); ALOGD("type_value = %d, device_value = %d", type_value, device_value); const loopback_t loopback_type = (loopback_t)type_value; loopback_output_device_t loopback_output_device; if (loopback_type == NO_LOOPBACK) { // close loopback ALOGD("%s(), %dL", __FUNCTION__, __LINE__); LoopbackManager::GetInstance()->SetLoopbackOff(); } else { // open loopback if (device_value == LOOPBACK_OUTPUT_RECEIVER || device_value == LOOPBACK_OUTPUT_EARPHONE || device_value == LOOPBACK_OUTPUT_SPEAKER) { // assign output device loopback_output_device = (loopback_output_device_t)device_value; } else { // not assign output device if (mStreamManager->getDeviceConnectionState(initDeviceVector(AUDIO_DEVICE_OUT_WIRED_HEADSET)) == true || mStreamManager->getDeviceConnectionState(initDeviceVector(AUDIO_DEVICE_OUT_WIRED_HEADPHONE)) == true) { loopback_output_device = LOOPBACK_OUTPUT_EARPHONE; } else if (bForceUseLoudSpeakerInsteadOfReceiver == true) { loopback_output_device = LOOPBACK_OUTPUT_SPEAKER; } else { loopback_output_device = LOOPBACK_OUTPUT_RECEIVER; } } ALOGE("loopback_type =777777777777_dddddd %d, loopback_output_device = %d", loopback_type , loopback_output_device); LoopbackManager::GetInstance()->SetLoopbackOn(loopback_type, loopback_output_device); } } 这是我的回环开始代码,我后面将给你后续的代码,你先别慌分析,先记下来
09-21
代码的意思是把AUDIO_DEVICE_LIST_DEF(V)替换为 AUDIO_DEVICE_LIST_UNIQUE_DEF(V) \ V(AUDIO_DEVICE_OUT_AUX_DIGITAL, AUDIO_DEVICE_OUT_HDMI) \ V(AUDIO_DEVICE_OUT_STUB, AUDIO_DEVICE_OUT_DEFAULT) \ V(AUDIO_DEVICE_IN_VOICE_CALL, AUDIO_DEVICE_IN_TELEPHONY_RX) \ V(AUDIO_DEVICE_IN_AUX_DIGITAL, AUDIO_DEVICE_IN_HDMI) \ V(AUDIO_DEVICE_IN_STUB, AUDIO_DEVICE_IN_DEFAULT) 其中#define AUDIO_DEVICE_LIST_UNIQUE_DEF(V) \ V(AUDIO_DEVICE_NONE, 0x0u) \ V(AUDIO_DEVICE_OUT_EARPIECE, 0x1u) \ V(AUDIO_DEVICE_OUT_SPEAKER, 0x2u) \ V(AUDIO_DEVICE_OUT_WIRED_HEADSET, 0x4u) \ V(AUDIO_DEVICE_OUT_WIRED_HEADPHONE, 0x8u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_SCO, 0x10u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET, 0x20u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, 0x40u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP, 0x80u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, 0x100u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, 0x200u) \ V(AUDIO_DEVICE_OUT_HDMI, 0x400u) \ V(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET, 0x800u) \ V(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET, 0x1000u) \ V(AUDIO_DEVICE_OUT_USB_ACCESSORY, 0x2000u) \ V(AUDIO_DEVICE_OUT_USB_DEVICE, 0x4000u) \ V(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, 0x8000u) \ V(AUDIO_DEVICE_OUT_TELEPHONY_TX, 0x10000u) \ V(AUDIO_DEVICE_OUT_LINE, 0x20000u) \ V(AUDIO_DEVICE_OUT_HDMI_ARC, 0x40000u) \ V(AUDIO_DEVICE_OUT_HDMI_EARC, 0x40001u) \ V(AUDIO_DEVICE_OUT_SPDIF, 0x80000u) \ V(AUDIO_DEVICE_OUT_FM, 0x100000u) \ V(AUDIO_DEVICE_OUT_AUX_LINE, 0x200000u) \ V(AUDIO_DEVICE_OUT_SPEAKER_SAFE, 0x400000u) \ V(AUDIO_DEVICE_OUT_IP, 0x800000u) \ V(AUDIO_DEVICE_OUT_BUS, 0x1000000u) \ V(AUDIO_DEVICE_OUT_PROXY, 0x2000000u) \ V(AUDIO_DEVICE_OUT_USB_HEADSET, 0x4000000u) \ V(AUDIO_DEVICE_OUT_HEARING_AID, 0x8000000u) \ V(AUDIO_DEVICE_OUT_ECHO_CANCELLER, 0x10000000u) \ V(AUDIO_DEVICE_OUT_BLE_HEADSET, 0x20000000u) \ V(AUDIO_DEVICE_OUT_BLE_SPEAKER, 0x20000001u) \ V(AUDIO_DEVICE_OUT_BLE_BROADCAST, 0x20000002u) \ V(AUDIO_DEVICE_OUT_DEFAULT, AUDIO_DEVICE_BIT_DEFAULT) \ V(AUDIO_DEVICE_IN_COMMUNICATION, AUDIO_DEVICE_BIT_IN | 0x1u) \ V(AUDIO_DEVICE_IN_AMBIENT, AUDIO_DEVICE_BIT_IN | 0x2u) \ V(AUDIO_DEVICE_IN_BUILTIN_MIC, AUDIO_DEVICE_BIT_IN | 0x4u) \ V(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_BIT_IN | 0x8u) \ V(AUDIO_DEVICE_IN_WIRED_HEADSET, AUDIO_DEVICE_BIT_IN | 0x10u) \ V(AUDIO_DEVICE_IN_HDMI, AUDIO_DEVICE_BIT_IN | 0x20u) \ V(AUDIO_DEVICE_IN_TELEPHONY_RX, AUDIO_DEVICE_BIT_IN | 0x40u) \ V(AUDIO_DEVICE_IN_BACK_MIC, AUDIO_DEVICE_BIT_IN | 0x80u) \ V(AUDIO_DEVICE_IN_REMOTE_SUBMIX, AUDIO_DEVICE_BIT_IN | 0x100u) \ V(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET, AUDIO_DEVICE_BIT_IN | 0x200u) \ V(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET, AUDIO_DEVICE_BIT_IN | 0x400u) \ V(AUDIO_DEVICE_IN_USB_ACCESSORY, AUDIO_DEVICE_BIT_IN | 0x800u) \ V(AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_DEVICE_BIT_IN | 0x1000u) \ V(AUDIO_DEVICE_IN_FM_TUNER, AUDIO_DEVICE_BIT_IN | 0x2000u) \ V(AUDIO_DEVICE_IN_TV_TUNER, AUDIO_DEVICE_BIT_IN | 0x4000u) \ V(AUDIO_DEVICE_IN_LINE, AUDIO_DEVICE_BIT_IN | 0x8000u) \ V(AUDIO_DEVICE_IN_SPDIF, AUDIO_DEVICE_BIT_IN | 0x10000u) \ V(AUDIO_DEVICE_IN_BLUETOOTH_A2DP, AUDIO_DEVICE_BIT_IN | 0x20000u) \ V(AUDIO_DEVICE_IN_LOOPBACK, AUDIO_DEVICE_BIT_IN | 0x40000u) \ V(AUDIO_DEVICE_IN_IP, AUDIO_DEVICE_BIT_IN | 0x80000u) \ V(AUDIO_DEVICE_IN_BUS, AUDIO_DEVICE_BIT_IN | 0x100000u) \ V(AUDIO_DEVICE_IN_PROXY, AUDIO_DEVICE_BIT_IN | 0x1000000u) \ V(AUDIO_DEVICE_IN_USB_HEADSET, AUDIO_DEVICE_BIT_IN | 0x2000000u) \ V(AUDIO_DEVICE_IN_BLUETOOTH_BLE, AUDIO_DEVICE_BIT_IN | 0x4000000u) \ V(AUDIO_DEVICE_IN_HDMI_ARC, AUDIO_DEVICE_BIT_IN | 0x8000000u) \ V(AUDIO_DEVICE_IN_HDMI_EARC, AUDIO_DEVICE_BIT_IN | 0x8000001u) \ V(AUDIO_DEVICE_IN_ECHO_REFERENCE, AUDIO_DEVICE_BIT_IN | 0x10000000u) \ V(AUDIO_DEVICE_IN_BLE_HEADSET, AUDIO_DEVICE_BIT_IN | 0x20000000u) \ V(AUDIO_DEVICE_IN_DEFAULT, AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT)
07-05
enum { 214 AUDIO_DEVICE_NONE = 0x0u, 215 AUDIO_DEVICE_BIT_IN = 0x80000000u, 216 AUDIO_DEVICE_BIT_DEFAULT = 0x40000000u, 217 218 AUDIO_DEVICE_OUT_EARPIECE = 0x1u, 219 AUDIO_DEVICE_OUT_SPEAKER = 0x2u, 220 AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4u, 221 AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8u, 222 AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 0x10u, 223 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20u, 224 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40u, 225 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 0x80u, 226 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100u, 227 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200u, 228 AUDIO_DEVICE_OUT_AUX_DIGITAL = 0x400u, 229 AUDIO_DEVICE_OUT_HDMI = 0x400u, // OUT_AUX_DIGITAL 230 AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800u, 231 AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000u, 232 AUDIO_DEVICE_OUT_USB_ACCESSORY = 0x2000u, 233 AUDIO_DEVICE_OUT_USB_DEVICE = 0x4000u, 234 AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 0x8000u, 235 AUDIO_DEVICE_OUT_TELEPHONY_TX = 0x10000u, 236 AUDIO_DEVICE_OUT_LINE = 0x20000u, 237 AUDIO_DEVICE_OUT_HDMI_ARC = 0x40000u, 238 AUDIO_DEVICE_OUT_SPDIF = 0x80000u, 239 AUDIO_DEVICE_OUT_FM = 0x100000u, 240 AUDIO_DEVICE_OUT_AUX_LINE = 0x200000u, 241 AUDIO_DEVICE_OUT_SPEAKER_SAFE = 0x400000u, 242 AUDIO_DEVICE_OUT_IP = 0x800000u, 243 AUDIO_DEVICE_OUT_BUS = 0x1000000u, 244 AUDIO_DEVICE_OUT_PROXY = 0x2000000u, 245 AUDIO_DEVICE_OUT_USB_HEADSET = 0x4000000u, 246 AUDIO_DEVICE_OUT_HEARING_AID = 0x8000000u, 247 AUDIO_DEVICE_OUT_ECHO_CANCELLER = 0x10000000u, 248 AUDIO_DEVICE_OUT_BLE_HEADSET = 0x20000000u, 249 AUDIO_DEVICE_OUT_BLE_SPEAKER = 0x20000001u, 250 AUDIO_DEVICE_OUT_BLE_BROADCAST = 0x20000002u, 251 AUDIO_DEVICE_OUT_STUB = 0x40000000u, 252 AUDIO_DEVICE_OUT_DEFAULT = 0x40000000u, // BIT_DEFAULT 253 254 AUDIO_DEVICE_IN_COMMUNICATION = 0x80000001u, // BIT_IN | 0x1 255 AUDIO_DEVICE_IN_AMBIENT = 0x80000002u, // BIT_IN | 0x2 256 AUDIO_DEVICE_IN_BUILTIN_MIC = 0x80000004u, // BIT_IN | 0x4 257 AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = 0x80000008u, // BIT_IN | 0x8 258 AUDIO_DEVICE_IN_WIRED_HEADSET = 0x80000010u, // BIT_IN | 0x10 259 AUDIO_DEVICE_IN_AUX_DIGITAL = 0x80000020u, // BIT_IN | 0x20 260 AUDIO_DEVICE_IN_HDMI = 0x80000020u, // IN_AUX_DIGITAL 261 AUDIO_DEVICE_IN_VOICE_CALL = 0x80000040u, // BIT_IN | 0x40 262 AUDIO_DEVICE_IN_TELEPHONY_RX = 0x80000040u, // IN_VOICE_CALL 263 AUDIO_DEVICE_IN_BACK_MIC = 0x80000080u, // BIT_IN | 0x80 264 AUDIO_DEVICE_IN_REMOTE_SUBMIX = 0x80000100u, // BIT_IN | 0x100 265 AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = 0x80000200u, // BIT_IN | 0x200 266 AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = 0x80000400u, // BIT_IN | 0x400 267 AUDIO_DEVICE_IN_USB_ACCESSORY = 0x80000800u, // BIT_IN | 0x800 268 AUDIO_DEVICE_IN_USB_DEVICE = 0x80001000u, // BIT_IN | 0x1000 269 AUDIO_DEVICE_IN_FM_TUNER = 0x80002000u, // BIT_IN | 0x2000 270 AUDIO_DEVICE_IN_TV_TUNER = 0x80004000u, // BIT_IN | 0x4000 271 AUDIO_DEVICE_IN_LINE = 0x80008000u, // BIT_IN | 0x8000 272 AUDIO_DEVICE_IN_SPDIF = 0x80010000u, // BIT_IN | 0x10000 273 AUDIO_DEVICE_IN_BLUETOOTH_A2DP = 0x80020000u, // BIT_IN | 0x20000 274 AUDIO_DEVICE_IN_LOOPBACK = 0x80040000u, // BIT_IN | 0x40000 275 AUDIO_DEVICE_IN_IP = 0x80080000u, // BIT_IN | 0x80000 276 AUDIO_DEVICE_IN_BUS = 0x80100000u, // BIT_IN | 0x100000 277 AUDIO_DEVICE_IN_PROXY = 0x81000000u, // BIT_IN | 0x1000000 278 AUDIO_DEVICE_IN_USB_HEADSET = 0x82000000u, // BIT_IN | 0x2000000 279 AUDIO_DEVICE_IN_BLUETOOTH_BLE = 0x84000000u, // BIT_IN | 0x4000000 280 AUDIO_DEVICE_IN_HDMI_ARC = 0x88000000u, // BIT_IN | 0x8000000 281 AUDIO_DEVICE_IN_HDMI_EARC = 0x88000001u, // BIT_IN | 0x8000001 282 AUDIO_DEVICE_IN_ECHO_REFERENCE = 0x90000000u, // BIT_IN | 0x10000000 283 AUDIO_DEVICE_IN_BLE_HEADSET = 0xA0000000u, // BIT_IN | 0x20000000 284 AUDIO_DEVICE_IN_STUB = 0xC0000000u, 285 AUDIO_DEVICE_IN_DEFAULT = 0xC0000000u, // BIT_IN | BIT_DEFAULT 286 };
09-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值